SQL-Protokollierung

Loggt die Historie von einzelnen Zuständen in einer SQL DB

Aktueller Release
4.1.5
Entwickler
bluefox, Apollon77
Lizenz
MIT

Dieser Adapter speichert den Statusverlauf in einer SQL-Datenbank.

Unterstützt PostgreSQL, MySQL, Microsoft SQL Server und SQLite. Sie können Port 0 beibehalten, wenn der Standardport verwendet werden soll.

Dieser Adapter nutzt die Sentry-Bibliotheken, um Ausnahmen und Codefehler automatisch an die Entwickler zu melden. Weitere Details und Informationen zum Deaktivieren der Fehlerberichterstattung finden Sie in der Sentry-Plugin-Dokumentation . Die Sentry-Berichterstattung wird ab js-controller 3.0 verwendet.

Einstellungen

Verbindungseinstellungen

  • DB-Typ : Typ der SQL-Datenbank: MySQL, PostgreSQL, MS-SQL oder SQLite3
  • Host : IP-Adresse oder Hostname mit SQL Server
  • Port : Port des SQL-Servers (bei Unsicherheit leer lassen)
  • Datenbankname : Datenbankname. Standardmäßig iobroker
  • Benutzer : Benutzername für SQL. Muss in der Datenbank vorhanden sein.
  • Passwort : Passwort für SQL.
  • Passwortbestätigung : Bitte wiederholen Sie hier Ihr Passwort.
  • Verschlüsseln : Einige Datenbanken unterstützen Verschlüsselung.
  • Runde die Zahl auf : Anzahl der Ziffern nach dem Komma.
  • Parallele Anfragen zulassen : Gleichzeitige SQL-Anfragen an die Datenbank zulassen.
  • Datenbank nicht erstellen : Aktivieren Sie diese Option, wenn bereits eine Datenbank erstellt wurde (z. B. vom Administrator) und der ioBroker-Benutzer nicht über ausreichende Rechte zum Erstellen einer Datenbank verfügt.

Standardeinstellungen

  • Entprellzeit – Schutz vor instabilen Werten, um sicherzustellen, dass nur stabile Werte protokolliert werden, wenn sich der Wert innerhalb der definierten Millisekunden nicht geändert hat. ACHTUNG: Ändern sich die Werte häufiger als in dieser Einstellung festgelegt, wird kein Wert protokolliert (da jeder Wert instabil ist).
  • Blockzeit – Definiert, wie lange nach dem Speichern des letzten Werts kein weiterer Wert gespeichert wird. Nach Ablauf der angegebenen Zeit in Millisekunden wird der nächste Wert protokolliert, der alle anderen Bedingungen erfüllt.
  • Nur Änderungen protokollieren – Diese Funktion stellt sicher, dass nur geänderte Werte protokolliert werden, sofern sie weitere Prüfungen bestehen (siehe unten). Gleiche Werte werden nicht protokolliert.
  • Die gleichen Werte (Sekunden) werden weiterhin protokolliert – Bei Verwendung von „Nur Änderungen protokollieren“ können Sie hier ein Zeitintervall in Sekunden festlegen, nach dem auch unveränderte Werte erneut in der Datenbank protokolliert werden. Die vom Adapter erneut protokollierten Werte können Sie im Feld „von“ erkennen.
  • Minimale Abweichung vom letzten Wert – Bei der Option „Nur Änderungen aufzeichnen“ können Sie die erforderliche minimale Abweichung zwischen dem neuen Wert und dem letzten Wert festlegen. Wird diese Abweichung nicht erreicht, wird der Wert nicht aufgezeichnet.
  • Nullwerte ignorieren (==0) - Sie können festlegen, ob Nullwerte ignoriert werden sollen.
  • Werte unter Null ignorieren (<0) - Sie können festlegen, ob Werte unter Null ignoriert werden sollen.
  • Deaktivierung der optimierten Protokollierung übersprungener Werte für die Diagrammerstellung – Standardmäßig versucht der Adapter, die Werte für die optimierte Diagrammerstellung zu erfassen. Dies kann bedeuten, dass zusätzliche Werte (die z. B. nicht alle oben genannten Prüfungen erfüllt haben) automatisch protokolliert werden. Wenn dies nicht gewünscht ist, können Sie diese Funktion deaktivieren.
  • Alias-ID – Sie können einen Alias für die ID definieren. Dies ist hilfreich, wenn Sie ein Gerät gewechselt haben und eine kontinuierliche Datenprotokollierung wünschen. Bitte erwägen Sie zukünftig die Verwendung echter Alias-Status!
  • Speicherdauer – Wie viele Werte aus der Vergangenheit auf der Festplatte gespeichert werden. Daten werden gelöscht, sobald die festgelegte Zeit erreicht ist und neue Daten für einen Datenpunkt gespeichert werden sollen.
  • Maximale Anzahl im RAM speichern – Legen Sie fest, wie viele Werte im RAM gespeichert werden, bevor sie auf der Festplatte abgelegt werden. Sie können so den Umfang der E/A-Operationen steuern.
  • Erweiterte Debug-Protokolle für den Datenpunkt aktivieren – Wenn Sie detailliertere Protokolle für diesen Datenpunkt anzeigen möchten, können Sie diese Option aktivieren. Sie müssen weiterhin den Protokollierungsgrad „Debug“ aktivieren, damit diese zusätzlichen Werte sichtbar sind! Dies hilft bei der Fehlersuche oder beim Verständnis, warum der Adapter einen Wert protokolliert (oder nicht).

Die meisten dieser Werte können in den Instanzeinstellungen vordefiniert werden und werden dann vorausgefüllt oder für den Datenpunkt verwendet.

Tipps zur Datenbankinstallation

MS-SQL:

Verwendenlocalhost\instance Prüfen Sie auf dem Host, ob TCP/IP-Verbindungen aktiviert sind. https://msdn.microsoft.com/en-us/library/bb909712(v=vs.90).aspx

SQLite:

Es handelt sich um eine dateibasierte Datenbank, die nicht mit einer großen Anzahl von Ereignissen umgehen kann. Bei großen Datenmengen sollten Sie eine herkömmliche Datenbank wie PostgreSQL oder ähnliche verwenden.

Die SQLite-Datenbank muss nicht separat installiert werden. Sie ist lediglich eine Datei auf der Festplatte, für deren Installation Sie jedoch die entsprechenden Build-Tools auf Ihrem System benötigen. Unter Linux geben Sie einfach Folgendes ein:

sudo apt-get install build-essential

Installieren Sie unter Windows Node.js mit der Option „Automatisch die notwendigen Tools installieren…“ und installieren Sie anschließend den Adapter neu, z. B.:

cd /opt/iobroker
iobroker stop sql
npm install iobroker.sql --production
iobroker start sql

MySQL:

Sie können MySQL auf Linux-Systemen wie folgt installieren:

apt-get install mysql-server mysql-client

mysql -u root -p

CREATE USER 'iobroker'@'%' IDENTIFIED BY 'iobroker';
GRANT ALL PRIVILEGES ON * . * TO 'iobroker'@'%';
FLUSH PRIVILEGES;

Bearbeiten Sie gegebenenfalls die Datei /etc/mysql/my.cnf , um die Bindung an die IP-Adresse für die Remote-Verbindung festzulegen.

Warnung : Der Benutzer iobroker hat die Rechte „admin“. Falls erforderlich, sollten dem Benutzer iobroker eingeschränkte Rechte gewährt werden.

Unter Windows kann es einfach über den Installer installiert werden: https://dev.mysql.com/downloads/installer/ .

Beachten Sie die Authentifizierungsmethode. Der neue Verschlüsselungsalgorithmus in MySQL 8.0 wird noch nicht unterstützt.node.js und Sie müssen die Legacy-Authentifizierungsmethode auswählen.

Windows

Struktur der Datenbanken

Der Standarddatenbankname lautet:iobroker Das kann aber in der Konfiguration geändert werden.

Quellen

Diese Tabelle ist eine Liste der Adapterinstanzen, die die Einträge geschrieben haben. (state.from)

DBName in der Abfrage
MS-SQLiobroker.dbo.sources
MySQLiobroker.sources
PostgreSQLQuellen
SQLiteQuellen

Struktur:

FeldTypBeschreibung
AusweisINTEGER NOT NULL PRIMARY KEY IDENTITY(1,1)eindeutige ID
Namevarchar(255) / TEXTInstanz des Adapters, der den Eintrag geschrieben hat

Hinweis: MS-SQL verwendet varchar(255), andere Datenbanken verwenden TEXT.

Datenpunkte

