Zum Inhalt

Datenbankschema

Übersicht

Das SolarLog-System verwendet SQLite3 als Datenbank mit einem modularen Schema, das folgende Hauptbereiche abdeckt:

  • Wechselrichter-Konfiguration
  • Scan-Ergebnisse
  • Produktionsdaten
  • Fehlerprotokollierung
  • Systemeinstellungen

Tabellen

1. inverters

Speichert die Konfiguration aller verwalteten Wechselrichter.

CREATE TABLE IF NOT EXISTS inverters (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    manufacturer TEXT NOT NULL,
    model TEXT,
    ip_address TEXT NOT NULL,
    port INTEGER DEFAULT 502,
    location TEXT,
    notes TEXT,
    username TEXT,
    password TEXT,
    protocol TEXT DEFAULT 'modbus_tcp',
    modbus_unit_id INTEGER DEFAULT 1,
    poll_interval INTEGER DEFAULT 300,
    enabled BOOLEAN DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_successful_poll DATETIME,
    UNIQUE(ip_address, port)
);

Felder:

  • id: Eindeutige ID (Auto-Increment)
  • name: Benutzerfreundlicher Name des Wechselrichters
  • manufacturer: Hersteller (SMA, KOSTAL, DELTA, etc.)
  • model: Modellbezeichnung
  • ip_address: IP-Adresse im Netzwerk
  • port: TCP-Port (Standard: 502 für Modbus)
  • location: Standort (z.B. "Garage Dach")
  • notes: Zusätzliche Notizen
  • username: Zugangsdaten (falls erforderlich)
  • password: Passwort (falls erforderlich)
  • protocol: Kommunikationsprotokoll (modbus_tcp, modbus_rtu, http, etc.)
  • modbus_unit_id: Modbus Unit ID (Standard: 1)
  • poll_interval: Abfrageintervall in Sekunden (Standard: 300)
  • enabled: Aktiviert/Deaktiviert
  • created_at: Erstellungsdatum
  • updated_at: Letzte Änderung
  • last_successful_poll: Zeitpunkt der letzten erfolgreichen Abfrage

Indizes: - idx_inverters_ip_address auf ip_address - idx_inverters_enabled auf enabled

2. scan_results

Speichert Ergebnisse von Netzwerk-Scans.

CREATE TABLE IF NOT EXISTS scan_results (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    ip_address TEXT NOT NULL,
    manufacturer TEXT,
    model TEXT,
    ports TEXT,
    device_info TEXT,
    protocol TEXT,
    scan_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    added_to_inverters BOOLEAN DEFAULT 0
);

Felder:

  • id: Eindeutige ID
  • ip_address: Gefundene IP-Adresse
  • manufacturer: Erkannter Hersteller
  • model: Erkanntes Modell/Typ
  • ports: JSON-Array der offenen Ports
  • device_info: Zusätzliche Geräteinformationen (JSON)
  • protocol: Erkanntes Protokoll
  • scan_date: Zeitpunkt des Scans
  • added_to_inverters: Flag, ob bereits als Wechselrichter hinzugefügt

Index: - idx_scan_results_ip auf ip_address

3. production_data

Speichert historische Produktionsdaten.

CREATE TABLE IF NOT EXISTS production_data (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    inverter_id INTEGER NOT NULL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    current_power REAL,
    daily_energy REAL,
    total_energy REAL,
    voltage REAL,
    current REAL,
    frequency REAL,
    temperature REAL,
    status TEXT,
    raw_data TEXT,
    FOREIGN KEY (inverter_id) REFERENCES inverters(id) ON DELETE CASCADE
);

Felder:

  • id: Eindeutige ID
  • inverter_id: Referenz zum Wechselrichter
  • timestamp: Zeitpunkt der Messung
  • current_power: Aktuelle Leistung (W)
  • daily_energy: Tagesenergie (kWh)
  • total_energy: Gesamtenergie (kWh)
  • voltage: Spannung (V)
  • current: Strom (A)
  • frequency: Frequenz (Hz)
  • temperature: Temperatur (°C)
  • status: Status-Text
  • raw_data: Rohdaten (JSON)

Indizes: - idx_production_data_inverter auf inverter_id - idx_production_data_timestamp auf timestamp

4. error_log

Protokolliert Fehler und Probleme.

CREATE TABLE IF NOT EXISTS error_log (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    inverter_id INTEGER,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    error_type TEXT NOT NULL,
    error_message TEXT,
    error_details TEXT,
    resolved BOOLEAN DEFAULT 0,
    FOREIGN KEY (inverter_id) REFERENCES inverters(id) ON DELETE SET NULL
);

Felder:

  • id: Eindeutige ID
  • inverter_id: Referenz zum Wechselrichter (optional)
  • timestamp: Zeitpunkt des Fehlers
  • error_type: Fehlertyp (connection, data, config, etc.)
  • error_message: Fehlermeldung
  • error_details: Detaillierte Informationen (JSON)
  • resolved: Flag für behobene Fehler

Indizes: - idx_error_log_inverter auf inverter_id - idx_error_log_timestamp auf timestamp - idx_error_log_resolved auf resolved

5. settings

Speichert Systemeinstellungen als Key-Value-Paare.

CREATE TABLE IF NOT EXISTS settings (
    key TEXT PRIMARY KEY,
    value TEXT,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Felder:

  • key: Eindeutiger Schlüssel
  • value: Wert (kann JSON sein)
  • updated_at: Letzte Änderung

Trigger

update_inverters_timestamp

Aktualisiert updated_at automatisch bei Änderungen:

CREATE TRIGGER IF NOT EXISTS update_inverters_timestamp 
AFTER UPDATE ON inverters
BEGIN
    UPDATE inverters SET updated_at = CURRENT_TIMESTAMP 
    WHERE id = NEW.id;
END;

update_settings_timestamp

Aktualisiert updated_at automatisch bei Änderungen:

CREATE TRIGGER IF NOT EXISTS update_settings_timestamp 
AFTER UPDATE ON settings
BEGIN
    UPDATE settings SET updated_at = CURRENT_TIMESTAMP 
    WHERE key = NEW.key;
END;

Beziehungen

inverters (1) ----> (n) production_data
    |
    |
    v
error_log (n) <---- (1) inverters

scan_results (independent)
settings (independent)

Erweiterungsmöglichkeiten

Das Schema ist modular aufgebaut und kann einfach erweitert werden:

  1. Neue Tabellen: Für zusätzliche Features (z.B. alerts, reports, users)
  2. Neue Spalten: In bestehenden Tabellen (z.B. inverters.serial_number)
  3. Neue Trigger: Für automatische Aktionen
  4. Views: Für komplexe Abfragen

Migration

Für Schema-Änderungen sollten Migrations-Skripte erstellt werden:

// Beispiel: Migration hinzufügen
db.exec(`
    ALTER TABLE inverters 
    ADD COLUMN serial_number TEXT;
`);

Backup

SQLite-Datenbanken können einfach gesichert werden:

# Backup erstellen
cp data/solarlog.db data/backups/solarlog_$(date +%Y%m%d_%H%M%S).db

# Oder mit SQLite-Tools
sqlite3 data/solarlog.db ".backup 'backup.db'"