NEWS
Javascript für Import wird nicht gefunden
-
Hallo.
Ich möchte in einem Script Javascript Klassen und Funktionen aus einem anderen Script importieren und benutzen. Ich weiß, dass das mit "require(..." gehen sollte.
Ich habe als Beispiel die Klasse Person nachgebaut:

Und jetzt möchte ich die Klasse Person aufrufen in dieser Art:

Nur was muss ich da als Pfad zur Datei Person.js angeben. Alles was ich bisher versucht habe wird nicht gefunden.
Vielen Dank im Voraus.
Rolf -
Hast du auch in der javascript Instanz bei den Allgemeinen Einstellungen unter „Mirror scripts to file path“ den Pfad angegeben?
Edit: Bild eingefügt

Soweit ich es weiß funktioniert das Laden von Modulen oder Klassen aus einer anderen Datei nur, wenn diese in den Filepfad vom javascript-Adapter gespiegelt werden.
Ich nutze das so mit zahlreichen Klassen und das funktioniert bei mir problemlos.
Ich habe hier z.b.: „ /home/iobroker/skripte“
Wenn du das als Beispiel nimmst, dann würde der Pfad bei dir „ /home/iobroker/skripte/common/Person.js“ lauten.
Du musst dann auch die entsprechende javascript-Instanz neu starten, damit die Klasse dann auch geladen wird.(Edit: Pfadangabe korrigiert)
-
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Hast du auch in der javascript Instanz bei den Allgemeinen Einstellungen unter „Mirror scripts to file path“ den Pfad angegeben?
Danke dir.
Nein, ich hatte da nix und hab da jetzt "/home/iobroker/skripte" eingetragen und auch das Skript neu gestartet.
Funktioniert aber nicht. Es kommt diese Fehlermeldung:

Der packt da immer noch "@iobroker-javascript.0/" davor.
Funktioniert auch nicht, wenn ich da relative Pfade verwende. Also z.B. nur "skripte".In meiner Javascript Instanz habe ich allerdings keine NMP-Module eingetragen:

Aber ich vermute, die haben nix damit zu tun, oder? -
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Hast du auch in der javascript Instanz bei den Allgemeinen Einstellungen unter „Mirror scripts to file path“ den Pfad angegeben?
Danke dir.
Nein, ich hatte da nix und hab da jetzt "/home/iobroker/skripte" eingetragen und auch das Skript neu gestartet.
Funktioniert aber nicht. Es kommt diese Fehlermeldung:

Der packt da immer noch "@iobroker-javascript.0/" davor.
Funktioniert auch nicht, wenn ich da relative Pfade verwende. Also z.B. nur "skripte".In meiner Javascript Instanz habe ich allerdings keine NMP-Module eingetragen:

Aber ich vermute, die haben nix damit zu tun, oder?@Rolli2 sagte: die haben nix damit zu tun, oder?
Nein, haben sie nicht.
Ich speichere eigene Module unter "iobroker-data/modules", damit sie mit dem ioBroker-Backup gesichert werden. Der Aufruf im Skript erfolgt dann so:
const myfunc = require('../../../iobroker-data/modules/test.js');EDIT: Gerade getestet: Es funktioniert so offenbar nicht mehr!
-
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Hast du auch in der javascript Instanz bei den Allgemeinen Einstellungen unter „Mirror scripts to file path“ den Pfad angegeben?
Danke dir.
Nein, ich hatte da nix und hab da jetzt "/home/iobroker/skripte" eingetragen und auch das Skript neu gestartet.
Funktioniert aber nicht. Es kommt diese Fehlermeldung:

Der packt da immer noch "@iobroker-javascript.0/" davor.
Funktioniert auch nicht, wenn ich da relative Pfade verwende. Also z.B. nur "skripte".In meiner Javascript Instanz habe ich allerdings keine NMP-Module eingetragen:

Aber ich vermute, die haben nix damit zu tun, oder?@Rolli2 sagte: packt da immer noch "@iobroker-javascript.0/" davor.
Die zusätzlichen NPM-Module für die Javascript-Instanz werden unter "/opt/iobroker/node_modules/@iobroker-javascript.0/" abgelegt.
Vermutlich kann man dort auch eigene Module ablegen? -
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Hast du auch in der javascript Instanz bei den Allgemeinen Einstellungen unter „Mirror scripts to file path“ den Pfad angegeben?
Danke dir.
Nein, ich hatte da nix und hab da jetzt "/home/iobroker/skripte" eingetragen und auch das Skript neu gestartet.
Funktioniert aber nicht. Es kommt diese Fehlermeldung:

Der packt da immer noch "@iobroker-javascript.0/" davor.
Funktioniert auch nicht, wenn ich da relative Pfade verwende. Also z.B. nur "skripte".In meiner Javascript Instanz habe ich allerdings keine NMP-Module eingetragen:

Aber ich vermute, die haben nix damit zu tun, oder?@Rolli2 sagte in Javascript für Import wird nicht gefunden:
Aber ich vermute, die haben nix damit zu tun, oder?
Wie paul53 schon geschrieben, nein daran liegt es nicht.
@Rolli2 sagte in Javascript für Import wird nicht gefunden:
und auch das Skript neu gestartet
Du musst nach Änderungen in der Klasse immer die javascript Instanz neu starten; nicht nur das Skript.
Sonst wird die Änderung nicht geladen.Ich nutze kein Blockly, daher kann ich dir leider nicht sagen, ob es ev. daran liegt?
Aber hier ein kleines Beispiel aus einem meiner Skripte, wie es bei mir läuft:
In meinem Fall heißt die Klasse "class_Diagamm" und ist direkt im Javascript Adapter im Ordner "Module" abgespeichert:

Code in der Klasse:
class Diagramm { #_iob; #_dps; #_tf; #_debug; constructor(iob, dataPointsSettings, timeForerun, debug) { this.#_iob = iob || null; this.#_dps = Object.assign({}, dataPointsSettings); this.#_tf = timeForerun || 0; this.#_debug = debug || false; } get refreshSecond() {return Math.floor(Math.random() * 59 + 1 )} // und weiterer Code in der Klasse } module.exports = { Diagramm };... und vereinfacht der Code zum Laden der Klasse in einem anderen js, sowie dann der Aufruf einer Funktion aus der Klasse (hier als Bsp. "refreshSecond").
const pathToModule = '/home/iobroker/skripte/Module/class_Diagramm.js'; let DiaAZRaumklima = null; const loadModules = () => { return new Promise(async (resolve, reject) => { try { const { Diagramm } = require(pathToModule); DiaAZRaumklima = new Diagramm(this, DiaAZRaumklimaSETTINGS, DiaAZRaumklimaUSERINPUT.Vorlaufzeit, DiaAZRaumklimaUSERINPUT.Debugging); resolve(true); } catch (err) {reject(err)} }) } await loadModules(); const refreshSecond = DiaAZRaumklima.refreshSecond; //und weiterer Code im js -
@Rolli2 sagte: die haben nix damit zu tun, oder?
Nein, haben sie nicht.
Ich speichere eigene Module unter "iobroker-data/modules", damit sie mit dem ioBroker-Backup gesichert werden. Der Aufruf im Skript erfolgt dann so:
const myfunc = require('../../../iobroker-data/modules/test.js');EDIT: Gerade getestet: Es funktioniert so offenbar nicht mehr!
@paul53 sagte in Javascript für Import wird nicht gefunden:
Ich speichere eigene Module unter "iobroker-data/modules", damit sie mit dem ioBroker-Backup gesichert werden.
Ich denke du hast dann die Module aber nicht direkt im Javascript Adapter, oder? (siehe mein Bild im obigen Post)
Ich nutze da den Weg das ich so alles direkt im Adapter habe und damit keine "externen" Files benötige.
Die Sicherung ist damit auch gegeben.Zu den eigenen Modulen bei den zusätzlichen NPM-Modulen ablegen, gibt es einen Thread im Forum, finde ihn aber gerade nicht.
Edit: hier ist der Link zu dem Thread, aus diesem habe ich auch die o.a. Lösung von @ticaki (siehe Beitrag 17)
https://forum.iobroker.net/topic/70069/einfügen-von-js-klassen-aus-eigenem-npm-modul -
@paul53 sagte in Javascript für Import wird nicht gefunden:
Ich speichere eigene Module unter "iobroker-data/modules", damit sie mit dem ioBroker-Backup gesichert werden.
Ich denke du hast dann die Module aber nicht direkt im Javascript Adapter, oder? (siehe mein Bild im obigen Post)
Ich nutze da den Weg das ich so alles direkt im Adapter habe und damit keine "externen" Files benötige.
Die Sicherung ist damit auch gegeben.Zu den eigenen Modulen bei den zusätzlichen NPM-Modulen ablegen, gibt es einen Thread im Forum, finde ihn aber gerade nicht.
Edit: hier ist der Link zu dem Thread, aus diesem habe ich auch die o.a. Lösung von @ticaki (siehe Beitrag 17)
https://forum.iobroker.net/topic/70069/einfügen-von-js-klassen-aus-eigenem-npm-modul@ofri2607 sagte: Link zu dem Thread
Im November 2023 hat meine Lösung auch noch funktioniert.
Problem ist, dass neuerdings
@Rolli2 sagte in Javascript für Import wird nicht gefunden:packt da immer noch "@iobroker-javascript.0/" davor.
-
-
-
@ofri2607 sagte: Die Lösung wie oben dargestellt, läuft so bei mir zuverlässig
Ja, funktioniert bei mir auch nach Instanz-Neustart:
const myfunc = require('/home/iobroker/scripts/modules/test.js'); log(myfunc(new Date()));
-
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
So wie ich den Screenshot von @rolli2 deute, hat er das in Blockly aufgebaut.
Korrekt, ich hab's in Blockly gebaut.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ja, Neustart der Instanz ist leider bei jeder Änderung in der Klasse erforderlich.
Die Javainstanz startet ja automatisch neu, wenn ich irgendwas darin ändere.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ich habe dein Beispiel jetzt mal auf die Schnelle in meiner Umgebung nachgestellt,
Du hast's ja nicht in Blockly gebaut. Dann scheint's ja wirklich daran zu liegen.
@paul53 sagte in Javascript für Import wird nicht gefunden:
EDIT: Gerade getestet: Es funktioniert so offenbar nicht mehr!
Aber bei dir scheinen Sachen ja auch "nicht mehr" zu funktionieren.
-
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
So wie ich den Screenshot von @rolli2 deute, hat er das in Blockly aufgebaut.
Korrekt, ich hab's in Blockly gebaut.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ja, Neustart der Instanz ist leider bei jeder Änderung in der Klasse erforderlich.
Die Javainstanz startet ja automatisch neu, wenn ich irgendwas darin ändere.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ich habe dein Beispiel jetzt mal auf die Schnelle in meiner Umgebung nachgestellt,
Du hast's ja nicht in Blockly gebaut. Dann scheint's ja wirklich daran zu liegen.
@paul53 sagte in Javascript für Import wird nicht gefunden:
EDIT: Gerade getestet: Es funktioniert so offenbar nicht mehr!
Aber bei dir scheinen Sachen ja auch "nicht mehr" zu funktionieren.
@Rolli2 sagte: Aber bei dir scheinen Sachen ja auch "nicht mehr" zu funktionieren.
In der "alten" Version hat es nicht mehr funktioniert, was daran liegen kann, dass beim Neuaufsetzen von ioBroker (neuer PC) das Verzeichnis "iobroker-data/modules" nicht restored wurde.
Mit dem Erstellen der Module im Skript-Editor unter der Gruppe "modules" und dem geänderten Pfad "/home/iobroker/scripts/modules/test.js" funktioniert es. "/home/iobroker/scripts" ist der Spiegelpfad bei mir.Es funktioniert auch innerhalb einer JS-Funktion in Blockly.
-
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
So wie ich den Screenshot von @rolli2 deute, hat er das in Blockly aufgebaut.
Korrekt, ich hab's in Blockly gebaut.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ja, Neustart der Instanz ist leider bei jeder Änderung in der Klasse erforderlich.
Die Javainstanz startet ja automatisch neu, wenn ich irgendwas darin ändere.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
Ich habe dein Beispiel jetzt mal auf die Schnelle in meiner Umgebung nachgestellt,
Du hast's ja nicht in Blockly gebaut. Dann scheint's ja wirklich daran zu liegen.
@paul53 sagte in Javascript für Import wird nicht gefunden:
EDIT: Gerade getestet: Es funktioniert so offenbar nicht mehr!
Aber bei dir scheinen Sachen ja auch "nicht mehr" zu funktionieren.
-
Anmerkung: Das Vorgehen von @ofri2607 mit einer Gruppe für eigene Node-Module hat den Vorteil, dass im Spiegelverzeichnis die Rechte für den User "iobroker" passen und man das Modul-Skript nicht erst in eine Datei kopieren muss.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
würde der Pfad bei dir „ /home/iobroker/skripte/Person.js“ lauten.
Der korrekte Pfad wäre gewesen:
const Person = require('/home/iobroker/skripte/common/Person.js'); -
Anmerkung: Das Vorgehen von @ofri2607 mit einer Gruppe für eigene Node-Module hat den Vorteil, dass im Spiegelverzeichnis die Rechte für den User "iobroker" passen und man das Modul-Skript nicht erst in eine Datei kopieren muss.
@ofri2607 sagte in Javascript für Import wird nicht gefunden:
würde der Pfad bei dir „ /home/iobroker/skripte/Person.js“ lauten.
Der korrekte Pfad wäre gewesen:
const Person = require('/home/iobroker/skripte/common/Person.js'); -
@Rolli2 sagte: funktioniert es auch bei mir in Blockly.
Bedenke, dass Person nur innerhalb der JS-Funktion zur Verfügung steht.
EDIT: Man kann Blockly allerdings austricksen, indem man eine (globale) Variable mit identischem Bezeichner Person erstellt, die auch einmal verwendet werden muss, damit sie im Skript erhalten bleibt.

Funktion classPerson():
Person = require('/home/iobroker/scripts/modules/Person.js');Funktion modultest(vorname, nachname, alter):
const neu = new Person(vorname, nachname, alter); return neu.information();Log:
javascript.1 13:31:06.996 info start JavaScript (Blockly) javascript.1 13:31:07.000 info function javascript.1 13:31:07.000 info Mein Name ist Cagney -
@Rolli2 sagte: funktioniert es auch bei mir in Blockly.
Bedenke, dass Person nur innerhalb der JS-Funktion zur Verfügung steht.
EDIT: Man kann Blockly allerdings austricksen, indem man eine (globale) Variable mit identischem Bezeichner Person erstellt, die auch einmal verwendet werden muss, damit sie im Skript erhalten bleibt.

Funktion classPerson():
Person = require('/home/iobroker/scripts/modules/Person.js');Funktion modultest(vorname, nachname, alter):
const neu = new Person(vorname, nachname, alter); return neu.information();Log:
javascript.1 13:31:06.996 info start JavaScript (Blockly) javascript.1 13:31:07.000 info function javascript.1 13:31:07.000 info Mein Name ist Cagney


