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. Info: Auslagerung von Global-Scripten ins Filesystem

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

Info: Auslagerung von Global-Scripten ins Filesystem

Geplant Angeheftet Gesperrt Verschoben JavaScript
12 Beiträge 6 Kommentatoren 1.4k Aufrufe 8 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.
  • U Offline
    U Offline
    uwe72
    schrieb am zuletzt editiert von uwe72
    #1

    Summary:
    Beispiel wie man ein Global-Script ins Filesystem auslagert und dann in den Common-Scripten darauf zugreift. Eben nur in den Scripten wo man die Inhalte aus Global auch wirklich benötigt. Ein Beispiel für JavaScript und ein Beispiel für TypeScript.

    Zielsetzung:
    Da ich wieder an die Grenzen gekommen bin was RAM/CPU angeht, habe ich das Thema nochmals aufgegriffen, die Global-Scripte in externe Module auszulagern. Ich möchte in diesem Post eine (für mich) funktionierende Lösung vorstellen. Ich war früher Java Entwickler, dies ist allerdings bereits 15 Jahre her. JavaScript/TypeScript habe ich nie gelernt, also habe ich nicht den Anspruch professionellen Code zu schreiben. Es existieren viele Posts dazu, wollte aber (auch für mich) zusammenschreiben wie es funktionieren kann, insbesondere wenn ich in 2 Jahren nochmals wissen möchte wie es ging :-)

    Hintergrund:
    Das Konzept mit den global/common Scripte ist ja leicht fragwürdig, da der Inhalt jedes global-Script in jedes common-Script an den Anfang kopiert wird, obwohl der Inhalt eines global-Scriptes nicht in jedem common-Script benötigt wird. Es wird auch im Forum an diversen Stellen abgeraten überhaupt global-Scripte zu verwenden (vermutlich wegen RAM,CPU, Performance,...). Aber warum verwende ich überhaupt global-Scripte? Da ich eben "ein Stück Softwarecode" nur einmal schreiben möchte und es an vielen Stellen verwenden möchte. Das geht eben nicht ohne die Verwendung von global-Scripte. Ich mag keinerlei Duplizierung von Code.

    D.h. ich kann es nicht über global-Script machen, da dieser Code in jedes Script reinkopiert wird, d.h. wenn ich in 3 von 100 common-Scripten was aus global brauche, dann ist es in 97 Scripten unnötigerweise drin. Wenn dies hunderte Zeilen von Code sind ist dies einfach unnötig. Insbesondere wenn es bei TS noch "kompiliert" werden muss.

    Weiterer Schwachpunkt: Wenn wenigstens die global-Scripte nur in die common-Scripte reinkopiert werden würden aus der gleichen JavaScript-Instanz wäre auch schon was geholfen. Aber dies geht auch nicht. Die Instanz wird beim Kopieren nicht berücksichtigt

    Anforderung:
    Mir geht es also einfach darum, dass ich keinen Code doppelt schreiben möchte. In jedem common-Script möchte ich (ausgelagerte) Code-Stellen referenzieren.

    Lösungsbeispiel per JavaScript

    Externe Datei:
    /opt/iobroker/my_scripts/haus.js

    function getNumberRooms() : number {
      return 347;
    }
    
    module.exports = { getNumberRooms };
    

    ioBroker common-Script:

    const { getNumberRooms  } = require('/opt/iobroker/my_scripts/haus.js');
            
    log("Anzahl der Räume sind: " + getNumberRooms());
    
    

    Logausgabe:

    javascript.2	20:43:23.456	info	script.js.common._ModuleTest.Haus: Anzahl der Räume sind: 347
    

    Lösungsbeispiel per TypeScript

    Externe Datei:
    /opt/iobroker/my_scripts/kalender.ts

    class Kalender  {
        private adapter: any;
        private myState: string;
    
        constructor(adapter, myState) {
           this.adapter = adapter;
           this.myState = myState;
        }
    
        public getCurrentWeekdayAsInteger() : number {
            var now = new Date();
            return now.getDay();
        }
    
        public updateState() {
            this.adapter.log("Update state within external file");
    	   this.adapter.setState(this.myState, this.getCurrentWeekdayAsInteger());
        }
    
        public sendTelegram() {
            this.adapter.log("Send telegram within external file");        
            this.adapter.sendTo("telegram.0", "Weekday is: " + this.getCurrentWeekdayAsInteger());
        }
    }
    
    module.exports = { Kalender};
    

    Transpilieren von TypeScript nach JavaScript
    kalender.ts muss zu kalender.js transpiliert werden. Unter Docker muss man im Container drin sein, d.h. z.B. docker exec -it iobroker bash

    npx tsc kalender.ts
    

    --> Es entsteht die Datei kalender.js im gleichen Verzeichnis.

    ioBroker common-Script:

    const { Kalender } = require('/opt/iobroker/my_scripts/kalender.js');
            
    var myStateState = "0_userdata.0.html.test_module";
    createState(myStateState, -1, {
        name: myStateState,
        desc: myStateState,
        type: 'number', 
        read: true,
        write: true
    });
    setState(myStateState, -1);
    
    
    const myCalender = new Kalender(this, myStateState);
    log("Heute ist: " + myCalender.getCurrentWeekdayAsInteger());
    
    myCalender.sendTelegram();
    
    log("Wochentag is: " + getState(myStateState).val);
    myCalender.updateState();
    log("Wochentag is: " + getState(myStateState).val);
    
    

    Logausgabe:

    javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Heute ist: 5
    javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Send telegram within external file
    javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Wochentag is: -1
    javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Update state within external file
    javascript.2	20:53:14.747	info	script.js.common._ModuleTest.Intern: Wochentag is: 5
    
    

    Zudem wird die Telegram Nachricht versendet:
    2814003b-8217-4862-9e54-6c29a04be30b-image.png

    U paul53P 2 Antworten Letzte Antwort
    5
    • U uwe72

      Summary:
      Beispiel wie man ein Global-Script ins Filesystem auslagert und dann in den Common-Scripten darauf zugreift. Eben nur in den Scripten wo man die Inhalte aus Global auch wirklich benötigt. Ein Beispiel für JavaScript und ein Beispiel für TypeScript.

      Zielsetzung:
      Da ich wieder an die Grenzen gekommen bin was RAM/CPU angeht, habe ich das Thema nochmals aufgegriffen, die Global-Scripte in externe Module auszulagern. Ich möchte in diesem Post eine (für mich) funktionierende Lösung vorstellen. Ich war früher Java Entwickler, dies ist allerdings bereits 15 Jahre her. JavaScript/TypeScript habe ich nie gelernt, also habe ich nicht den Anspruch professionellen Code zu schreiben. Es existieren viele Posts dazu, wollte aber (auch für mich) zusammenschreiben wie es funktionieren kann, insbesondere wenn ich in 2 Jahren nochmals wissen möchte wie es ging :-)

      Hintergrund:
      Das Konzept mit den global/common Scripte ist ja leicht fragwürdig, da der Inhalt jedes global-Script in jedes common-Script an den Anfang kopiert wird, obwohl der Inhalt eines global-Scriptes nicht in jedem common-Script benötigt wird. Es wird auch im Forum an diversen Stellen abgeraten überhaupt global-Scripte zu verwenden (vermutlich wegen RAM,CPU, Performance,...). Aber warum verwende ich überhaupt global-Scripte? Da ich eben "ein Stück Softwarecode" nur einmal schreiben möchte und es an vielen Stellen verwenden möchte. Das geht eben nicht ohne die Verwendung von global-Scripte. Ich mag keinerlei Duplizierung von Code.

      D.h. ich kann es nicht über global-Script machen, da dieser Code in jedes Script reinkopiert wird, d.h. wenn ich in 3 von 100 common-Scripten was aus global brauche, dann ist es in 97 Scripten unnötigerweise drin. Wenn dies hunderte Zeilen von Code sind ist dies einfach unnötig. Insbesondere wenn es bei TS noch "kompiliert" werden muss.

      Weiterer Schwachpunkt: Wenn wenigstens die global-Scripte nur in die common-Scripte reinkopiert werden würden aus der gleichen JavaScript-Instanz wäre auch schon was geholfen. Aber dies geht auch nicht. Die Instanz wird beim Kopieren nicht berücksichtigt

      Anforderung:
      Mir geht es also einfach darum, dass ich keinen Code doppelt schreiben möchte. In jedem common-Script möchte ich (ausgelagerte) Code-Stellen referenzieren.

      Lösungsbeispiel per JavaScript

      Externe Datei:
      /opt/iobroker/my_scripts/haus.js

      function getNumberRooms() : number {
        return 347;
      }
      
      module.exports = { getNumberRooms };
      

      ioBroker common-Script:

      const { getNumberRooms  } = require('/opt/iobroker/my_scripts/haus.js');
              
      log("Anzahl der Räume sind: " + getNumberRooms());
      
      

      Logausgabe:

      javascript.2	20:43:23.456	info	script.js.common._ModuleTest.Haus: Anzahl der Räume sind: 347
      

      Lösungsbeispiel per TypeScript

      Externe Datei:
      /opt/iobroker/my_scripts/kalender.ts

      class Kalender  {
          private adapter: any;
          private myState: string;
      
          constructor(adapter, myState) {
             this.adapter = adapter;
             this.myState = myState;
          }
      
          public getCurrentWeekdayAsInteger() : number {
              var now = new Date();
              return now.getDay();
          }
      
          public updateState() {
              this.adapter.log("Update state within external file");
      	   this.adapter.setState(this.myState, this.getCurrentWeekdayAsInteger());
          }
      
          public sendTelegram() {
              this.adapter.log("Send telegram within external file");        
              this.adapter.sendTo("telegram.0", "Weekday is: " + this.getCurrentWeekdayAsInteger());
          }
      }
      
      module.exports = { Kalender};
      

      Transpilieren von TypeScript nach JavaScript
      kalender.ts muss zu kalender.js transpiliert werden. Unter Docker muss man im Container drin sein, d.h. z.B. docker exec -it iobroker bash

      npx tsc kalender.ts
      

      --> Es entsteht die Datei kalender.js im gleichen Verzeichnis.

      ioBroker common-Script:

      const { Kalender } = require('/opt/iobroker/my_scripts/kalender.js');
              
      var myStateState = "0_userdata.0.html.test_module";
      createState(myStateState, -1, {
          name: myStateState,
          desc: myStateState,
          type: 'number', 
          read: true,
          write: true
      });
      setState(myStateState, -1);
      
      
      const myCalender = new Kalender(this, myStateState);
      log("Heute ist: " + myCalender.getCurrentWeekdayAsInteger());
      
      myCalender.sendTelegram();
      
      log("Wochentag is: " + getState(myStateState).val);
      myCalender.updateState();
      log("Wochentag is: " + getState(myStateState).val);
      
      

      Logausgabe:

      javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Heute ist: 5
      javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Send telegram within external file
      javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Wochentag is: -1
      javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Update state within external file
      javascript.2	20:53:14.747	info	script.js.common._ModuleTest.Intern: Wochentag is: 5
      
      

      Zudem wird die Telegram Nachricht versendet:
      2814003b-8217-4862-9e54-6c29a04be30b-image.png

      U Offline
      U Offline
      uwe72
      schrieb am zuletzt editiert von
      #2

      Update:

      Habe nun meinen "statischen" Code in ein eigenes NPM-Modul ausgelagert und binde dieses in der JS-Instanz regulär ein. Bin mit dieser Lösung nun sehr zufrieden.

      1 Antwort Letzte Antwort
      0
      • arteckA Offline
        arteckA Offline
        arteck
        Developer Most Active
        schrieb am zuletzt editiert von
        #3

        finde deine Lösung super ..
        aber.. bei multihost mit mehreren Javascriptadaptern muss ich den Code an x Stellen pflegen.. und vor allem immer dran denken..

        ja ich gebe dir aber recht .. wenn man viele funktionen in global hat (wobei hier stellt sich die Frage warum pack ich die dann in ein Global ordner wenn ich die nur 2 mal als Beispiel nutzen will, anderes Thema) werden die Scripte aufgeblasen

        zigbee hab ich, zwave auch, nuc's genauso und HA auch

        U 1 Antwort Letzte Antwort
        0
        • arteckA arteck

          finde deine Lösung super ..
          aber.. bei multihost mit mehreren Javascriptadaptern muss ich den Code an x Stellen pflegen.. und vor allem immer dran denken..

          ja ich gebe dir aber recht .. wenn man viele funktionen in global hat (wobei hier stellt sich die Frage warum pack ich die dann in ein Global ordner wenn ich die nur 2 mal als Beispiel nutzen will, anderes Thema) werden die Scripte aufgeblasen

          U Offline
          U Offline
          uwe72
          schrieb am zuletzt editiert von
          #4

          @arteck said in Info: Auslagerung von Global-Scripten ins Filesystem:

          finde deine Lösung super ..
          aber.. bei multihost mit mehreren Javascriptadaptern muss ich den Code an x Stellen pflegen.. und vor allem immer dran denken..

          Bei meiner finalen Lösung (eigenes öffentliches NPM-Modul, Verwendung von Visual Studio Code, Code auf Github und Integration dieses NPM-Modules in der JS-Instanz) pflege ich den Code ja nur an exakt 1 Stelle. Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja, habe 4 unterschiedliche Umgebungen und kann dort nun überall das NPM-Modul einbinden.

          ja ich gebe dir aber recht .. wenn man viele funktionen in global hat (wobei hier stellt sich die Frage warum pack ich die dann in ein Global ordner wenn ich die nur 2 mal als Beispiel nutzen will, anderes Thema) werden die Scripte aufgeblasen

          Ich möchte sie halt "global funktionen" nicht 2x in common-scripten verwenden, sondern 15x. Dann noch auf verschiedenen Umgebungen. So oder so ist mir der global-Ansatz zu "pragmatisch".

          HomoranH Rene55R 2 Antworten Letzte Antwort
          0
          • U uwe72

            @arteck said in Info: Auslagerung von Global-Scripten ins Filesystem:

            finde deine Lösung super ..
            aber.. bei multihost mit mehreren Javascriptadaptern muss ich den Code an x Stellen pflegen.. und vor allem immer dran denken..

            Bei meiner finalen Lösung (eigenes öffentliches NPM-Modul, Verwendung von Visual Studio Code, Code auf Github und Integration dieses NPM-Modules in der JS-Instanz) pflege ich den Code ja nur an exakt 1 Stelle. Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja, habe 4 unterschiedliche Umgebungen und kann dort nun überall das NPM-Modul einbinden.

            ja ich gebe dir aber recht .. wenn man viele funktionen in global hat (wobei hier stellt sich die Frage warum pack ich die dann in ein Global ordner wenn ich die nur 2 mal als Beispiel nutzen will, anderes Thema) werden die Scripte aufgeblasen

            Ich möchte sie halt "global funktionen" nicht 2x in common-scripten verwenden, sondern 15x. Dann noch auf verschiedenen Umgebungen. So oder so ist mir der global-Ansatz zu "pragmatisch".

            HomoranH Nicht stören
            HomoranH Nicht stören
            Homoran
            Global Moderator Administrators
            schrieb am zuletzt editiert von Homoran
            #5

            @uwe72 sagte in Info: Auslagerung von Global-Scripten ins Filesystem:

            Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja

            Multihost ist eine Umgebung auf mehreren Rechnern verteilt
            https://www.iobroker.net/#de/documentation/config/multihost.md

            kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

            der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

            U 1 Antwort Letzte Antwort
            0
            • U uwe72

              @arteck said in Info: Auslagerung von Global-Scripten ins Filesystem:

              finde deine Lösung super ..
              aber.. bei multihost mit mehreren Javascriptadaptern muss ich den Code an x Stellen pflegen.. und vor allem immer dran denken..

              Bei meiner finalen Lösung (eigenes öffentliches NPM-Modul, Verwendung von Visual Studio Code, Code auf Github und Integration dieses NPM-Modules in der JS-Instanz) pflege ich den Code ja nur an exakt 1 Stelle. Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja, habe 4 unterschiedliche Umgebungen und kann dort nun überall das NPM-Modul einbinden.

              ja ich gebe dir aber recht .. wenn man viele funktionen in global hat (wobei hier stellt sich die Frage warum pack ich die dann in ein Global ordner wenn ich die nur 2 mal als Beispiel nutzen will, anderes Thema) werden die Scripte aufgeblasen

              Ich möchte sie halt "global funktionen" nicht 2x in common-scripten verwenden, sondern 15x. Dann noch auf verschiedenen Umgebungen. So oder so ist mir der global-Ansatz zu "pragmatisch".

              Rene55R Offline
              Rene55R Offline
              Rene55
              schrieb am zuletzt editiert von
              #6

              @uwe72 Ich habe hier interessiert mitgelesen, da ich auch ein paar Funktionen habe, die ich immer wieder brauche. Und das Ablegen in Global ist wohl mehr als eine Krücke. Ich habe es ähnlich gemacht und meine "globalen" Scripte liegen jetzt auf /opt/iobroker/iobroker-data/scripts. Die Bearbeitung davon ist noch etwas schwierig.
              Ich habe festgestellt, dass Änderungen hieran erst im Scriptadapter wirksam werden, wenn ich den neu starte. Ist das bei dir auch so?
              Dann eine weitere Frage: Du sprichst von eigenständigen npm-Modulen. Wie kann ich das verstehen/nachbauen?

              Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
              ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
              Wetterstation: Froggit WH3000SE V1.6.6

              U 1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                @uwe72 sagte in Info: Auslagerung von Global-Scripten ins Filesystem:

                Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja

                Multihost ist eine Umgebung auf mehreren Rechnern verteilt
                https://www.iobroker.net/#de/documentation/config/multihost.md

                U Offline
                U Offline
                uwe72
                schrieb am zuletzt editiert von
                #7

                @homoran said in Info: Auslagerung von Global-Scripten ins Filesystem:

                @uwe72 sagte in Info: Auslagerung von Global-Scripten ins Filesystem:

                Weiß nicht genau was Du mit multihost meinst, aber vermutlich mehrere iobroker-Umgebungen auf unterschiedlichen Rechnern. Genau das habe ich ja

                Multihost ist eine Umgebung auf mehreren Rechnern verteilt
                https://www.iobroker.net/#de/documentation/config/multihost.md

                Danke. Damit hatte ich mich bisher nicht beschäftigt. Werde es vermutlich auch nicht. Da würde dann vermutlich als Alternative zu meinem Ansatz die Umsetzung dieses CR helfen:
                https://github.com/ioBroker/ioBroker.javascript/issues/1779#issuecomment-2556818029

                1 Antwort Letzte Antwort
                0
                • Rene55R Rene55

                  @uwe72 Ich habe hier interessiert mitgelesen, da ich auch ein paar Funktionen habe, die ich immer wieder brauche. Und das Ablegen in Global ist wohl mehr als eine Krücke. Ich habe es ähnlich gemacht und meine "globalen" Scripte liegen jetzt auf /opt/iobroker/iobroker-data/scripts. Die Bearbeitung davon ist noch etwas schwierig.
                  Ich habe festgestellt, dass Änderungen hieran erst im Scriptadapter wirksam werden, wenn ich den neu starte. Ist das bei dir auch so?
                  Dann eine weitere Frage: Du sprichst von eigenständigen npm-Modulen. Wie kann ich das verstehen/nachbauen?

                  U Offline
                  U Offline
                  uwe72
                  schrieb am zuletzt editiert von uwe72
                  #8

                  @rene55 said in Info: Auslagerung von Global-Scripten ins Filesystem:

                  Ich habe festgestellt, dass Änderungen hieran erst im Scriptadapter wirksam werden, wenn ich den neu starte. Ist das bei dir auch so?

                  Das ist aber bei mir auch so. D.h. nach Änderungen muss eben einmalig die JS-Instanz neu gestartet werden. So oft macht man dies ja nicht. Ist OK für mich.

                  Dann eine weitere Frage: Du sprichst von eigenständigen npm-Modulen. Wie kann ich das verstehen/nachbauen?

                  Ich habe meinen Code eben hier abgelegt:
                  https://www.npmjs.com

                  Dieses NPM Modul füge ich meiner JS-Instanz hinzu:
                  fbf073cf-f973-4575-8ea3-031a63f6ee7a-image.png

                  Ich erstelle das NPM Modul mit Visual Studio Code. Basis war dieses Video:
                  https://www.youtube.com/watch?v=NqANV4wXhx4

                  1 Antwort Letzte Antwort
                  1
                  • U uwe72

                    Summary:
                    Beispiel wie man ein Global-Script ins Filesystem auslagert und dann in den Common-Scripten darauf zugreift. Eben nur in den Scripten wo man die Inhalte aus Global auch wirklich benötigt. Ein Beispiel für JavaScript und ein Beispiel für TypeScript.

                    Zielsetzung:
                    Da ich wieder an die Grenzen gekommen bin was RAM/CPU angeht, habe ich das Thema nochmals aufgegriffen, die Global-Scripte in externe Module auszulagern. Ich möchte in diesem Post eine (für mich) funktionierende Lösung vorstellen. Ich war früher Java Entwickler, dies ist allerdings bereits 15 Jahre her. JavaScript/TypeScript habe ich nie gelernt, also habe ich nicht den Anspruch professionellen Code zu schreiben. Es existieren viele Posts dazu, wollte aber (auch für mich) zusammenschreiben wie es funktionieren kann, insbesondere wenn ich in 2 Jahren nochmals wissen möchte wie es ging :-)

                    Hintergrund:
                    Das Konzept mit den global/common Scripte ist ja leicht fragwürdig, da der Inhalt jedes global-Script in jedes common-Script an den Anfang kopiert wird, obwohl der Inhalt eines global-Scriptes nicht in jedem common-Script benötigt wird. Es wird auch im Forum an diversen Stellen abgeraten überhaupt global-Scripte zu verwenden (vermutlich wegen RAM,CPU, Performance,...). Aber warum verwende ich überhaupt global-Scripte? Da ich eben "ein Stück Softwarecode" nur einmal schreiben möchte und es an vielen Stellen verwenden möchte. Das geht eben nicht ohne die Verwendung von global-Scripte. Ich mag keinerlei Duplizierung von Code.

                    D.h. ich kann es nicht über global-Script machen, da dieser Code in jedes Script reinkopiert wird, d.h. wenn ich in 3 von 100 common-Scripten was aus global brauche, dann ist es in 97 Scripten unnötigerweise drin. Wenn dies hunderte Zeilen von Code sind ist dies einfach unnötig. Insbesondere wenn es bei TS noch "kompiliert" werden muss.

                    Weiterer Schwachpunkt: Wenn wenigstens die global-Scripte nur in die common-Scripte reinkopiert werden würden aus der gleichen JavaScript-Instanz wäre auch schon was geholfen. Aber dies geht auch nicht. Die Instanz wird beim Kopieren nicht berücksichtigt

                    Anforderung:
                    Mir geht es also einfach darum, dass ich keinen Code doppelt schreiben möchte. In jedem common-Script möchte ich (ausgelagerte) Code-Stellen referenzieren.

                    Lösungsbeispiel per JavaScript

                    Externe Datei:
                    /opt/iobroker/my_scripts/haus.js

                    function getNumberRooms() : number {
                      return 347;
                    }
                    
                    module.exports = { getNumberRooms };
                    

                    ioBroker common-Script:

                    const { getNumberRooms  } = require('/opt/iobroker/my_scripts/haus.js');
                            
                    log("Anzahl der Räume sind: " + getNumberRooms());
                    
                    

                    Logausgabe:

                    javascript.2	20:43:23.456	info	script.js.common._ModuleTest.Haus: Anzahl der Räume sind: 347
                    

                    Lösungsbeispiel per TypeScript

                    Externe Datei:
                    /opt/iobroker/my_scripts/kalender.ts

                    class Kalender  {
                        private adapter: any;
                        private myState: string;
                    
                        constructor(adapter, myState) {
                           this.adapter = adapter;
                           this.myState = myState;
                        }
                    
                        public getCurrentWeekdayAsInteger() : number {
                            var now = new Date();
                            return now.getDay();
                        }
                    
                        public updateState() {
                            this.adapter.log("Update state within external file");
                    	   this.adapter.setState(this.myState, this.getCurrentWeekdayAsInteger());
                        }
                    
                        public sendTelegram() {
                            this.adapter.log("Send telegram within external file");        
                            this.adapter.sendTo("telegram.0", "Weekday is: " + this.getCurrentWeekdayAsInteger());
                        }
                    }
                    
                    module.exports = { Kalender};
                    

                    Transpilieren von TypeScript nach JavaScript
                    kalender.ts muss zu kalender.js transpiliert werden. Unter Docker muss man im Container drin sein, d.h. z.B. docker exec -it iobroker bash

                    npx tsc kalender.ts
                    

                    --> Es entsteht die Datei kalender.js im gleichen Verzeichnis.

                    ioBroker common-Script:

                    const { Kalender } = require('/opt/iobroker/my_scripts/kalender.js');
                            
                    var myStateState = "0_userdata.0.html.test_module";
                    createState(myStateState, -1, {
                        name: myStateState,
                        desc: myStateState,
                        type: 'number', 
                        read: true,
                        write: true
                    });
                    setState(myStateState, -1);
                    
                    
                    const myCalender = new Kalender(this, myStateState);
                    log("Heute ist: " + myCalender.getCurrentWeekdayAsInteger());
                    
                    myCalender.sendTelegram();
                    
                    log("Wochentag is: " + getState(myStateState).val);
                    myCalender.updateState();
                    log("Wochentag is: " + getState(myStateState).val);
                    
                    

                    Logausgabe:

                    javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Heute ist: 5
                    javascript.2	20:53:14.743	info	script.js.common._ModuleTest.Intern: Send telegram within external file
                    javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Wochentag is: -1
                    javascript.2	20:53:14.746	info	script.js.common._ModuleTest.Intern: Update state within external file
                    javascript.2	20:53:14.747	info	script.js.common._ModuleTest.Intern: Wochentag is: 5
                    
                    

                    Zudem wird die Telegram Nachricht versendet:
                    2814003b-8217-4862-9e54-6c29a04be30b-image.png

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

                    @uwe72 sagte: Das Konzept mit den global/common Scripte ist ja leicht fragwürdig, da der Inhalt jedes global-Script in jedes common-Script an den Anfang kopiert wird, obwohl der Inhalt eines global-Scriptes nicht in jedem common-Script benötigt wird.

                    Ja und? Das passiert nur unmittelbar vor dem Kompilieren. Funktionen werden erst dann kompiliert, wenn sie aufgerufen werden. Nicht verwendete Funktionen werden quasi wie Kommentare behandelt, belegen also keinen RAM.

                    @uwe72 sagte in Info: Auslagerung von Global-Scripten ins Filesystem:

                    nach Änderungen muss eben einmalig die JS-Instanz neu gestartet werden.

                    Dateien (NPM-Module) werden nur beim Instanz-Start eingelesen. Danach arbeitet Node.js nur noch im RAM, außer dass von ioBroker Objekte und Zustände in ihre Datenbanken geschrieben werden.

                    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

                    U 1 Antwort Letzte Antwort
                    1
                    • paul53P paul53

                      @uwe72 sagte: Das Konzept mit den global/common Scripte ist ja leicht fragwürdig, da der Inhalt jedes global-Script in jedes common-Script an den Anfang kopiert wird, obwohl der Inhalt eines global-Scriptes nicht in jedem common-Script benötigt wird.

                      Ja und? Das passiert nur unmittelbar vor dem Kompilieren. Funktionen werden erst dann kompiliert, wenn sie aufgerufen werden. Nicht verwendete Funktionen werden quasi wie Kommentare behandelt, belegen also keinen RAM.

                      @uwe72 sagte in Info: Auslagerung von Global-Scripten ins Filesystem:

                      nach Änderungen muss eben einmalig die JS-Instanz neu gestartet werden.

                      Dateien (NPM-Module) werden nur beim Instanz-Start eingelesen. Danach arbeitet Node.js nur noch im RAM, außer dass von ioBroker Objekte und Zustände in ihre Datenbanken geschrieben werden.

                      U Offline
                      U Offline
                      uwe72
                      schrieb am zuletzt editiert von uwe72
                      #10

                      Ja und?

                      Jedem seine Meinung. Wenn es so unnötig wäre, hätte man meinen CR bereits in der Luft zerrissen:
                      https://github.com/ioBroker/ioBroker.javascript/issues/1779#issuecomment-2556818029

                      Das passiert nur unmittelbar vor dem Kompilieren. Funktionen werden erst dann kompiliert, wenn sie aufgerufen werden. Nicht verwendete Funktionen werden

                      Bei mir dauerte eine Änderung einer TypeScript-Datei in Global sehr lange bzw. das System (iobroker) war erst 2-5 Minuten später wieder voll funktionsfähig.

                      Wenn man innerhalb der global Scripte gemeinsamen Code benötigt, dann ist dies auch nur durch Duplizieren von Code möglich. Mit OOP hat dies nichts zu tun. Es bleibt eine Krücke. Erschwerend kommt noch hinzu, dass beim Reinkopieren in die Common-Scripte nicht einmal die Instanz ausgewertet/berücksichtigt wird und dies auch noch Instanzübergreifend erfolgt.

                      paul53P I 2 Antworten Letzte Antwort
                      0
                      • U uwe72

                        Ja und?

                        Jedem seine Meinung. Wenn es so unnötig wäre, hätte man meinen CR bereits in der Luft zerrissen:
                        https://github.com/ioBroker/ioBroker.javascript/issues/1779#issuecomment-2556818029

                        Das passiert nur unmittelbar vor dem Kompilieren. Funktionen werden erst dann kompiliert, wenn sie aufgerufen werden. Nicht verwendete Funktionen werden

                        Bei mir dauerte eine Änderung einer TypeScript-Datei in Global sehr lange bzw. das System (iobroker) war erst 2-5 Minuten später wieder voll funktionsfähig.

                        Wenn man innerhalb der global Scripte gemeinsamen Code benötigt, dann ist dies auch nur durch Duplizieren von Code möglich. Mit OOP hat dies nichts zu tun. Es bleibt eine Krücke. Erschwerend kommt noch hinzu, dass beim Reinkopieren in die Common-Scripte nicht einmal die Instanz ausgewertet/berücksichtigt wird und dies auch noch Instanzübergreifend erfolgt.

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

                        @uwe72 sagte: dies auch noch Instanzübergreifend erfolgt.

                        Das sollte man vielleicht ändern.

                        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
                        • U uwe72

                          Ja und?

                          Jedem seine Meinung. Wenn es so unnötig wäre, hätte man meinen CR bereits in der Luft zerrissen:
                          https://github.com/ioBroker/ioBroker.javascript/issues/1779#issuecomment-2556818029

                          Das passiert nur unmittelbar vor dem Kompilieren. Funktionen werden erst dann kompiliert, wenn sie aufgerufen werden. Nicht verwendete Funktionen werden

                          Bei mir dauerte eine Änderung einer TypeScript-Datei in Global sehr lange bzw. das System (iobroker) war erst 2-5 Minuten später wieder voll funktionsfähig.

                          Wenn man innerhalb der global Scripte gemeinsamen Code benötigt, dann ist dies auch nur durch Duplizieren von Code möglich. Mit OOP hat dies nichts zu tun. Es bleibt eine Krücke. Erschwerend kommt noch hinzu, dass beim Reinkopieren in die Common-Scripte nicht einmal die Instanz ausgewertet/berücksichtigt wird und dies auch noch Instanzübergreifend erfolgt.

                          I Offline
                          I Offline
                          iob69
                          schrieb am zuletzt editiert von iob69
                          #12

                          @uwe72
                          Hab mir ein bisschen die Zähne ausgebissen, bis es bei mir lief. Das Problem war, dass ich mit Windows arbeite und ich nicht sicher war, ob es an den Pfadangaben gelegen hat.
                          Das Problem war, dass Dein Beispiel für Javascript eben Typescript enthält ( : number )
                          und das funktioniert halt in einem .js script nicht und muss transpiliert werden. Der Transpiler hat das dann rausgenommen. Vielleicht kannst du das für andere ja kurz anpassen.
                          Trotzdem finde ich die Variante gut!

                          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

                          902

                          Online

                          32.4k

                          Benutzer

                          81.5k

                          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