NEWS
writeFile / readFile (gelöst)
-
Hallo zusammen,
ich versuche gerade aus dem Zigbee Adapter heraus Dateien zu speichern. Bisher hab ich das via fs.writeFile gemacht, und die Daten unter /opt/iobroker/iobroker-data/zigbee_x abgelegt. Jetzt wollte ich schauen ob es nicht Sinn macht, die Daten statt dessen
ü
ber die im JSController eingebauten Funktion writeFile zu schreiben.Dabei komme ich irgendwie nicht auf einen gr
ü
nen Zweig. Ich habe die folgenden 3 Aufrufe gemacht :this.writeFile(null, 'test.txt', 'test data', (err) => this.log.warn(err ? 'error writing file '+ JSON.stringify(err) : 'success')); this.writeFile('zigbee', 'test1.txt', 'test data', (err) => this.log.warn(err ? 'error writing file '+ JSON.stringify(err) : 'success')); this.writeFile('zigbee.2', 'test2.txt', 'test data', (err) => this.log.warn(err ? 'error writing file '+ JSON.stringify(err) : 'success'));und bekomme daf
ü
r die folgenden Meldungen :2025-02-22 13:42:51.560 - error: zigbee.2 (30129) Cannot write file test.txt: zigbee is not an object of type "meta" 2025-02-22 13:42:51.564 - error: zigbee.2 (30129) Cannot write file test1.txt: zigbee is not an object of type "meta" 2025-02-22 13:42:51.564 - error: zigbee.2 (30129) Cannot write file test2.txt: zigbee.2 is not an object of type "meta" 2025-02-22 13:42:51.573 - warn: zigbee.2 (30129) error writing file {} 2025-02-22 13:42:51.573 - warn: zigbee.2 (30129) error writing file {} 2025-02-22 13:42:51.573 - warn: zigbee.2 (30129) error writing file {}was mache ich falsch ?
A.
Nachtrag: ich hab das mit jscontroller 6 und jscontroller 7.0.6 so. Nutze Node 20.18.0
-
-
@asgothian Nachfrage dazu:
ich hab im Zigbee-Adapter die Situation das einige Daten beim ersten Start geladen werden. Diese m
ü
ssen danach via Upload dem Admin zur Verf
ü
gung gestellt werden.Ich suche nun nach einer M
ö
glichkeit, bestimmte Dateinamen abzugleichen ob diese bereits per Upload bereit gestellt wurden. Solange der ioBroker nicht mit Redis l
ä
uft habe ich einen Umweg daf
ü
r gefunden. Sobald Redis benutzt wird stehe ich aber auf dem Schlauch.Wie komme ich von diesem Schlauch wieder herunter ?
Danke.
A.
-
@asgothian Nachfrage dazu:
ich hab im Zigbee-Adapter die Situation das einige Daten beim ersten Start geladen werden. Diese m
ü
ssen danach via Upload dem Admin zur Verf
ü
gung gestellt werden.Ich suche nun nach einer M
ö
glichkeit, bestimmte Dateinamen abzugleichen ob diese bereits per Upload bereit gestellt wurden. Solange der ioBroker nicht mit Redis l
ä
uft habe ich einen Umweg daf
ü
r gefunden. Sobald Redis benutzt wird stehe ich aber auf dem Schlauch.Wie komme ich von diesem Schlauch wieder herunter ?
Danke.
A.
aber solange du die in der dokumentation beschriebenen funktionen verwendest, muss du dich doch um die unterscheidung dateisystem/redis nicht k
ü
mmern. das macht der iobroker f
ü
r dich.wenn du bspw eine datei schreibst und der benutzer hat redis nicht aktiviert, dann landet die datei im verzeichnis, wenn er redis aktiviert hat, landet die datei in der redis-datenbank
genauso beim lesen. f
ü
r dich ist das aber unerheblich.um abzugleichen ob bereits eine bestimmte anzahl von dateien da sind, kannst du entweder mit await this.readDirAsync(_adapter, path, options);
ein ganzes verzeichnis deines storage brereichs einlesen und abgleichenoder einzeln mit await this.fileExistsAsync
beispiele habe ich hier gefunden
https://github.com/ioBroker/ioBroker.cameras/blob/939aa16d253f5365c8e6ee3280cb0aebfe6b458b/src/main.ts#L572
das storage objekt wurde hier deklariert
https://github.com/ioBroker/ioBroker.cameras/blob/939aa16d253f5365c8e6ee3280cb0aebfe6b458b/io-package.json#L197oder
hier wird das metaobjekt dynamisch im code deklariert
https://github.com/ioBroker/ioBroker.vis-2/blob/c965f7123b098d5341231efd71b34542d4fc363b/packages/iobroker.vis-2/src/main.ts#L1044 -
aber solange du die in der dokumentation beschriebenen funktionen verwendest, muss du dich doch um die unterscheidung dateisystem/redis nicht k
ü
mmern. das macht der iobroker f
ü
r dich.wenn du bspw eine datei schreibst und der benutzer hat redis nicht aktiviert, dann landet die datei im verzeichnis, wenn er redis aktiviert hat, landet die datei in der redis-datenbank
genauso beim lesen. f
ü
r dich ist das aber unerheblich.um abzugleichen ob bereits eine bestimmte anzahl von dateien da sind, kannst du entweder mit await this.readDirAsync(_adapter, path, options);
ein ganzes verzeichnis deines storage brereichs einlesen und abgleichenoder einzeln mit await this.fileExistsAsync
beispiele habe ich hier gefunden
https://github.com/ioBroker/ioBroker.cameras/blob/939aa16d253f5365c8e6ee3280cb0aebfe6b458b/src/main.ts#L572
das storage objekt wurde hier deklariert
https://github.com/ioBroker/ioBroker.cameras/blob/939aa16d253f5365c8e6ee3280cb0aebfe6b458b/io-package.json#L197oder
hier wird das metaobjekt dynamisch im code deklariert
https://github.com/ioBroker/ioBroker.vis-2/blob/c965f7123b098d5341231efd71b34542d4fc363b/packages/iobroker.vis-2/src/main.ts#L1044@oliverio Das Problem ist das ich auf ein vom System definiertes Storage-Objekt zugreifen will - das welches das Admin-Interface des Zigbee-Adapters nutzt, nicht eines welches ich selber definiert habe.
Und da sind wir dann wieder bei der Frage aus dem ersten Post - was muss ich da angeben.
Sobald ich auf die Funktionen aus dem Adapter-Objekt zur
ü
ckgreifen kann ist es kein problem die eigentliche Abfrage zu machen - nur komme ich damit bisher nicht weiter.Ich habe kein selbst-definiertes Meta-Objekt. Und wenn ich eines habe, dann wird das durch 'iob upload zigbee' nicht genutzt, sprich da landen die Daten nicht. Und aus der Admin-Obefl
ä
che komme ich an die Bilder in dem Objekt auch nicht ran (zumindest soweit ich das bisher testen konnte)A.
-
@oliverio Das Problem ist das ich auf ein vom System definiertes Storage-Objekt zugreifen will - das welches das Admin-Interface des Zigbee-Adapters nutzt, nicht eines welches ich selber definiert habe.
Und da sind wir dann wieder bei der Frage aus dem ersten Post - was muss ich da angeben.
Sobald ich auf die Funktionen aus dem Adapter-Objekt zur
ü
ckgreifen kann ist es kein problem die eigentliche Abfrage zu machen - nur komme ich damit bisher nicht weiter.Ich habe kein selbst-definiertes Meta-Objekt. Und wenn ich eines habe, dann wird das durch 'iob upload zigbee' nicht genutzt, sprich da landen die Daten nicht. Und aus der Admin-Obefl
ä
che komme ich an die Bilder in dem Objekt auch nicht ran (zumindest soweit ich das bisher testen konnte)A.
ok, das kommt nicht so deutlich heraus das du nicht der zigbee adapter bist
-
ok, das kommt nicht so deutlich heraus das du nicht der zigbee adapter bist
@oliverio Ich bin schon der Zigbee Adapter

Aber im Zigbee-Adapter ist nicht explizit ein meta-Objekt f
ü
r die Bilder im Admin Interface definiert. Zumindest nicht an einer Stelle wo ich es gefunden habe. Ich denke dieses Objekt ist generell bei jedem Adapter vorhanden. Allerdings ist unklar ob auf dieses Objekt mit den entsprechenden Funktionen zugegriffen werden kann.A.
-
@oliverio Ich bin schon der Zigbee Adapter

Aber im Zigbee-Adapter ist nicht explizit ein meta-Objekt f
ü
r die Bilder im Admin Interface definiert. Zumindest nicht an einer Stelle wo ich es gefunden habe. Ich denke dieses Objekt ist generell bei jedem Adapter vorhanden. Allerdings ist unklar ob auf dieses Objekt mit den entsprechenden Funktionen zugegriffen werden kann.A.
also ich interpretiere hier nur noch. ich hab das jetzt nicht selber ausprobiert. auch gibt es wahrscheinlich da nicht soviele beispiele.
ich w
ü
rde davon ausgehen, das du im zigbee adapter kein meta objekt f
ü
r einen anderen adapter defnierst oder solltest.wenn man im admin adapter nachschaut findet man diese stelle
https://github.com/ioBroker/ioBroker.admin/blob/b8f54c7774a59b3f1b33c48c67ea0f27413465fa/packages/admin/io-package.json#L473hier ist ein meta objekt definiert mit dem hilfetext
Benutzerdateien und Bilder f
ü
r den Hintergrundtheoretisch m
ü
sstest du dar
ü
ber dann auch vom zigbee-adapter reinschauen k
ö
nnen um irgendwie zu pr
ü
fen ob alles da ist
besser w
ä
re aber:
hab jetzt nicht noch weiter reingeschaut, ob es noch andere gibt, die dynamisch erzeugt werden.so ganz hab ich deinen usecase noch nicht verstanden.
aber soweit f
ü
r den zigbeeadapter werden eine gewisse anzahl von dateien ben
ö
tigts (wahrscheinlich in einem bestimmten format) ansonsten l
ä
uft der nicht oder nur teilweise.da w
ü
rde mir eigentich am besten sowas einfallen:
Bei jsonConfig gibt es diese Komponente
https://github.com/ioBroker/ioBroker.admin/blob/b8f54c7774a59b3f1b33c48c67ea0f27413465fa/packages/jsonConfig/src/JsonConfigComponent/ConfigImageUpload.tsx
Wenn es das nicht nur f
ü
r Bilder sondern f
ü
r allgemeine Dateien g
ä
be, dann k
ö
nnte der Anwender im AdminDialog deines Adapers lle Dateien bereitstellen, bei Upload kannst du auch gleich pr
ü
fen ob die Dateien in sich g
ü
ltig sind und nur bei Erfolg dann die Config speichern und den Adapter starten. -
also ich interpretiere hier nur noch. ich hab das jetzt nicht selber ausprobiert. auch gibt es wahrscheinlich da nicht soviele beispiele.
ich w
ü
rde davon ausgehen, das du im zigbee adapter kein meta objekt f
ü
r einen anderen adapter defnierst oder solltest.wenn man im admin adapter nachschaut findet man diese stelle
https://github.com/ioBroker/ioBroker.admin/blob/b8f54c7774a59b3f1b33c48c67ea0f27413465fa/packages/admin/io-package.json#L473hier ist ein meta objekt definiert mit dem hilfetext
Benutzerdateien und Bilder f
ü
r den Hintergrundtheoretisch m
ü
sstest du dar
ü
ber dann auch vom zigbee-adapter reinschauen k
ö
nnen um irgendwie zu pr
ü
fen ob alles da ist
besser w
ä
re aber:
hab jetzt nicht noch weiter reingeschaut, ob es noch andere gibt, die dynamisch erzeugt werden.so ganz hab ich deinen usecase noch nicht verstanden.
aber soweit f
ü
r den zigbeeadapter werden eine gewisse anzahl von dateien ben
ö
tigts (wahrscheinlich in einem bestimmten format) ansonsten l
ä
uft der nicht oder nur teilweise.da w
ü
rde mir eigentich am besten sowas einfallen:
Bei jsonConfig gibt es diese Komponente
https://github.com/ioBroker/ioBroker.admin/blob/b8f54c7774a59b3f1b33c48c67ea0f27413465fa/packages/jsonConfig/src/JsonConfigComponent/ConfigImageUpload.tsx
Wenn es das nicht nur f
ü
r Bilder sondern f
ü
r allgemeine Dateien g
ä
be, dann k
ö
nnte der Anwender im AdminDialog deines Adapers lle Dateien bereitstellen, bei Upload kannst du auch gleich pr
ü
fen ob die Dateien in sich g
ü
ltig sind und nur bei Erfolg dann die Config speichern und den Adapter starten.@oliverio ich zeig einfach mal worum es geht:
im Zigbee Adapter gibt es eine Seite wo die ganzen Ger
ä
te dargestellt werden, und eine Steuerung erlauben. Die gleichen Bilder werden auch im Objektbaum benutzt um die Devices leichter auffindbar zu machen

Das Problem ist das diese Bilder nicht Bestandteil des Adapter-Codes sind, sondern beim 1. Start / Integrieren eines neuen Ger
ä
tes aus dem Netz herunter geladen werden. Nachdem sie herunter geladen wurden befinden sie sich da wo alle 'image' assets f
ü
r das Admin interface liegen (/opt/iobroker/node_modules/iobroker.zigbee/admin/img)Der Screenshot vom Zigbee-Tab ist ohne Upload. Wenn ich jetzt ein Upload (und reload der Seite) mache sieht das ganze so aus:

Das Problem ist das je nach Situation / Aktion des Benutzers dieses Upload nach einem Update des Adapters nach dem ersten Start nochmal erfolgen muss. Automatisch ausf
ü
hren kann ich das nicht - selbst ein 'exec iob upload zigbee' vom Zigbee-Adapter aus aufgerufen klappt nicht - der Adapter wird vom JS Controller beendet.Ich suche also eine M
ö
glichkeit festzustellen ob der Upload erfolgt ist. Wenn nicht will ich das dem Nutzer darstellen:
.Anbei ein Beispiel von dem Entwicklungssystem welches nicht auf Redis setzt. Da kann ich schauen ob alle Bilder erfolgreich
ü
bertragen wurden.Ich hoffe jetzt wird klarer worum es mir geht.
Ich hatte das mit @arteck diskutiert - insbesondere weil ich eigentlich die Bilder direkt im Adapter an die 'richtige' stelle legen wollte - das hatte @arteck schon mal probiert und auch mit Ingo diskutiert - das geht aktuell nicht.
A.
Nachtrag: ich kann leider nicht einfach verifizieren ob alle von den Kacheln ben
ö
tigten Bilder ladbar sind, da es durchaus sein kann das ein Bild nicht existiert. Ich muss schon den Abgleich zu den theoretisch verf
ü
gbaren Bildern machen. Nur dann kann ein Upload das fehlende Bild bereitstellen. -
@oliverio ich zeig einfach mal worum es geht:
im Zigbee Adapter gibt es eine Seite wo die ganzen Ger
ä
te dargestellt werden, und eine Steuerung erlauben. Die gleichen Bilder werden auch im Objektbaum benutzt um die Devices leichter auffindbar zu machen

