NEWS
Adapter mit Bilder-Upload
-
@haus-automatisierung Wie gesagt, es ist eine externe Seite (www-Ordner), die aufgerufen wird. Ähnlich wie Jarvis das macht.
Diese Seite ist via socket.io verbunden und schreibt die eigene JSON config in die Datenpunkte.
-
Ich wüsste spontan aber auch kein Beispiel, welche Adapter noch diese älteren Oberflächen nutzen und File-Uploads implementiert haben (um sich das mal anzuschauen).
-
@haus-automatisierung Socket.io ist doch keine ältere Oberfläche
Funktioniert doch wundertbar mit websockets (Bordmittel).
-
@skb Socket-IO ist gar keine Oberfläche, sondern nur die Lib für die Kommunikation. Die wird ja nach wie vor auch in React oder jsonConfig genutzt.
Nur eben nicht mit dem Retro-jQuery-Kram usw. Und die Verknüpfung fehlt Dir ja gerade. Eventuell kannst Du es Dir ja dort abschauen.
-
@haus-automatisierung Ja, das sind ja Implementierungen, die ich bereits habe.
Also, ich lade das Bild per jQuery (Ok, oldschool - aber zuverlässig) von der Platte, reiche es direkt an das socket.emit weiter, da socket direkt files kann - ohne sie zu konvertieren. Sie kommen im Adapter an, er schreibt sie auf die Platte und gut.
Ab und an ist es aber so, das der Adapter keine Rückmeldung sendet - im Log aber eine Ausgabe erfolgt. Da hakt es gerade.
-
@skb sagte in Adapter mit Bilder-Upload:
Also, ich lade das Bild per jQuery (Ok, oldschool - aber zuverlässig) von der Platte, reiche es direkt an das socket.emit weiter
Mit
writeFile64
? Zeig mal -
@haus-automatisierung Also, aus der Konfigseite versende ich so:
const response = await new Promise((resolve) => { $("#upload_info").text(`Uploading File ${Object.keys(uploadStatus).length || 1} of ${filesLength}!`); socket.emit('sendTo', appProperties.namespace, '_uploadFile', { fileName: filename, fileData: file }, (res) => { resolve(res); }) });
im Adapter empfange ich dies so im
onMessage
Bereich:case '_uploadFile': const uploadPath = path.join(instanceDir + userFiles, obj.message.fileName); if (!fs.existsSync(uploadPath)) { this.log.info(`Uploading a new file to: ${uploadPath}`); fs.writeFile(uploadPath, obj.message.fileData, 'binary', (err) => { if (err) { this.log.error(`Could not upload the file ${uploadPath}. Error: ${err}`); this.sendTo(obj.from, obj.command, { error: err, url: null }, obj.callback); } else { this.sendTo(obj.from, obj.command, { error: null, url: obj.message.fileName, msg: 'File uploaded successfully!' }, obj.callback); } }); } else { this.log.warn(`The file trying to upload already exists: ${uploadPath}`); this.sendTo(obj.from, obj.command, { error: 'File already exists!', url: obj.message.fileName }, obj.callback); } break; Und hier kommt ab und an das Kommando nicht zurück.
-
@skb dein Adapter läuft zu 100% in/mit ioBroker?
Oder startet er rinen eigen Webserver unabhängig von ioBroker?Im ersten fall oder wenn du das per Konfig lösen willst solltest du die Funktionen von ioBroker nutzen.
Im zweiten fall solltest du es mit deinem Webserver lösen ohne Abhängigkeit zum ioBroker.
-
@jey-cee Ja, der Adapter läuft innerhalb des ioBroker. Nur seine "Klicki-Bunti"-Konfig-Oberfläche kommt über den WebAdapter. Genau wie die Inhalte, die er anzeigt.
-
@skb also kein eigener webserver, da das der Web Adapter übernimmt.
-
-
@skb sagte in Adapter mit Bilder-Upload:
Auch die socket.io Verbindung ist die von ioBroker. Alles "Bordmittel".
Ja, aber Du baust Dir damit deinen eigenen Weg via:
@skb sagte in Adapter mit Bilder-Upload:
Also, aus der Konfigseite versende ich so:
socket.emit('sendTo',Warum nicht mit
socket.emit('writeFile64',
wie oben verlinkt? Dann muss dein Adapter damit gar nichts machen und es läuft alles über das Frontend. -
@haus-automatisierung Ach, schau an. Ok, "das geht"? ... ok, wo landet die Datei dann? Wie kann man sie dann wieder abrufen?
-
@skb Sagmal klickst Du auch irgend einen Link hier an oder liest was ich schreibe?
-
@haus-automatisierung Klar, tat ich Da ist die Funktion aufgeführt. Ok, in der Readme kommt dann:
writeFile64(_adapter, fileName, data64, options, callback)
Heisst im Endeffekt mache ich:
socket.emit('writeFile64', 'energiefluss-erweitert.0', 'userFiles/Bild.jpg', Bild64Daten, function()');
Die Datei bekomme ich dann auf dem anderen Weg wieder - ok.
Mit readDir bekomme ich die Dinge dann aufgelistet zurück?
-
@skb sagte in Adapter mit Bilder-Upload:
Mit readDir bekomme ich die Dinge dann aufgelistet zurück?
Nochmal der Link...
https://iobroker.readthedocs.io/de/latest/bestpractice/storefiles.html
-
@haus-automatisierung Ne, ich meine, wenn der User nun Bilder hochgeladen hat, die ich abrufen möchte. Da kenne ich ja nicht jeden Dateinamen. So bekäme ich das Verzeichs, oder?
-
@skb sagte in Adapter mit Bilder-Upload:
Da kenne ich ja nicht jeden Dateinamen.
Den Namen musst Du einfach als Attribut irgendwo anders speichern (in das Instance-Objekt o.ä. wo. der Rest deiner Config auch liegt).
-
@haus-automatisierung Aber, mit dem readDir komme ich ja auch weiter. Ich schaue mal, wie das geht. Danke!
Dann geht dies ja wirklich besser, als gedacht -
@haus-automatisierung Also so:
let fileData = await readImage(file); const response = await new Promise((resolve) => { socket.emit('writeFile64', appProperties.namespace, 'userFiles/' + filename, fileData, (res) => { resolve(res); }); }); console.log(response);
Bekomme ich "null" zurück -.-
Auch ein:
const response_folder = await new Promise((resolve) => { socket.emit('mkdir', appProperties.namespace, 'userFiles', (error) => { resolve(error); }) }); console.log(response_folder);
Liefert leider "null".