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
    936

  • 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.1k 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.
  • J Offline
    J Offline
    jlssmt
    schrieb am zuletzt editiert von jlssmt
    #1

    Hallo zusammen,

    ich würde gerne eine Klasse schreiben und an verschiedenen Stellen verwenden.
    Jetzt hab ich mir gedacht, ich schieb sie einfach in den Global Ordner.
    Leider bekomme ich jetzt zig Log Errors, dass die Klasse bereits definiert ist.
    Ich meine gelesen zu haben, dass die Skripts im Global Ordner in alle anderen Dateien angehängt werden. Dann würde sich der Fehler natürlich erklären.

    Jetzt wäre meine Frage, wie ich es denn stattdessen machen kann? Gibt es die Möglichkeit die Klasse in eine Datei zu importen?
    Wenn ja, wie geht das? Mit require komme ich nicht weiter, da ich die Verzeichnisstruktur im Hintergrund nicht kenne.

    Danke vorab!

    VG

    F 1 Antwort Letzte Antwort
    0
    • J jlssmt

      Hallo zusammen,

      ich würde gerne eine Klasse schreiben und an verschiedenen Stellen verwenden.
      Jetzt hab ich mir gedacht, ich schieb sie einfach in den Global Ordner.
      Leider bekomme ich jetzt zig Log Errors, dass die Klasse bereits definiert ist.
      Ich meine gelesen zu haben, dass die Skripts im Global Ordner in alle anderen Dateien angehängt werden. Dann würde sich der Fehler natürlich erklären.

      Jetzt wäre meine Frage, wie ich es denn stattdessen machen kann? Gibt es die Möglichkeit die Klasse in eine Datei zu importen?
      Wenn ja, wie geht das? Mit require komme ich nicht weiter, da ich die Verzeichnisstruktur im Hintergrund nicht kenne.

      Danke vorab!

      VG

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

      @jlssmt erstelle einen Ordner in /opt/iobroker und probiere dann ../../dein_Ordner/import.js. Wenns nicht klappt suche in meinen Beiträgen, habe das kürzlich gepostet

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

      J 1 Antwort Letzte Antwort
      1
      • F fastfoot

        @jlssmt erstelle einen Ordner in /opt/iobroker und probiere dann ../../dein_Ordner/import.js. Wenns nicht klappt suche in meinen Beiträgen, habe das kürzlich gepostet

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

        @fastfoot
        Danke für die schnelle Antwort.
        Die Lösung werde ich testen und ich denke das bekomme ich auch hin.
        Aber ich bin nicht 100% zufrieden damit. Meine Entwicklungsumgebung ist nicht das Gerät selbst. Ich nutze die Script Mirror Funktion vom JS-Adapter.
        Dann hab ich irgendwo eine Klasse liegen, die auch noch in meine IDE rein muss. Die Klasse wird vrstl. öfter mal angepasst. Und Autovervollständigung geht dann denke ich auch nicht.

        F 1 Antwort Letzte Antwort
        0
        • J jlssmt

          @fastfoot
          Danke für die schnelle Antwort.
          Die Lösung werde ich testen und ich denke das bekomme ich auch hin.
          Aber ich bin nicht 100% zufrieden damit. Meine Entwicklungsumgebung ist nicht das Gerät selbst. Ich nutze die Script Mirror Funktion vom JS-Adapter.
          Dann hab ich irgendwo eine Klasse liegen, die auch noch in meine IDE rein muss. Die Klasse wird vrstl. öfter mal angepasst. Und Autovervollständigung geht dann denke ich auch nicht.

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

          @jlssmt es ist ein ../, siehe mein Beitrag hier

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

          paul53P 1 Antwort Letzte Antwort
          0
          • F fastfoot

            @jlssmt es ist ein ../, siehe mein Beitrag hier

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

            @fastfoot sagte: es sind drei ../

            Sicher? Früher war es mal so, aber jetzt funktioniert es bei mir so:

            const clock = require('../iobroker-data/modules/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

            F 1 Antwort Letzte Antwort
            2
            • paul53P paul53

              @fastfoot sagte: es sind drei ../

              Sicher? Früher war es mal so, aber jetzt funktioniert es bei mir so:

              const clock = require('../iobroker-data/modules/test.js');
              
              F Offline
              F Offline
              fastfoot
              schrieb am zuletzt editiert von
              #6

              @paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:

              @fastfoot sagte: es sind drei ../

              Sicher? Früher war es mal so, aber jetzt funktioniert es bei mir so:

              const clock = require('../iobroker-data/modules/test.js');
              

              ja, sehr sicher. Jedenfalls hatte ich das Beispiel im verlinkten Beitrag extra getestet bevor ich es gepostet hatte.

              Habe es gerade nochmal getestet und funktioniert. Aber bei genauer Betrachtung ist deine Lösung die 'richtige', ich weiss nicht wie ich im Beitrag auf die Lösung kam, noch weniger weiss ich jetzt wieso sie überhaupt funktioniert :-(

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

              J paul53P 2 Antworten Letzte Antwort
              1
              • F fastfoot

                @paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:

                @fastfoot sagte: es sind drei ../

                Sicher? Früher war es mal so, aber jetzt funktioniert es bei mir so:

                const clock = require('../iobroker-data/modules/test.js');
                

                ja, sehr sicher. Jedenfalls hatte ich das Beispiel im verlinkten Beitrag extra getestet bevor ich es gepostet hatte.

                Habe es gerade nochmal getestet und funktioniert. Aber bei genauer Betrachtung ist deine Lösung die 'richtige', ich weiss nicht wie ich im Beitrag auf die Lösung kam, noch weniger weiss ich jetzt wieso sie überhaupt funktioniert :-(

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

                @fastfoot
                @paul53

                Ich habe es jetzt mal getestet. Bekomme aber noch die selben "SyntaxError: Identifier 'Light' has already been declared" Error Logs.
                Liegt es daran, dass ich in ein global script importiere/ require?

                Mein File sieht abgespeckt so aus und liegt in iobroker-data/modules/:

                class Light {
                    test;
                
                    constructor() {
                    }
                
                    get() {
                        return null;
                    }
                }
                
                module.exports = Light;
                
                J 1 Antwort Letzte Antwort
                0
                • J jlssmt

                  @fastfoot
                  @paul53

                  Ich habe es jetzt mal getestet. Bekomme aber noch die selben "SyntaxError: Identifier 'Light' has already been declared" Error Logs.
                  Liegt es daran, dass ich in ein global script importiere/ require?

                  Mein File sieht abgespeckt so aus und liegt in iobroker-data/modules/:

                  class Light {
                      test;
                  
                      constructor() {
                      }
                  
                      get() {
                          return null;
                      }
                  }
                  
                  module.exports = Light;
                  
                  J Offline
                  J Offline
                  jlssmt
                  schrieb am zuletzt editiert von jlssmt
                  #8

                  @fastfoot
                  @paul53

                  Ok, habe es hinbekommen. Hatte noch eine Leiche im Code.

                  Habe jetzt ein anderes Problem. In der Klasse kann ich kein setState() verwenden. Damit ist die Klasse nutzlos.
                  Gibt's da eine Möglichkeit?

                  F 1 Antwort Letzte Antwort
                  0
                  • J jlssmt

                    @fastfoot
                    @paul53

                    Ok, habe es hinbekommen. Hatte noch eine Leiche im Code.

                    Habe jetzt ein anderes Problem. In der Klasse kann ich kein setState() verwenden. Damit ist die Klasse nutzlos.
                    Gibt's da eine Möglichkeit?

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

                    @jlssmt sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:

                    @fastfoot
                    @paul53

                    Ok, habe es hinbekommen. Hatte noch eine Leiche im Code.

                    Habe jetzt ein anderes Problem. In der Klasse kann ich kein setState() verwenden. Damit ist die Klasse nutzlos.
                    Gibt's da eine Möglichkeit?

                    da kann ich leider nicht helfen

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

                    1 Antwort Letzte Antwort
                    0
                    • F fastfoot

                      @paul53 sagte in Eigene Klassen importieren und an mehreren Stellen verwenden:

                      @fastfoot sagte: es sind drei ../

                      Sicher? Früher war es mal so, aber jetzt funktioniert es bei mir so:

                      const clock = require('../iobroker-data/modules/test.js');
                      

                      ja, sehr sicher. Jedenfalls hatte ich das Beispiel im verlinkten Beitrag extra getestet bevor ich es gepostet hatte.

                      Habe es gerade nochmal getestet und funktioniert. Aber bei genauer Betrachtung ist deine Lösung die 'richtige', ich weiss nicht wie ich im Beitrag auf die Lösung kam, noch weniger weiss ich jetzt wieso sie überhaupt funktioniert :-(

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

                      @fastfoot sagte: wieso sie überhaupt funktioniert

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

                      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

                      F 1 Antwort Letzte Antwort
                      0
                      • 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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          622

                                          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