NEWS
Datenbank Mapping von Objekten sichern/kopieren/editieren
-
Hallo Zusammen,
ich schreibe die Änderungen vieler Datenpunkte in eine Datenbank (in meinem Fall InfluxDB, aber mit MySQL/MariaDB ist der Vorgang identisch).
Ich hatte bereits mehrmals das Vergnügen, nach einer Neuinstallation von Adaptern die Konfiguration für viele Datenpunkte erneut vornehmen zu müssen (z.B. nach Problemen mit dem KNX Adapter). Für jedes Objekt auf Einstellungen klicken, Konfiguration vornehmen und den richtigen Namen für das bereits existierende Objekt in der Datenbank vergeben... sehr zeitaufwändig.Ich frage mich daher, ob es nicht auch eine Möglichkeit gibt, diese Zuordnung irgendwie zu speichern und z.B. textbasiert in eine bestimmte Datei zurückzuschreiben, wenn es notwendig sein sollte. Einen ähnlichen Ansatz hat z.B. OpenHab, hier ist die Konfiguration textbasiert verfügbar, speichern, zurückspielen oder editieren geht daher recht leicht von der Hand.
Für Ideen und Anregungen wäre ich dankbar.
Grüße,
Percy
-
@percy Mit Alias sollte das klappen.
Musst dann nur den Alias neu verknüpfen nach einer Änderung. -
@lessthanmore
über das Alias klappt die Zuweisung einwandfrei, das ist nicht das Problem. Aber wenn ich 100 Objekte in die Datenbank schreiben möchte, muss ich 100x bei dem jeweiligen Objekt die Einstellungen für Datentyp/Intervall/Alias vornehmen, das kostet je nach Menge der Objekte mehrere Stunden.EDIT: Auf Github hat sich der Entwickler des InfluxDB Adapters geäußert und einen Lösungsvorschlag gemacht. Da die Konfiguration im Objekt selbst gespeichert wird, kann eine textbasierte Konfiguration nicht ohne weiteres vorgenommen werden. Als Workaround kann die Konfiguration über ein Javascript vorgenommen werden, das erlaubt ein einfaches speichern/editieren/wiederherstellen
-
Mithilfe des Vorschlages von Apollon77 habe ich ein Skript ausgearbeitet, welches ich gerne jedem, der vor ähnlichen Problemen steht, zur Verfügung stellen möchte.
Einfach jeweils "gleichartige" Objekte (im Sinne der Konfiguration für die Aufzeichnung) in einem Skript zusammenfassen. Im 2 dimensionalen Array listOfObjects jeweils die ID des Datenpunkts und den Namen, mit dem er in der Datenbank angelegt werden soll angeben. Im unteren Teil einfach die Einstellungen anpassen, die für alle Datenpunkte gelten sollen.
Kann auch gut verwendet werden, um Einstellungen für die unter listOfObjects gelisteten Datenpunkte zu ändern.
var listOfObjects = [ ['knx.1.Licht.Rückmeldung_Schalten_(Ein-Aus)_1_Bit.EG-HWR-Deckenlicht-Schalten-R', "licht_eg_hwr"], ['knx.1.Licht.Rückmeldung_Schalten_(Ein-Aus)_1_Bit.EG-Garderobe-Deckenlicht-Schalten-R', "licht_eg_garderobe"] //weitere Objekte hier ergänzen ] for(let index = 0, len = listOfObjects.length; index < len; ++index){ sendTo('influxdb.0', 'enableHistory', { id: listOfObjects[index] [0], options: { changesOnly: true, debounce: 500, retention: 0, changesMinDelta: 0, storageType: "Boolean", aliasId: listOfObjects[index] [1] } }, function (result) { if (result.error) { console.log(result.error); } if (result.success) { }}); }
-
falls interesse:
mit diesem "schnipsel" durchläufst du alle dp einer instanz (oben definiert) und findest diejenigen, welchen einen history eintrag haben
auch damit könntest du die werte setzen
dein listOfObjects =wird ganz unten geschriebendamit musst du oben nicht alle id's mit namen eintragen - unten in der log ausgabe kann man dann die mit gleichen eintägen filtern
let instanzen=["sonoff.0","iot.0"]; // eingabe der instanzen, welche durchsucht werden sollen let theJsonArr=[]; //array mit objecten, die einen history eintrag haben let jsonInfoHistory=[]; // array mit objecten, die einen history eintrag haben und darin id, name, history definitionen let listOfObjects=[] ; for(let index = 0; index<instanzen.length; index++){ let selektor=instanzen[index]+".*" $(selektor).each(function(id, i) { // log(id) if (getObject(id).common.hasOwnProperty("custom") ){ if (getObject(id).common.custom.hasOwnProperty("sql.0") || getObject(id).common.custom.hasOwnProperty("history.0") || getObject(id).common.custom.hasOwnProperty("influxdb.0") ) { log(id) theJsonArr.push(getObject(id)) let theKey; if (getObject(id).common.custom.hasOwnProperty("sql.0")) {theKey="sql"} else if (getObject(id).common.custom.hasOwnProperty("history.0")) {theKey="history"} else if (getObject(id).common.custom.hasOwnProperty("influxdb.0")) {theKey="influxdb"} log(theKey) jsonInfoHistory.push({"id":id,"name":getObject(id).common.name,"values":getObject(id).common.custom[theKey+'.0']}) } } }); } // anzeige im log for (let i=0;i<jsonInfoHistory.length;i++){ log(JSON.stringify(jsonInfoHistory[i].values.enabled)) // oder bestimmt gesuchte if(Number(jsonInfoHistory[i].values.retention)==604800 && jsonInfoHistory[i].id.includes("sonoff") ) {log("retention ist gesucht : "+JSON.stringify(jsonInfoHistory[i].values.retention+" ID: "+jsonInfoHistory[i].id)); listOfObjects.push([jsonInfoHistory[i].id,jsonInfoHistory[i].name]) } } log(String(listOfObjects))
-
Super, werde ich mal ausprobieren, danke!