NEWS
Eigene Klassen importieren und an mehreren Stellen verwenden
-
@fastfoot sagte: wieso sie überhaupt funktioniert
Nochmal getestet: Es funktionieren beide Versionen (Javascript 5.2.8).
-
@paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:
@fastfoot sagte: wieso sie überhaupt funktioniert
Nochmal getestet: Es funktionieren beide Versionen (Javascript 5.2.8).
Eigentlich müsste dann 'meine' Version im Linux root / landen und dann eben nicht funktionieren, liegt wohl an der Sandbox die dann wohl /opt/iobroker als root hat(vier mal ../ funktioniert auch). Interessant wäre zu wissen ob require ('/ordner/import.js') denn funktioniert wenn ordner unterhalb /opt/iobroker liegt. Kann es leider nicht mehr testen da für ne weile 'offline' und nur handy
-
@fastfoot sagte: Interessant wäre zu wissen ob require ('/ordner/import.js') denn funktioniert wenn ordner unterhalb /opt/iobroker liegt.
Gerade getestet: Es funktioniert nur mit 3 mal (oder mehr) ../
const clock = require('../../../home/pi/test.js');
-
@paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:
@fastfoot sagte: Interessant wäre zu wissen ob require ('/ordner/import.js') denn funktioniert wenn ordner unterhalb /opt/iobroker liegt.
Gerade getestet: Es funktioniert nur mit 3 mal (oder mehr) ../
const clock = require('../../../home/pi/test.js');
Es müsste auch so gehen:
const clock = require('/home/pi/test.js');
-
@asgothian sagte: Es müsste auch so gehen:
Nein, das habe ich getestet.
Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../..//home/pi/test.js'
-
Das ist ja alles schön und gut die Herren
Aber ich stelle mir für eine "Light"-Klasse vor, dass es ein setPower(), setBrightness() getPowerState() gibt und dort dann auch get und setState() verwendet werden kann. Oder was meint ihr? Hab ich da einen Denkfehler? Wie löse ich das am Besten?
Dieses Global im Hintergrund hin- und herkopiere enttäuscht mich gerade doch sehr... -
@jlssmt sagte: get und setState() verwendet werden kann.
Ich glaube mich zu erinnern, dass Funktionen des Javascript-Adapters nicht in Modulen verwendet werden können.
@jlssmt sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:
dass es ein setPower(), setBrightness() getPowerState() gibt
Unter der Gruppe "global" können häufig verwendete eigene Funktionen erstellt werden. Diese werden in jedes andere (nicht globale) Skript kopiert und dort ausgeführt.
-
@paul53
Jo, das weiß ich. Aber mein global Ordner platzt aus allen Nähten und jetzt sind wieder devices dazugekommen und ich dachte ich pack das mal an.
Oft hat man mehrere Devices, die ähnlich agieren, oder Räume, die wiederum devices (Licht, Sensor, usw.) enthalten. Es wäre schön gewesen, wenn man die dafür vorgesehenen Funktionen von JS (Klassen) auch in iobroker verwenden könnte.
Vielleicht ist das ja eine Idee für spätere iobroker Versionen, oder jmd. weiß noch eine Lösung.
Ich halte auf jeden Fall die Ohren offen. -
@paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:
Ich glaube mich zu erinnern, dass Funktionen des Javascript-Adapters nicht in Modulen verwendet werden können.
Richtig, außer man übergibt sie beim Laden des Moduls:
// Im Modul: module.exports = (setState, setObject, /*... */) => { class Foo { constructor(/*... */) { setState( /* ... */ ); } } class Bar { // ... } return { Foo, Bar, } } // Bei der Nutzung alles übergeben, was man braucht: const { Foo, Bar } = require('./module.js')(setState, setObject);
Es wäre schön gewesen, wenn man die dafür vorgesehenen Funktionen von JS (Klassen) auch in iobroker verwenden könnte.
Hä? Kannst du doch!
Ich glaube was du meinst, ist die Organisation von Skripten mit "echten" Modulen. Das Feature was wir dafür brauchen, wird leider seit Jahren von Node.js nach hinten verschoben:
https://nodejs.org/docs/latest-v16.x/api/vm.html#vm_class_vm_module
Ursprünglich war es mal für Node 10 vorgesehen, jetzt ist es in 16.x immer noch experimental. -
@alcalzone
Nice! Danke Dir!
Funktioniert wie gewollt.
Und ja die Organisation von Skripten mit echten Modulen wäre noch schöner. Aber die Lösung reicht mir erstmal. -
@alcalzone
Ach witzig. Hab jetzt folgendes Problem.Dateien: module.js, global.js, script1.js, script2.js
Im module.js steht die Klassendefinition inkl. Attribut1 mit getAttribut1() und setAttribut1().
Die Datei global.js liegt im Global Ordner. Dort wird die module.js importiert und eine neue Instanz davon erzeugt, die in mehreren Skripten verwendet werden soll.
script1.js setzt jetzt ein Attribut1 der Instanz aus global.js auf true (default ist false).
script2.js möchte Attribut1 der Instanz aus global.js auslesen und bekommt false zurück.Ich nehme an, das liegt daran, dass nicht die selbe Instanz referenziert wird, sondern eine neue Instanz für script1 und script2 erzeugt wird, da das global script ja einfach vor script1 und script2 "kopiert" wird. Richtig?
Falls ja, machts mir das jetzt natürlich schwer...
Dann kann ich keine Attribute aus Klassen verwenden. -
@jlssmt Richtig, alle "echten" Skripte laufen in ihrem eigenen separaten Kontext. Wenn du Daten zwischen diesen austauschen willst, musst du States nutzen oder messages zwischen den Skripten austauschen:
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#messageto