Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Eigene Klassen importieren und an mehreren Stellen verwenden

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Eigene Klassen importieren und an mehreren Stellen verwenden

    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jlssmt last edited by 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 1 Reply Last reply Reply Quote 0
      • F
        fastfoot @jlssmt last edited by

        @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 1 Reply Last reply Reply Quote 1
        • J
          jlssmt @fastfoot last edited by 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 1 Reply Last reply Reply Quote 0
          • F
            fastfoot @jlssmt last edited by fastfoot

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

            paul53 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @fastfoot last edited by

              @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 1 Reply Last reply Reply Quote 2
              • F
                fastfoot @paul53 last edited by

                @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 paul53 2 Replies Last reply Reply Quote 1
                • J
                  jlssmt @fastfoot last edited by 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 1 Reply Last reply Reply Quote 0
                  • J
                    jlssmt @jlssmt last edited by 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 1 Reply Last reply Reply Quote 0
                    • F
                      fastfoot @jlssmt last edited by

                      @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

                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @fastfoot last edited by paul53

                        @fastfoot sagte: wieso sie überhaupt funktioniert

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

                        F 1 Reply Last reply Reply Quote 0
                        • F
                          fastfoot @paul53 last edited by

                          @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

                          paul53 1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 @fastfoot last edited by

                            @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');
                            
                            Asgothian 1 Reply Last reply Reply Quote 0
                            • Asgothian
                              Asgothian Developer @paul53 last edited by

                              @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');
                              
                              paul53 1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 @Asgothian last edited by paul53

                                @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'
                                
                                1 Reply Last reply Reply Quote 0
                                • J
                                  jlssmt last edited by

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

                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @jlssmt last edited by

                                    @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 AlCalzone 2 Replies Last reply Reply Quote 0
                                    • J
                                      jlssmt @paul53 last edited by

                                      @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 Reply Last reply Reply Quote 0
                                      • AlCalzone
                                        AlCalzone Developer @paul53 last edited by

                                        @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 2 Replies Last reply Reply Quote 1
                                        • J
                                          jlssmt @AlCalzone last edited by

                                          @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 Reply Last reply Reply Quote 0
                                          • J
                                            jlssmt @AlCalzone last edited by

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

                                            AlCalzone 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            545
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            21
                                            1435
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo