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 Wechselrichtersmanufacturer: Hersteller (SMA, KOSTAL, DELTA, etc.)model: Modellbezeichnungip_address: IP-Adresse im Netzwerkport: TCP-Port (Standard: 502 für Modbus)location: Standort (z.B. "Garage Dach")notes: Zusätzliche Notizenusername: 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/Deaktiviertcreated_at: Erstellungsdatumupdated_at: Letzte Änderunglast_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 IDip_address: Gefundene IP-Adressemanufacturer: Erkannter Herstellermodel: Erkanntes Modell/Typports: JSON-Array der offenen Portsdevice_info: Zusätzliche Geräteinformationen (JSON)protocol: Erkanntes Protokollscan_date: Zeitpunkt des Scansadded_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 IDinverter_id: Referenz zum Wechselrichtertimestamp: Zeitpunkt der Messungcurrent_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-Textraw_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 IDinverter_id: Referenz zum Wechselrichter (optional)timestamp: Zeitpunkt des Fehlerserror_type: Fehlertyp (connection, data, config, etc.)error_message: Fehlermeldungerror_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üsselvalue: 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:
- Neue Tabellen: Für zusätzliche Features (z.B.
alerts,reports,users) - Neue Spalten: In bestehenden Tabellen (z.B.
inverters.serial_number) - Neue Trigger: Für automatische Aktionen
- 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: