NEWS
ReadFilesSync - korrekten Adapterpfad ermitteln
-
Hallo, ich möchte aus dem Files Verzeichnis des Adapters ein Files lesen. In etwa so:
var settings = JSON.parse(require('fs').readFileSync('/iobroker-data/files/adaptername/settings.json').toString());
Wie finde ich den korrekten Pfad des Adapters? Ich mein, bei jedem kann der iobroker ja woanders installiert sein. Mit welcher Methode ermittel ich erstmal wo das iobroker-data Verzeichnis liegt?
LG und Danke!
-
Verzeichnis des Adapters? Liegt das file im selben Verzeichnis wie das ausgeführte js file?! Dann __dirname is your friend. Da steht das Verzeichnis des scriptfiles drin. Von d aus kannst du weitergehen.
Iobroker-Data ist dann was anderes. Wie du das findest kannst du im History Adapter nachschauen.
-
Danke!
Also ich arbeite im Frontend nicht in der Admin Oberfläche. Wenn ich das folgenden probiere:
var fs = require('fs'); var settings = JSON.parse(fs.readFile(__dirname + '/../config/config.json').toString());
Kommt der Error "require is not defined"
Und wenn ich folgendes probiere (Im VIS Adapter abgeschaut):
var settings = JSON.parse(ngl.conn.readFile(__dirname + '/../config/config.json').toString());
Sagt er mir: "__dirname is not defined"
-
Du willst also auf das generelle ioBroker Konfigfile zugreifen?
Was heisst "Du arbeitest nicht in der Adminoberfläche"?
-
Ich Bastel gerade auf einer Seite im Frontend rum, öhnlich der Edit Seite im VIS. Ich bin also in www und nicht in admin unterwegs. Dort scheint einiges anders zu laufen
Sorry ich bin gerade dabei Stück für Stück zu lernen. Ich wollte testweise mal eine JSON Datei anlegen und diese lesen / schreiben um User-Konfigurationsdaten zu speichern. Ähnlich wie VIS die Widget-Konfigurationen der Nutzer abspeichert… Bin ich auf dem Holzweg?
-
Bin ich auf dem Holzweg? `
Ja. Das "Frontend" läuft im Browser, der keinen Zugriff auf Daten des ioBroker-Hosts hat. Außerdem läuft der nicht mit NodeJS, sodass require, __dirname und Module wie "fs" nicht existieren.Vis und viele andere Adapter-Frontends machen das was du vor hast über Socket-Kommunikation mit dem Adapter, der wiederum den Datenzugriff auf Festplatte und so übernimmt.
-
Also folgender Code funktioniert (Bedingung siehe unten):
ngl.conn.readFile("config.json",function (err, data){ console.log('yo'); if (err) { window.alert(theFile + ' ' + err); if (err === 'permissionError') { that.showWaitScreen(true, '', _('Loading stopped', location.protocol + '//' + location.host, location.protocol + '//' + location.host), 0); // do nothing any more return; } } if(data){ console.log('data success:'+data); } })
Allerdings erst wenn ich unter iobroker-data/files einen Ordner mit dem Namen adaptername.0 anlege. Kann mir das Jemand erklären? Ein Ordner iobroker-data/files/adaptername war bereits vorhanden. Allerdings geht das readfile wohl explizit auf den adaptername.0 Ordner.
Und warum wird der Ordner adaptername.0 nicht automatisch bei upload angelegt wenn der Adapter doch als 0 Instanz läuft?
-
Danke für eure Erklärungen, so ganz langsam wie eine Schnecke komm ich weiter
Dies hier funktioniert:
var theFile = '/adaptername/config.json'; ngl.conn.readFile(theFile,function (err, data){ ...
Also eigentlich logisch. Vom Root des iobroker-data Verzeichnisses aus…
-
Allerdings erst wenn ich unter iobroker-data/files einen Ordner mit dem Namen adaptername.0 anlege. Kann mir das Jemand erklären? Ein Ordner iobroker-data/files/adaptername war bereits vorhanden. Allerdings geht das readfile wohl explizit auf den adaptername.0 Ordner. `
Das liegt daran, weil jede Adapter-Instanz unabhängig voneinander ist und erst mal ihre eigene Konfiguration und ihr eigenes Datenverzeichnis hat.