Diese Tabelle ist eine Liste von Datenpunkten (IDs).

DBName in der Abfrage
MS-SQLiobroker.dbo.datapoints
MySQLiobroker.datapoints
PostgreSQLDatenpunkte
SQLiteDatenpunkte

Struktur:

FeldTypBeschreibung
AusweisINTEGER NOT NULL PRIMARY KEY IDENTITY(1,1)eindeutige ID
Namevarchar(255) / TEXTVariablen-ID, z. B. hm-rpc.0.JEQ283747.1.STATE
TypGANZE ZAHL0 – Zahl, 1 – Zeichenkette, 2 – boolescher Wert

Hinweis: MS-SQL verwendet varchar(255), andere Datenbanken verwenden TEXT.

Zahlen

Werte für Zustände vom Typ „Zahl“. ts bedeutet „Zeitreihe“.

DBName in der Abfrage
MS-SQLiobroker.dbo.ts_number
MySQLiobroker.ts_number
PostgreSQLts_number
SQLitets_number

Struktur:

FeldTypBeschreibung
AusweisGANZE ZAHLID des Bundesstaates aus der Tabelle „Datenpunkte“
tsBIGINT / INTEGERZeit in Millisekunden seit dem 1. Januar 1970. Kann mit „new Date(ts)“ in eine Zeitangabe umgewandelt werden.
WertREALWert
ackBIT/BOOLEANBestätigt: 0 – keine Bestätigung, 1 – Bestätigung
_ausGANZE ZAHLID der Quelle aus der Tabelle „Quellen“
QGANZE ZAHLQualität als Zahl. Die Beschreibung finden Sie hier.

Hinweis: MS-SQL verwendet BIT, andere SQL-Server verwenden BOOLEAN. SQLite verwendet für ts INTEGER und für alle anderen Datentypen BIGINT.

Der Benutzer kann zusätzliche Angaben zum Typ definieren.number die Funktionalität voncounters Zu diesem Zweck wird die folgende Tabelle erstellt:

DBName in der Abfrage
MS-SQLiobroker.dbo.ts_counter
MySQLiobroker.ts_counter
PostgreSQLts_counter
SQLitets_counter

Struktur:

FeldTypBeschreibung
AusweisGANZE ZAHLID des Bundesstaates aus der Tabelle „Datenpunkte“
tsBIGINT / INTEGERZeit in Millisekunden seit dem 1. Januar 1970. Kann mit „new Date(ts)“ in eine Zeitangabe umgewandelt werden.
WertREALWert

Diese Tabelle speichert die Werte, wenn der Zähler ausgetauscht wurde und der Wert sich nicht erhöht, sondern nicht auf Null oder einen niedrigeren Wert gesunken ist.

Saiten

Werte für Zustände vom Typstring Die

DBName in der Abfrage
MS-SQLiobroker.dbo.ts_string
MySQLiobroker.ts_string
PostgreSQLts_string
SQLitets_string

Struktur:

FeldTypBeschreibung
AusweisGANZE ZAHLID des Bundesstaates aus der Tabelle „Datenpunkte“
tsBIGINTZeit in Millisekunden seit dem 1. Januar 1970. Kann mit „new Date(ts)“ in eine Zeitangabe umgewandelt werden.
WertTEXTWert
ackBIT/BOOLEANBestätigt: 0 – keine Bestätigung, 1 – Bestätigung
_ausGANZE ZAHLID der Quelle aus der Tabelle „Quellen“
QGANZE ZAHLQualität als Zahl. Die Beschreibung finden Sie hier.

Hinweis: MS-SQL verwendet BIT, andere SQL-Server verwenden BOOLEAN. SQLite verwendet für ts INTEGER und für alle anderen Datentypen BIGINT.

Boolesche Werte

Werte für Zustände vom Typboolean Die

DBName in der Abfrage
MS-SQLiobroker.dbo.ts_bool
MySQLiobroker.ts_bool
PostgreSQLts_bool
SQLitets_bool

Struktur:

FeldTypBeschreibung
AusweisGANZE ZAHLID des Bundesstaates aus der Tabelle „Datenpunkte“
tsBIGINTZeit in Millisekunden seit dem 1. Januar 1970. Kann mit „new Date(ts)“ in eine Zeitangabe umgewandelt werden.
WertBIT/BOOLEANWert
ackBIT/BOOLEANBestätigt: 0 – keine Bestätigung, 1 – Bestätigung
_ausGANZE ZAHLID der Quelle aus der Tabelle „Quellen“
QGANZE ZAHLQualität als Zahl. Die Beschreibung finden Sie hier.

Hinweis: MS-SQL verwendet BIT, andere SQL-Server verwenden BOOLEAN. SQLite verwendet für ts INTEGER und für alle anderen Datentypen BIGINT.

Werte über den JavaScript-Adapter abrufen

Auf die sortierten Werte kann über den JavaScript-Adapter zugegriffen werden.

  • Rufe die 50 zuletzt gespeicherten Ereignisse für alle IDs ab.
sendTo('sql.0', 'getHistory', {
    id: '*',
    options: {
        end:       Date.now(),
        count:     50,
        aggregate: 'onchange',
        addId: true
    }
}, function (result) {
    for (var i = 0; i < result.result.length; i++) {
        console.log(result.result[i].id + ' ' + new Date(result.result[i].ts).toISOString());
    }
});
  • Gespeicherte Werte für "system.adapter.admin.0.memRss" der letzten Stunde abrufen
var end = Date.now();
sendTo('sql.0', 'getHistory', {
    id: 'system.adapter.admin.0.memRss',
    options: {
        start:      end - 3600000,
        end:        end,
        aggregate: 'onchange',
        addId: true
    }
}, function (result) {
    for (var i = 0; i < result.result.length; i++) {
        console.log(result.result[i].id + ' ' + new Date(result.result[i].ts).toISOString());
    }
});

Mögliche Optionen:

  • Start - (optional) Zeit in ms - Date.now()
  • Ende - (optional) Zeit in ms - Date.now() , standardmäßig ist(now + 5000 seconds)
  • Schritt - (optional) wird in aggregierten Werten (Maximum, Minimum, Durchschnitt, Gesamt, ...) verwendet. Schrittweite in Millisekunden der Intervalle.
  • Anzahl – Anzahl der Werte, wenn die Aggregation auf „onchange“ eingestellt ist, oder Anzahl der Intervalle bei anderen Aggregationsmethoden. Die Anzahl wird ignoriert, wenn eine Schrittweite festgelegt ist; andernfalls ist der Standardwert 500.
  • Von - falls das Feld " Von " in die Antwort aufgenommen werden soll
  • ack - falls das ack- Feld in die Antwort aufgenommen werden soll
  • q - falls das Feld q in die Antwort aufgenommen werden soll
  • addId – falls das ID- Feld in die Antwort aufgenommen werden soll
  • Limit – Es werden nicht mehr Einträge zurückgegeben als das Limit.
  • runden - Ergebnis auf die gewünschte Anzahl von Nachkommastellen runden
  • ignoreNull - Gibt an, ob Nullwerte eingeschlossen (false), durch den letzten nicht-nullen Wert ersetzt (true) oder durch 0 (0) ersetzt werden sollen.
  • removeBorderValues – Standardmäßig werden zusätzliche Rahmenwerte zurückgegeben, um die Diagrammdarstellung zu optimieren. Setzen Sie diese Option auf „true“, wenn dies nicht gewünscht ist (z. B. bei der Skriptdatenverarbeitung).
  • returnNewestEntries – Die zurückgegebenen Daten sind immer aufsteigend nach Zeitstempel sortiert. Bei Verwendung von „none“ für die Aggregation und gleichzeitiger Angabe von „count“ oder „limit“ werden normalerweise die ältesten Einträge zurückgegeben (sofern keine Startdaten angegeben sind). Setzen Sie diese Option auf „true“, um stattdessen die neuesten Einträge zu erhalten.
  • Aggregation - Aggregationsmethode (Standard:average ):
    • minmax – verwendet einen speziellen Algorithmus. Der gesamte Zeitbereich wird in kleine Intervalle unterteilt, und für jedes Intervall werden Maximal-, Minimal-, Start- und Endwerte ermittelt.
    • max - Teile den gesamten Zeitbereich in kleine Intervalle auf und ermittle für jedes Intervall den Maximalwert, der dann für dieses Intervall verwendet wird (Nullwerte werden ignoriert).
    • min - Gleiches gilt wie max, jedoch mit dem Minimalwert.
    • Durchschnitt - Dasselbe wie Maximum, nur dass der Durchschnittswert verwendet wird.
    • total - Gleiches gilt für max, aber es wird der Gesamtwert berechnet.
    • count - Gleiches wie max, aber Anzahl der Werte wird berechnet (Nullwerte werden mitgezählt).
    • Perzentil - Berechne das n-te Perzentil (n ist gegeben inoptions.percentile (oder standardmäßig 50, falls nicht angegeben).
    • Quantil - Berechne das n-Quantil (n ist gegeben inoptions.quantile (oder standardmäßig 0,5, falls nicht angegeben).
    • Integral - Integral berechnen (weitere Parameter siehe unten).
    • keine – Es erfolgt keinerlei Aggregation. Nur Rohwerte in einem bestimmten Zeitraum.
  • Perzentil - (optional) Bei Verwendung der Aggregationsmethode definiert "Perzentil" die Perzentilebene (0..100) (Standardwert: 50)
  • Quantil - (optional) Bei Verwendung der Aggregationsmethode definiert "Quantil" das Quantilniveau (0..1) (Standardwert: 0,5).
  • integralUnit – (optional) Bei Verwendung der Aggregationsmethode „integral“ definiert dieser Parameter die Einheit in Sekunden (Standardwert: 60 Sekunden). Um beispielsweise das Integral in Stunden für Wh oder Ähnliches zu erhalten, setzen Sie den Wert auf 3600.
  • integralInterpolation - (optional) Bei Verwendung der Aggregationsmethode definiert "integral" die Interpolationsmethode (Standardwert ist "none").
    • lineare - lineare Interpolation
    • keine - keine/schrittweise Interpolation

Bei Aggregationen werden der erste und der letzte Punkt berechnet, außer bei der Aggregationnone Wenn Sie manuell eine Aggregation anfordern, sollten Sie den ersten und letzten Wert ignorieren, da diese aus Werten außerhalb eines Zeitraums berechnet werden.

Zähler abrufen

Der Benutzer kann den Wert eines Zählers (Typ=Zahl, Zähler=wahr) für einen bestimmten Zeitraum abfragen.

var now = Date.now();
// get consumption value for last 30 days
sendTo('sql.0', 'getCounter', {
    id: 'system.adapter.admin.0.memRss',
    options: {
        start:      now - 3600000 * 24 * 30,
        end:        now,
    }
}, result => {
    console.log(`In last 30 days the consumption was ${result.result} kWh`);    
});

Wird das Zählgerät ausgetauscht, wird dies ebenfalls berechnet.

Benutzerdefinierte Abfragen

Der Benutzer kann über den JavaScript-Adapter benutzerdefinierte Abfragen auf Tabellen ausführen:

sendTo('sql.0', 'query', 'SELECT * FROM datapoints', function (result) {
    if (result.error) {
        console.error(result.error);
    } else {
        // show result
         console.log('Rows: ' + JSON.stringify(result.result));
    }
});

Oder rufen Sie die Einträge der letzten Stunde für die ID=system.adapter.admin.0.memRss ab.

sendTo('sql.0', 'query', 'SELECT id FROM datapoints WHERE name="system.adapter.admin.0.memRss"', function (result) {
    if (result.error) {
        console.error(result.error);
    } else {
        // show result
        console.log('Rows: ' + JSON.stringify(result.result));
        var now = new Date();
        now.setHours(-1);
        sendTo('sql.0', 'query', 'SELECT * FROM ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) {
            console.log('Rows: ' + JSON.stringify(result.result));
        });
    }
});

Notiz:

Je nach Datenbank muss entweder der Datenbankname oder der Datenbankname + das Schema vor dem Tabellennamen eingefügt werden – siehe die Kästchen oben unter „Struktur der Datenbanken“.

Beispiel, wenn Ihre Datenbank den Namen „iobroker“ trägt:

DBName in der Abfrage
MS-SQLSELECT * FROM iobroker.dbo.datapoints ...
MySQLSELECT * FROM iobroker.datapoints ...

Datenbrowser

Die Instanzeinstellungen enthalten den Tab „Datenbrowser“ : Links werden alle Datenpunkte angezeigt, die Daten in der Datenbank enthalten, rechts die gespeicherten Werte des ausgewählten Datenpunkts. Die Werte können durchgeblättert, bearbeitet, gelöscht und durch neue ergänzt werden. Für diesen Tab ist eine laufende Instanz erforderlich.

Die Komponente ist eine JSON-Konfigurationcustom Komponente. Ihre Quellen befinden sich insrc-admin , das integrierte Paket inadmin/custom ist verpflichtet:

npm run npm:admin      # install the dependencies of the component (only once)
npm run build:admin    # clean, build and copy into admin/custom
cd src-admin && npm start   # development server on http://localhost:4173

Die Datenpunktliste stammt aus der Nachricht getDatapoints , die auch in Skripten verwendet werden kann:

sendTo('sql.0', 'getDatapoints', {}, result => {
    // [{id: 'system.adapter.admin.0.memRss', index: 1, type: 'Number'}, ...]
    console.log(JSON.stringify(result.result));
});

Es gibt jeden Datenpunkt zurückdatapoints Tabelle – einschließlich derer, deren Protokollierung deaktiviert ist – sortiert nach ID. Im Gegensatz zugetDpOverview Es ermittelt nicht den ersten Zeitstempel jedes Datenpunkts und antwortet sofort.

Rohwerte lesen

getHistory Diese Funktion ist für Diagramme konzipiert: Sie aggregiert, interpoliert, rundet und addiert die Werte direkt vor und nach dem angeforderten Bereich. Um die gespeicherten Zeilen genau so anzuzeigen und durchzublättern, wie sie in der Datenbank vorliegen, verwenden Sie getRawEntries .

sendTo(
    'sql.0',
    'getRawEntries',
    {
        id: 'system.adapter.admin.0.memRss',
        start: Date.now() - 3600000, // optional, inclusive
        end: Date.now(),             // optional, inclusive
        limit: 100,                  // optional, default 100, maximum 2000
        offset: 0,                   // optional, default 0
        sort: 'desc',                // optional, 'desc' (newest first, default) or 'asc'
    },
    result => {
        if (result.error) {
            console.error(result.error);
        } else {
            // total = number of all entries matching start/end, so a table can page through them
            console.log(`${result.result.length} of ${result.total} entries`);
            // [{ts: 1589458809352, val: 51.5, ack: 1, q: 0, from: 'system.adapter.admin.0'}, ...]
            console.log(JSON.stringify(result.result));
        }
    },
);

Die Antwort enthält außerdemid ,index (die ID in derdatapoints Tisch),type (Number ,String oderBoolean ),table (ts_number ,ts_string oderts_bool und die verwendetenlimit ,offset Undsort Die

Die Werte werden unverändert aus der Datenbank zurückgegeben:ack und boolesche Werte sind0 /1 in den meisten Datenbanken, undval Ein String-Datenpunkt ist die gespeicherte Zeichenkette.from Istnull falls keine Quelle gespeichert wurde.

Wieupdate ,delete UndstoreState Dies funktioniert auch für Datenpunkte, deren Protokollierung deaktiviert ist, solange noch Einträge in der Datenbank vorhanden sind. Wenn der Datenpunkt unbekannt ist, enthält die Antwort einenerror Die

storeState

Wenn Sie andere Daten in die SQL-Datenbank schreiben möchten, können Sie die integrierte Systemfunktion ` storeState` verwenden. Diese Funktion kann auch verwendet werden, um Daten aus anderen History-Adaptern wie InfluxDB oder SQL zu konvertieren.

Eine erfolgreiche Antwort bedeutet nicht, dass die Daten tatsächlich auf die Festplatte geschrieben wurden. Es bedeutet lediglich, dass sie verarbeitet wurden!

Die angegebenen IDs werden nicht mit der ioBroker-Datenbank abgeglichen und müssen dort nicht eingerichtet oder aktiviert werden. Werden eigene IDs ohne Einstellungen verwendet, wird der Parameter „rules“ nicht unterstützt und führt zu einem Fehler. Für solche IDs wird der Standardwert „Maximale Anzahl im RAM gespeicherter Werte“ verwendet.

Die Nachricht kann eines der folgenden drei Formate haben:

  1. ein ID- und ein Statusobjekt
  2. eine ID und ein Array von Zustandsobjekten
  3. Array mit mehreren IDs, wobei jede ID ein Zustandsobjekt enthält.
// 1.
sendTo('sql.0', 'storeState', {
    id: 'mbus.0.counter.xxx',
    state: {
        ts: 1589458809352,
        val: 123,
        ack: false,
        from: 'system.adapter.whatever.0'
    }
}, result => console.log('added'));

// 2.
sendTo('sql.0', 'storeState', {
    id: 'mbus.0.counter.xxx',
    state: [
        {
            ts: 1589458809352,
            val: 123,
            ack: false,
            from: 'system.adapter.whatever.0'
        },
        {
            ts: 1589458809353,
            val: 123,
            ack: false,
            from: 'system.adapter.whatever.0'
        }
    ]
}, result => console.log('added'));

// 3.
sendTo('sql.0', 'storeState', [
    {
        id: 'mbus.0.counter.xxx',
        state: {
            ts: 1589458809352,
            val: 123,
            ack: false,
            from: 'system.adapter.whatever.0'
        }
    },
    {
        id: 'mbus.0.counter.yyy',
        state: {
            ts: 1589458809353,
            val: 123,
            ack: false,
            from: 'system.adapter.whatever.0'
        }
    }
], result => console.log('added'));

Zusätzlich können Sie Attribute hinzufügen.rules: true in einer Nachricht zur Aktivierung aller Regeln, wiecounter ,changesOnly ,de-bounce und so weiter.

Im Fehlerfall wird ein Array mit allen einzelnen Fehlermeldungen sowie eine Erfolgsanzahl zurückgegeben, um zu sehen, wie viele Einträge erfolgreich gespeichert wurden.

Löschstatus

Wenn Sie einen Eintrag aus der Datenbank löschen möchten, können Sie die integrierte Systemfunktion delete verwenden:

sendTo('sql.0', 'delete', [
    {id: 'mbus.0.counter.xxx', state: {ts: 1589458809352}}, 
    {id: 'mbus.0.counter.yyy', state: {ts: 1589458809353}},
], result => console.log('deleted'));

Um ALLE Verlaufsdaten für einen bestimmten Datenpunkt zu löschen, führen Sie Folgendes aus:

sendTo('sql.0', 'deleteAll', [
    {id: 'mbus.0.counter.xxx'}, 
    {id: 'mbus.0.counter.yyy'}
], result => console.log('deleted'));

Um Verlaufsdaten für einen bestimmten Datenpunkt und einen bestimmten Bereich zu löschen, führen Sie folgenden Befehl aus:

sendTo('sql.0', 'deleteRange', [
    {id: 'mbus.0.counter.xxx', start: '2019-01-01T00:00:00.000Z', end: '2019-12-31T23:59:59.999'}, 
    {id: 'mbus.0.counter.yyy', start: 1589458809352, end: 1589458809353}
], result => console.log('deleted'));

Die Zeitangabe kann in Millisekunden seit der Unix-Epoche oder als Zeichenkette vorliegen, die mithilfe eines JavaScript-Date-Objekts konvertiert werden kann.

Werte einschließlich definierter Grenzwerte werden gelöscht.ts >= start AND ts <= end

Alle drei Befehle akzeptieren auch einen einzelnen Datenpunkt als Objekt, z. B.sendTo('sql.0', 'deleteAll', {id: 'mbus.0.counter.xxx'}, result => ...) In diesem Fall wird die Antwort nach der Ausführung des Löschvorgangs gesendet und lautet entweder{success: true} oder{error: "..."} Bei einem Array wird die Antwort sofort gesendet und gibt keine Auskunft über die einzelnen Löschvorgänge.

Zustand ändern

Wenn Sie den Wert, die Qualität oder das Bestätigungsflag eines Eintrags in der Datenbank ändern möchten, können Sie die integrierte Systemfunktion update verwenden:

sendTo('sql.0', 'update', [
    {id: 'mbus.0.counter.xxx', state: {ts: 1589458809352, val: 15, ack: true, q: 0}}, 
    {id: 'mbus.0.counter.yyy', state: {ts: 1589458809353, val: 16, ack: true, q: 0}},
], result => console.log('deleted'));

ts ist obligatorisch. Mindestens ein weiteres Flag muss in einem Zustandsobjekt enthalten sein.

Sei vorsichtig mitcounters . Dercounters Die Datenbank wird nicht zurückgesetzt, Sie müssen dies selbst handhaben.

Verlaufsprotokollierung über Javascript

Der Adapter unterstützt das Aktivieren und Deaktivieren der Verlaufsprotokollierung über JavaScript sowie das Abrufen der Liste der aktivierten Datenpunkte mit ihren Einstellungen.

aktivieren

Die Nachricht erfordert die „ID“ des Datenpunkts. Zusätzlich sind optionale „Optionen“ zur Definition der datenpunktspezifischen Einstellungen verfügbar.

sendTo('sql.0', 'enableHistory', {
    id: 'system.adapter.sql.0.memRss',
    options: {
        changesOnly:  true,
        debounce:     0,
        retention:    31536000,
        maxLength:    3,
        changesMinDelta: 0.5,
        aliasId: ''
    }
}, function (result) {
    if (result.error) {
        console.log(result.error);
    }
    if (result.success) {
        //successful enabled
    }
});

deaktivieren

Für die Meldung wird die "ID" des Datenpunkts benötigt.

sendTo('sql.0', 'disableHistory', {
    id: 'system.adapter.sql.0.memRss',
}, function (result) {
    if (result.error) {
        console.log(result.error);
    }
    if (result.success) {
        // successful enabled
    }
});

Liste abrufen

Die Nachricht enthält keine Parameter.

sendTo('sql.0', 'getEnabledDPs', {}, function (result) {
    //result is object like:
    console.log({
        "system.adapter.sql.0.memRss": {
            "changesOnly":true,
            "debounce":0,
            "retention":31536000,
            "maxLength":3,
            "changesMinDelta":0.5,
            "enabled":true,
            "changesRelogInterval":0,
            "aliasId": ""
        },
        // ...
    });
});

Changelog

4.1.5 (2026-08-28)

  • (@GermanBluefox) Updated packages

4.1.4 (2026-08-27)

  • (@GermanBluefox) Connection errors no longer start with the useless class name AggregateError: the log now shows only the real reason, e.g. connect ECONNREFUSED 127.0.0.1:3306; connect ECONNREFUSED ::1:3306

4.1.3 (2026-08-27)

  • (@GermanBluefox) Connection errors are logged with the real reason again: Node reports a failed TCP connect as an AggregateError whose own message is empty, so the log only showed the word AggregateError instead of e.g. connect ECONNREFUSED 127.0.0.1:3306
  • (@GermanBluefox) The reconnection loop no longer repeats the same connection error every 30 seconds: the first occurrence is logged as error, repetitions go to debug and once an hour a reminder is logged

4.1.2 (2026-08-27)

  • (@GermanBluefox) Fixed enableHistory being answered with success: true but silently doing nothing when it arrived while the adapter was still starting up: the adapter subscribed to object changes only after it had read the logging settings, so a message that landed in that gap activated no logging
  • (@joltcoke) Fixed average and total returning null for every interval that contains a null value: parseFloat(null) is NaN and poisoned the sum of the whole interval (thanks to @joltcoke, ioBroker/ioBroker.sql#526). As the result was NaN and not null, ignoreNull could not act on it either
  • (@joltcoke) Fixed min returning a wrong value if the interval contains a null, minmax losing the minimum if the interval starts with a null, and percentile/quantile counting a null as 0

4.1.0 (2026-08-26)

  • (@ipod86) Added a button to the datapoint settings to delete all logged values of this datapoint
  • (@GermanBluefox) The messages delete, deleteRange and deleteAll now report errors back to the caller instead of always answering with success
  • (@GermanBluefox) The messages delete, deleteRange and deleteAll work now also for datapoints whose logging is disabled
  • (@GermanBluefox) The messages delete, deleteRange and deleteAll delete the counter values of a numeric datapoint (table ts_counter) too
  • (@GermanBluefox) Fixed NaN as a result of the aggregation percentile with 100 or quantile with 1
  • (@GermanBluefox) Fixed the last value of the integralTotal aggregation: it was interpolated onto the start instead of the end of the requested range
  • (@GermanBluefox) Added the message getRawEntries to read the stored values of one datapoint page by page (with the total number of entries) for tools that show or edit the raw data
  • (@GermanBluefox) The message update works now also for datapoints whose logging is disabled and reports errors back to the caller
  • (@GermanBluefox) storeState uses the data type stored in the database for known datapoints instead of deriving it from the value
  • (@GermanBluefox) Added the tab Data browser to the instance settings: show, edit, delete and insert the stored values of a datapoint
  • (@GermanBluefox) Added the message getDatapoints that returns all datapoints of the database immediately

License

The MIT License (MIT)

Copyright (c) 2015-2026 bluefox dogafox@gmail.com, Apollon77

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.