Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Eigene Klassen importieren und an mehreren Stellen verwenden

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    940

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Eigene Klassen importieren und an mehreren Stellen verwenden

Geplant Angeheftet Gesperrt Verschoben JavaScript
21 Beiträge 5 Kommentatoren 2.2k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • paul53P paul53

    @fastfoot sagte: wieso sie überhaupt funktioniert

    Nochmal getestet: Es funktionieren beide Versionen (Javascript 5.2.8).

    F Offline
    F Offline
    fastfoot
    schrieb am zuletzt editiert von
    #11

    @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

    iobroker läuft unter Docker auf QNAP TS-451+
    SkriptRecovery: https://forum.iobroker.net/post/930558

    paul53P 1 Antwort Letzte Antwort
    0
    • F fastfoot

      @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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #12

      @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');
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      AsgothianA 1 Antwort Letzte Antwort
      0
      • paul53P paul53

        @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');
        
        AsgothianA Offline
        AsgothianA Offline
        Asgothian
        Developer
        schrieb am zuletzt editiert von
        #13

        @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');
        

        ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
        "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

        paul53P 1 Antwort Letzte Antwort
        0
        • AsgothianA Asgothian

          @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');
          
          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #14

          @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'
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Antwort Letzte Antwort
          0
          • J Offline
            J Offline
            jlssmt
            schrieb am zuletzt editiert von
            #15

            Das ist ja alles schön und gut die Herren :-D
            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...

            paul53P 1 Antwort Letzte Antwort
            0
            • J jlssmt

              Das ist ja alles schön und gut die Herren :-D
              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...

              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #16

              @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.

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              J AlCalzoneA 2 Antworten Letzte Antwort
              0
              • paul53P paul53

                @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.

                J Offline
                J Offline
                jlssmt
                schrieb am zuletzt editiert von
                #17

                @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.

                1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @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.

                  AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  schrieb am zuletzt editiert von
                  #18

                  @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.

                  Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                  J 2 Antworten Letzte Antwort
                  1
                  • AlCalzoneA AlCalzone

                    @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.

                    J Offline
                    J Offline
                    jlssmt
                    schrieb am zuletzt editiert von
                    #19

                    @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. :-)

                    1 Antwort Letzte Antwort
                    0
                    • AlCalzoneA AlCalzone

                      @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.

                      J Offline
                      J Offline
                      jlssmt
                      schrieb am zuletzt editiert von
                      #20

                      @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.

                      AlCalzoneA 1 Antwort Letzte Antwort
                      0
                      • J jlssmt

                        @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.

                        AlCalzoneA Offline
                        AlCalzoneA Offline
                        AlCalzone
                        Developer
                        schrieb am zuletzt editiert von
                        #21

                        @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

                        Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                        1 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        720

                        Online

                        32.6k

                        Benutzer

                        82.2k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe