NEWS
CSV Datei über VIS downloaden
-
Hallo liebe Community,
ich möchte per Javascript aus einer Benutzer-Auswahl von Messdaten aus meiner InfluxDB eine CSV Datei erstellen, die sich der User über die VIS-2 downloaden kann.
Leider kann ich in den Pfad /opt/iobroker/iobroker-data/files/0_userdata.0 nicht schreiben.
Ich bekomme immer:
javascript.0 09:06:18.671 error script.js.common.Export.Auswerten: Error: Permission denied javascript.0 09:06:18.671 error at create_csv (script.js.common.Export.Auswerten:58:8)
Gibt es einen alternativen Pfad, der auch vom Web-Server erreichbar ist?
-
Ich antworte mal selbst:
Ich lasse die CSV per Javascript im Verzeichnis /home/iobroker/export erstellen.
In dem Verzeichnis lasse ich einen Python HTTP Server laufen
python3 -m http.server 8083
Das ganze kann man noch mit systemd als Service erstellen, damit der HTTP-Server auch beim Neustart läuft.
Dazu ein .sh Script z.B. im Admin Verzeichnis erstellen:
nano /home/admin/start_http_server.sh
#!/bin/bash cd /home/iobroker/export python3 -m http.server 8083
Skript ausführbar machen:
chmod +x /home/admin/start_http_server.sh
Service Datei erstellen:
sudo nano /etc/systemd/system/httpserver.service
[Unit] Description=Python HTTP Server After=network.target [Service] ExecStart=/home/admin/start_http_server.sh WorkingDirectory=/home/iobroker/export StandardOutput=inherit StandardError=inherit Restart=always User=admin [Install] WantedBy=multi-user.target
Systemd neu laden:
sudo systemctl daemon-reload
Status prüfen:
sudo systemctl status httpserver.service
-
Das ist doch nicht nötig.
Wenn Du ein Javascript Anhänger bist, dann bist doch sicher auch Blockly Fan und damit kannst Du doch einfach unter 0-userdata.0 die Datei schreiben und auch wieder einlesen:
Hier der Import:
Wenn ich mir den JS Code anschaue, dann schaut der auch ganz simple aus:
writeFile('0_userdata.0' /* Stammordner für Benutzerobjekte und Dateien */, String('demo.json'), 'Spalte1;Spalte2;Spalte3', (err) => { if (err) { console.error(err); } }); readFile('0_userdata.0' /* Stammordner für Benutzerobjekte und Dateien */, String('demo.json'), (err, data, mimeType) => { if (err) { console.error(err); } console.info(data); });
Das ist auf jeden Fall wesentlich resourcenschonender als einen zustätzlichen Webserver zu basteln.
Im Übrigen kann man sich über die Schaltfläche den Ordner gleich raus suchen:
Siehe auch hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#writefile
Anscheinend kann man auch über den internen Webserver 8082 auf die Datei zugreifen und das funktioniert problemlos:
-
Wahrscheinlich war Dein Fehler nur den vollständigen Pfad - anstatt nur den relativen Pfad ab files zu nutzen.
-
Ah super danke für die Info.
In der Doku steht:
The file that looks like '/subfolder/file.txt' will be stored under "/javascript/subfolder/file.txt" and can be accessed over web server with "http://ip:8082/javascript/subfolder/file.txt"
const fs = require('node:fs'); writeFile(null, '/subfolder/file.txt', data, (error) => { log('file written'); });
-
Man muss halt das Node FS Modul nehmen