Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. (ERLEDIGT!) TypeScript, viele common/global Scripte --> CPU

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    (ERLEDIGT!) TypeScript, viele common/global Scripte --> CPU

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @GombersIOB last edited by

      @gombersiob sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:

      Aber die Scripte machen doch in der Regel nichts beim Neustart

      doch! sie weden kompiliert

      Armilar 1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators @GombersIOB last edited by

        @gombersiob sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:

        die "Global"-Scripte vor jedes Common-Script kopiert.

        auch vor alle Skripte, die im Wurzelverzeichnis liegen

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

          @homoran sagte: auch vor alle Skripte, die im Wurzelverzeichnis liegen

          ... oder in jeder anderen Gruppe als "global".

          1 Reply Last reply Reply Quote 1
          • Armilar
            Armilar Most Active Forum Testing @Homoran last edited by

            @homoran sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:

            Aber die Scripte machen doch in der Regel nichts beim Neustart

            doch! sie weden kompiliert

            Aber nur wenn es Änderungen gibt...

            609df1d8-c90a-48aa-812b-d20d8c289793-image.png

            Ansonsten wird die Version aus dem Cache genutzt.

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

              @armilar sagte: Ansonsten wird die Version aus dem Cache genutzt.

              Das betrifft anscheinend den Precompiler TypeScript --> Javascript.
              Skripte werden bei jedem Neustart kompiliert, da beim Stoppen der RAM freigegeben wurde.

              U 1 Reply Last reply Reply Quote 1
              • U
                uwe72 @paul53 last edited by uwe72

                Ich habe aus ca. 40 (kleineren) Common-Scripte ca. 25 (größere) gemacht und von 8 global Scripten auf 5 reduziert.

                Ich laufe nun zumindest nicht mehr in das CPU-Problem rein. Das Speichern nach dem Ändern eines Global-Script dauert nun ca. 5 Minuten.

                Übrigens, das Ändern von Common-Scripten ist nie ein Problem, auch vor der "Optimierung" nicht.

                U 1 Reply Last reply Reply Quote 0
                • U
                  uwe72 @uwe72 last edited by uwe72

                  Generell mache ich sehr viel mit Scripten und stoße aktuell an Grenzen mit den Rahmenbedingungen:

                  • TypeScript
                  • ca. 40 common-Scripte
                  • ca. 5-8 global-Scripte (mit teilweise bis zu 3000 Zeilen Code)

                  Ich spiele in einer anderen ioBroker-Umgebung mit dem Thema "messageTo" herum mit dem Ziel ganz auf global-Scripte verzichten zu können.

                  Ist ein wenig ein konstruiertes Beispiel, aber ganze Klassen(-inhalte) bekommt man nicht verschickt, oder? Sondern vermutlich nur "primitive" Datentypen oder vermutlich json?

                  export class TestPosition {
                      private threeQuarter:   number;
                      private half:         number;
                      private oneQuarter:     number;
                  
                      constructor(threeQuarter: number, half: number, oneQuarter: number) {
                          this.threeQuarter = threeQuarter;
                          this.half = half;
                          this.oneQuarter = oneQuarter;
                      }
                  
                      public getThreeQuarter() : number {
                          return this.threeQuarter;
                      }
                      public getHalf() : number {
                          return this.half;
                      }
                      public getOneQuarter() : number {
                          return this.oneQuarter;
                      }
                  }
                  
                  //var data = "uwe";
                  var data = new TestPosition(10,20,30);
                  
                  messageTo({ instance: 'javascript.0', script: 'script.js.common.Test2', message: 'message1' }, data, {timeout: 1000}, result =>
                      console.log(JSON.stringify(result)));
                  
                  //@ts-expect-error
                  onMessage('message1', (data, callback) => {
                      console.log(`UWE !!! Received data: ${data}`); callback({ result: Date.now() });
                      var my = data.getThreeQuarter();
                      log("YIPIEEEEEEEEEEEEEEEEEE: " + my);
                  });
                  
                  Error in callback: TypeError: data.getThreeQuarter is not a function
                  
                  paul53 T 2 Replies Last reply Reply Quote 0
                  • paul53
                    paul53 @uwe72 last edited by

                    @uwe72 sagte: ca. 5-8 global-Scripte (mit teilweise bis zu 3000 Zeilen Code)

                    Das ist eindeutig viel zu viel. Dafür sind "globale" Skripte nicht vorgesehen.
                    So viele häufig verwendete eigene Funktionen?

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

                      Bitte löschen.

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

                        @uwe72
                        Ist die Struktur der ioBroker-Objekte inkl. Aufzählungen so schlecht, dass man eigene globale Datenstrukturen benötigt?

                        U 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @uwe72 last edited by

                          @uwe72
                          Hab das da zwar noch nicht probiert, aber als ich das mit Funktionen ausprobiert habe, hat es nicht funktioniert. Dann wird es IMHO wohl auch nicht mit Klassen gehen.

                          1 Reply Last reply Reply Quote 1
                          • U
                            uwe72 @paul53 last edited by uwe72

                            @paul53 Hab das Beispiel noch ausgetauscht. Es ist nicht nur Datenstruktur, sondern auch viel Logik für generische Anwendungszwecke. Z.B. generische Alexasteuerung über IOT-Adapter, d.h. man gibt nur Alexanamen an und alles andere funktioniert automatisch (Registrierung der Datenpunkte im iot-Adapter, Lampen ein/aus,...).

                            Kann dennoch drüber nachdenken wie ich es schaffe, das aus dem global-Bereich rauszubekommen, zumindest große Teile davon nach common zu verschieben.

                            Ob, man mein Beispiel nun gut oder schlecht findet, wollte ich nur darauf hinweisen, dass ich eben mit den Rahmenbedingungen an Grenzen stoße.

                            Vielleicht stoßen andere mit "sinnvollen" Anwendungszwecken eben auch mal an diese Grenzen.

                            Homoran 1 Reply Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators @uwe72 last edited by

                              @uwe72 sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:

                              gut oder schlecht findet

                              ist jetzt nicht die Frage.

                              Aber im Prinzip scheinst du ganze Programmteile von ioBroker mit eigenen Funktionen überstülpen zu wollen.

                              U 1 Reply Last reply Reply Quote 0
                              • U
                                uwe72 @Homoran last edited by

                                @homoran Alles gut 😉

                                1 Reply Last reply Reply Quote 0
                                • U
                                  uwe72 @OliverIO last edited by uwe72

                                  @oliverio habe deinen Hinweis mal ein wenig verfolgt. Habe es prinzipiell auch hinbekommen ein eigenes Modul auf https://www.npmjs.com/ anzulegen. Dieses Modul habe ich dann in ioBroker der Instanz hinzugefügt und konnte auch auf die Inhalte des Moduls innerhalb der ioBroker Scripte zugreifen. War allerdings alles mit JavaScript.

                                  Was ich gerade gar nicht hinkriege ist, das Ganze noch mit Typescript zu machen. Müsste dies grundsätzlich funktionieren?

                                  1 Reply Last reply Reply Quote 0
                                  • OliverIO
                                    OliverIO last edited by

                                    @uwe72
                                    Ah ok, sogar auf NPM publiziert

                                    NPM hat auch die Möglichkeit, Pakete einfach auf der Festplatte über Dateipfad zu referenzieren. Das meinte ich eigentlich.

                                    Klar geht das auch mit Typescript.
                                    Aber du weißt, dass Typescript nativ nicht ausgeführt wird, sondern vorher erst nach Javascript transpiliert werden muss.
                                    Dazu werden im Paket entsprechende Tools installiert, die das dann voll automatisch machen.

                                    Es gibt ja einige Adapter, die in Typescript erstellt worden sind. Da kannst du mal schauen.

                                    U 2 Replies Last reply Reply Quote 1
                                    • U
                                      uwe72 @OliverIO last edited by uwe72

                                      @oliverio Über NPM Publizierung und per JS habe ich es mal hinbekommen:
                                      https://forum.iobroker.net/topic/70069/einfügen-von-js-klassen-aus-eigenem-npm-modul/13

                                      Werde es aber noch versuchen ohne Publizierung und mit TS. Ja ich weiß, dass zur Laufzeit nur JS verwendet wird. Ich weiß auch, dass Du es so meintest, dass man die Module lokal ablegt, ohne Publizierung.

                                      1 Reply Last reply Reply Quote 0
                                      • U
                                        uwe72 @OliverIO last edited by

                                        @oliverio Mittlerweile funktioniert es ohne über NPM zu publizieren und auch mit TypeScript.

                                        Ein externes .ts (liegt in einem Verzeichnis innerhalb iobroker) wird zu .js "kompiliert" (fehlt gerade der Fachbegriff) und im iobroker-TS-Script über require eingebunden.

                                        Was noch nicht funktioniert ist, wenn im externen Script "Dinge" wir sendTo() verwendet werden. Dieses wird dann in iobroker angemeckert, da unbekannt.

                                        Hast Du dazu noch eine Idee?

                                        Gerne im Thread, ganz unten:
                                        https://forum.iobroker.net/topic/70069/einfügen-von-js-klassen-aus-eigenem-npm-modul/47

                                        1 Reply Last reply Reply Quote 0
                                        • OliverIO
                                          OliverIO last edited by OliverIO

                                          @uwe72 sagte in (ERLEDIGT!) TypeScript, viele common/global Scripte --> CPU:

                                          sendTo

                                          ja das externe script hat ersteinmal keinen bezug zum aktuellen context in dem die funktionen verfügbar sind.

                                          wenn du testweise in einem separaten script von iobroker das folgende ausführst,
                                          dann siehst du alles was im script context verfügbar ist.
                                          wenn du an dein externes script this mit übergibst, dann kannst du dann unter der empfangenden variable dort, alle befehle erreichen.

                                          console.log(Object.keys(this).join(",\n"));
                                          

                                          Beipsiel

                                          iobroker script

                                          const xx=require("externesSkript");
                                          xx.externeFunktion(this)
                                          

                                          externes Skript

                                          export Function externeFunktion(iob) {
                                            iob.log("Logausgabe im iobroker log");
                                          }
                                          

                                          Hab das jetzt nicht direkt getestet, aber so müsste es grob laufen.

                                          Wenn du im externen script mit vscode arbeitest, dann erwarte da ersteinmal keine syntax überprüfung, da müsste man sciherlich noch eine type definition hinzufügen. aber da weiß ich auch nix

                                          U T 2 Replies Last reply Reply Quote 2
                                          • U
                                            uwe72 @OliverIO last edited by

                                            @oliverio Danke dir! Werde ich mir anschauen. VG

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            513
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            10
                                            55
                                            3073
                                            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