Das Problem ist das diese Bilder nicht Bestandteil des Adapter-Codes sind, sondern beim 1. Start / Integrieren eines neuen Ger
ä
tes aus dem Netz herunter geladen werden. Nachdem sie herunter geladen wurden befinden sie sich da wo alle 'image' assets f
ü
r das Admin interface liegen (/opt/iobroker/node_modules/iobroker.zigbee/admin/img)Der Screenshot vom Zigbee-Tab ist ohne Upload. Wenn ich jetzt ein Upload (und reload der Seite) mache sieht das ganze so aus:

Das Problem ist das je nach Situation / Aktion des Benutzers dieses Upload nach einem Update des Adapters nach dem ersten Start nochmal erfolgen muss. Automatisch ausf
ü
hren kann ich das nicht - selbst ein 'exec iob upload zigbee' vom Zigbee-Adapter aus aufgerufen klappt nicht - der Adapter wird vom JS Controller beendet.Ich suche also eine M
ö
glichkeit festzustellen ob der Upload erfolgt ist. Wenn nicht will ich das dem Nutzer darstellen:
.Anbei ein Beispiel von dem Entwicklungssystem welches nicht auf Redis setzt. Da kann ich schauen ob alle Bilder erfolgreich
ü
bertragen wurden.Ich hoffe jetzt wird klarer worum es mir geht.
Ich hatte das mit @arteck diskutiert - insbesondere weil ich eigentlich die Bilder direkt im Adapter an die 'richtige' stelle legen wollte - das hatte @arteck schon mal probiert und auch mit Ingo diskutiert - das geht aktuell nicht.
A.
Nachtrag: ich kann leider nicht einfach verifizieren ob alle von den Kacheln ben
ö
tigten Bilder ladbar sind, da es durchaus sein kann das ein Bild nicht existiert. Ich muss schon den Abgleich zu den theoretisch verf
ü
gbaren Bildern machen. Nur dann kann ein Upload das fehlende Bild bereitstellen.Das hier liest sich aber anders - Zitat von @apollon77
Ich denke das einfachste ist wen der Adapter nach dem Download die files einfach in den Admin Store des Adapters schreibt per Adapter.writeFile. Dann brauchst du so einen Upload Hack nicht.
-
Das hier liest sich aber anders - Zitat von @apollon77
Ich denke das einfachste ist wen der Adapter nach dem Download die files einfach in den Admin Store des Adapters schreibt per Adapter.writeFile. Dann brauchst du so einen Upload Hack nicht.
@ticaki sagte in writeFile / readFile:
Das hier liest sich aber anders - Zitat von @apollon77
Ich denke das einfachste ist wen der Adapter nach dem Download die files einfach in den Admin Store des Adapters schreibt per Adapter.writeFile. Dann brauchst du so einen Upload Hack nicht.
Nach genau so einer Option habe ich lange gesucht - bisher habe ich dazu keine M
ö
glichkeit gefunden. (Siehe auch 1. Post). Nebenbei: wo ist das Zitat her ?Es kann sein das ich die Aussage von Arthur f
ä
lschlicherweise Ingo zugeordnet habe.
Ü
ber 2 Ecken, alter Kopf, l
ö
chriges Ged
ä
chtnis. Wenn dem so sein sollte, dann tut mir das leid.A.
-
@ticaki sagte in writeFile / readFile:
Das hier liest sich aber anders - Zitat von @apollon77
Ich denke das einfachste ist wen der Adapter nach dem Download die files einfach in den Admin Store des Adapters schreibt per Adapter.writeFile. Dann brauchst du so einen Upload Hack nicht.
Nach genau so einer Option habe ich lange gesucht - bisher habe ich dazu keine M
ö
glichkeit gefunden. (Siehe auch 1. Post). Nebenbei: wo ist das Zitat her ?Es kann sein das ich die Aussage von Arthur f
ä
lschlicherweise Ingo zugeordnet habe.
Ü
ber 2 Ecken, alter Kopf, l
ö
chriges Ged
ä
chtnis. Wenn dem so sein sollte, dann tut mir das leid.A.
Hat er um ca. 9:40 im telegram dev-chat geschrieben.
-
Hat er um ca. 9:40 im telegram dev-chat geschrieben.
-
@asgothian
dann discord? Edit - nachricht ist auch im discord, beim ersten mal lesen nicht erkannt

-
@asgothian
dann discord? Edit - nachricht ist auch im discord, beim ersten mal lesen nicht erkannt

-
Dann Bau dir doch deinen eigenen Upload ein.
Der Upload von io Broker verwendet die gleichen Befehle, die du auch verwenden kannstDann musst du nicht darauf vertrauen, ob der Benutzer etwas richtig oder vielleicht auch falsch machst. Dann ist das besser automatisiert und mehr Komfort f
ü
r deinen NutzerHast du denn diese Befehle schon verwendet?
Kommen Fehlermeldungen? -
Dann Bau dir doch deinen eigenen Upload ein.
Der Upload von io Broker verwendet die gleichen Befehle, die du auch verwenden kannstDann musst du nicht darauf vertrauen, ob der Benutzer etwas richtig oder vielleicht auch falsch machst. Dann ist das besser automatisiert und mehr Komfort f
ü
r deinen NutzerHast du denn diese Befehle schon verwendet?
Kommen Fehlermeldungen? -
@oliverio sagte in writeFile / readFile:
Hast du denn diese Befehle schon verwendet?
Kommen Fehlermeldungen?Siehe 1. Post.
Die L
ö
sung:this.writeFile(`${this.name}.admin`, 'test.txt', 'test data', (err) => this.log.warn(err ? 'error writing file '+ JSON.stringify(err) : 'success'));wirft keinen Fehler und erzeugt die Datei.
Vielen Dank f
ü
r die Hilfe. Damit komm ich erst einmal weiterA.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden