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.
    • 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
                        • T
                          ticaki Developer @OliverIO last edited by ticaki

                          @oliverio
                          Danke geht:

                          const { Person } = require('/home/iobroker/library/lib.js');
                          const joe = new Person("Joe", "Müller", 31, this);
                          log(joe.information());
                          joe.log();
                          

                          lib.ts

                          class Person {
                              private nachname: string;
                              private vorname: string;
                              private alter: string;
                              private adapter: any;
                              constructor(vorname, nachname, alter, adapter) {
                                this.vorname = vorname;
                                this.nachname = nachname;
                                this.alter = alter;
                                this.adapter = adapter;
                              }
                            
                              information(): string {
                                return (`Mein Name ist ${this.vorname} ${this.nachname} und ich bin ${this.alter} Jahre alt!!!!1`);
                              }
                              log(): void {
                                  this.adapter.log(this.information());
                              }
                            }
                           
                          module.exports = { Person};
                          

                          muss nur noch raus bekommen welchen Type adapter haben sollte.

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

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

                            this.adapter.log(this.information());

                            hm, geht wahrscheinlich nix kauptt, aber ich würde dann lieber this.log nehmen.
                            this.adapter.log ist die funktion des javascript adapters.
                            damit umgehst du wahrscheinlich eigene log verarbeitung des javascript-adapters.
                            ich würde alles was bei this.adapter verfügbar ist in ruhe lassen und nicht verwenden.

                            wäre glaube ich ein hinsweis darauf, das die sandbox des javascript-adapters ein loch hat

                            lustig ist das adapter in der auflistung, des kleinen testscripts nicht mit aufgeführt wird

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

                              @oliverio
                              Lese den Code nochmal this ist Person this.adapter ist this im javascript adapter 🙂

                              Heißt

                              ---lib ------------------ Javascript Adapter
                              this.adapter.log('bla') == this.log('bla')
                              

                              Hab das extra in adapter umbenannt, weils auch so im adapter gemacht wird (zumindest von mir)

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

                                @ticaki

                                ah jetzt, hab nicht in den constructor geschaut.
                                so sieht es auch aus wenn du einen adapter entwickelst.
                                da bekommst du über das adapter attribut auch zugriff
                                aber ist nicht das selbe wie im adapter

                                hier ist übrigens die typeinformation für die befehle im javascript adapter.
                                https://github.com/ioBroker/ioBroker.javascript/blob/939b0b0a70dd857684afc10be6732467fb3a5208/lib/javascript.d.ts

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

                                  @oliverio
                                  Danke da bin ich schon dran, das hier geht, muss nur noch types entfernen, bin aber zu faul 🙂 Hab eine class SkriptAdapter in der javascript.d.ts in meinem repo hinzugefügt.
                                  https://github.com/ticaki/script-library-example/blob/b51649045526c4c1466da759a05d4edd26b1c871/.iobroker/types/javascript.d.ts#L1728

                                  https://github.com/ticaki/script-library-example

                                  class Person {
                                      private nachname: string;
                                      private vorname: string;
                                      private alter: string;
                                      private adapter: ScriptAdapter;
                                  
                                  U 1 Reply Last reply Reply Quote 1
                                  • U
                                    uwe72 @ticaki last edited by

                                    @ticaki

                                    Habe zwar hier die letzten 2 Kommentare nicht mehr im Detail verstanden, den
                                    grundsätzlichen Ansatz aber schon. Freue mich das Ganze auszuprobieren. Leider erst ab der 2. Wochenhälfte. Auch wenn die Diskussionen auf 2-3 Threads verteilt waren, waren sie dennoch zielführend 🙂

                                    Werde erst einmal die ursprüngliche Lösung, reines externe TS-File, dieses zu einem *.js "kompilieren" versuchen. Wenn man den Adapter im Konstruktor mit rein gibt, müsste es ja auch ohne Fehlermeldung die *.js Datei erstellen können.

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

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

                                      @ticaki

                                      Habe zwar hier die letzten 2 Kommentare nicht mehr im Detail verstanden, den
                                      grundsätzlichen Ansatz aber schon.

                                      Dabei geht es um Typen - wenn du mein github repo als basis nimmst werden dort folgende Befehle kompiliert.

                                      // das ist richtig
                                      const irgendwas: ScriptAdapter;
                                      irgendwas = thisVomJavascriptadapter
                                      irgendwas.setState()
                                      
                                      // folgendes wird ebenfalls kompiliert ist aber falsch und geht nicht
                                      setState()
                                      // werde das die Tage noch aus der d.ts datei löschen.
                                      

                                      Wenn du vscode benutzt um zu programmieren, geht mit dem repo ebenfalls das Autovervollständigen und Tooltips zu Funktionen.

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

                                        @ticaki Ok, ich werde mir deinen Weg auch noch anschauen.

                                        Aber eine sehr simple/schlichte Lösung ist die:

                                        Eine Datei buch.ts in einem externen Verzeichnis, ohne das drum herum

                                        class Buch  {
                                        
                                            private adapter: any;
                                        
                                            constructor(adapter) {
                                               this.adapter = adapter;
                                            }
                                        
                                            public getCurrentWeekdayAsString() : string {
                                                var now = new Date();
                                                let weekday = now.getDay();
                                        
                                                            this.adapter.sendTo("email.0", {
                                                                from:    "uwe.clement@gmail.com",                                                                
                                                                to:      "uwe.clement@gmail.com",
                                                                subject: "Test1",
                                                                html: "test2"
                                                            });	
                                        
                                        
                                                return this.getWeekdayAsString(weekday);
                                            }
                                        
                                            public getWeekdayAsString(weekday: number) : string {
                                                let weekdayAsString;
                                                if (weekday == 1) {
                                                    weekdayAsString = "Montag";
                                                } else if (weekday == 2) {
                                                    weekdayAsString = "Dienstag";
                                                } else if (weekday == 3) {
                                                    weekdayAsString = "Mittwoch";
                                                } else if (weekday == 4) {
                                                    weekdayAsString = "Donnerstag";
                                                } else if (weekday == 5) {
                                                    weekdayAsString = "Freitag";
                                                } else if (weekday == 6) {
                                                    weekdayAsString = "Samstag";
                                                } else if (weekday == 7) {
                                                    weekdayAsString = "Sonntag";
                                                } else if (weekday == 0) {
                                                    weekdayAsString = "Sonntag";
                                                }
                                                return weekdayAsString;
                                            }  
                                        
                                        }
                                        
                                        module.exports = { Buch};
                                        

                                        Buch.ts zu buch.js "kompilieren" (Sorry, Fachbegriff wieder vergessen). Unter Docker muss man im Container drin sein, d.h. z.B. docker exec -it iobroker bash

                                        npx tsc buch.ts
                                        

                                        In Iobroker:

                                        const { Buch } = require('/opt/iobroker/my_scripts/buch.js');
                                        const myBook = new Buch(this);
                                        log("Heute ist: " + myBook.getCurrentWeekdayAsString());
                                        

                                        Funktionierende Log + Emailversand:

                                        aecf0085-fbbb-41b0-a101-7420e3c30827-image.png

                                        3e55042d-6cb8-492d-bf51-173d1e2c928c-image.png

                                        Ich freue mich nun auf alle Fälle, dass ich alle global-Scripte eliminieren kann. Halte wie gesagt von dieser Architektur nicht so viel.

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

                                          @uwe72
                                          Das ist keine "simple" Lösung sondern einfach nur aufwendiger wie javascript zu schreiben. Typescript mit any ist javascript nur transpilierbar 😄

                                          Aber im Ernst, die Lösung ist doch das gleich was ich weiter oben vorgeschlagen habe, der Nachschlag ist nur eine Verbesserung dazu.

                                          Mit Typen wird dir halt this.adapter.setstate() als Fehler angezeigt, weil es this.adapter.setState() sein müsste.

                                          Hat spass gemacht. 🙂

                                          U 2 Replies Last reply Reply Quote 0
                                          • U
                                            uwe72 @ticaki last edited by

                                            @ticaki Ich habe nun eben schon alles in TS, deswegen ist es für mich nicht aufwendiger.

                                            Eine Stufe simpler wäre, dass ich nur das buch.js schreibe, nicht transpilieren muss und es dennoch einbinden kann in iobroker.

                                            Dennoch verstehe ich noch nicht den Sinn von dem "drum herum", d.h. die vielen anderen Datei tsconfig,json,.../types/javascript.d.ts?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            760
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

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