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. Problem mit globalen Scripten

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    738

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

Problem mit globalen Scripten

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
9 Beiträge 3 Kommentatoren 873 Aufrufe 4 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.
  • D Offline
    D Offline
    da.phreak
    schrieb am zuletzt editiert von da.phreak
    #1

    Hallo,

    Ich hab inzwischen alles versucht, komme aber nicht weiter. Ich habe mehrere globale Scripte, die voneinander abhängen. Das erste soll callbacks verwalten:

    interface Subscription { (sender: object, source:string):void }

    class SubscriptionManager {
        private callbacks:Subscription[];
    
        public Subscribe(callback:Subscription) {
            if(this.callbacks.indexOf(callback) == -1) {
                this.callbacks.push(callback);
            }
        }
    
        public Unubscribe(callback:Subscription) {
            var index = (this.callbacks.indexOf(callback));
            if(index != -1) {
                delete this.callbacks[index];
            }
        }
    
        public Notify(sender: object, source:string) {
            for(let callback of this.callbacks) {
                callback(sender, source);
            }
        }
    
        constructor() {
            this.callbacks = [];
        }
    }
    

    Mit Subscribe() kann man sich auf events anmelden, mit Notify() ein Event senden. Dann habe ich diverse weiter Scripte, um Komponten zu abstrahieren. Sowas hier z. B.:

    class Switch {
        public static readonly STATE:string = "state";
    
        private suffixes:string[] = ['.STATE', '.state' ,'.1.STATE', ''];
        private nodeState:string;
        private subscriptionManager:SubscriptionManager;
    
        public get S():SubscriptionManager { return this.subscriptionManager}
    
        public get State():boolean {
            return getState(this.nodeState).val;
        }
        public set State(value:boolean) {
            setState(this.nodeState, value);
        }
    
        constructor(address:string) {
            this.subscriptionManager = new SubscriptionManager();
    
           for(let suffix of this.suffixes) {
                this.nodeState = address + suffix;
                var node = getState(this.nodeState)
                var exists = !node.notExist;
                if(exists && typeof node.val === "boolean") {
                    on(this.nodeState, this.OnStateChanged.bind(this) );
                    break;
                }
            }
        }
    
        private OnStateChanged():void {
            this.subscriptionManager.Notify(this, Switch.STATE);
        }
    }
    

    Man kann also die Adresse von einem Schalter reinwerfen, und sich dann darauf Subscriben. Dazu habe ich weitere Controller-Klassen, die z. B. Switch-Instanzen mit weiteren Klassen (z. B. LightSource für Licht) verbinden.

    Ich bekomme leider viele Fehler wie diese hier:

    ```
    
    private subscriptionManager:SubscriptionManager;
                                    ^
    ERROR: Cannot find name 'SubscriptionManager'.
    
        public get S():SubscriptionManager { return this.subscriptionManager}
                       ^
    ERROR: Cannot find name 'SubscriptionManager'.
    
            this.subscriptionManager = new SubscriptionManager();
                                           ^
    ERROR: Cannot find name 'SubscriptionManager'.
    
        public get S():SubscriptionManager { return this.subscriptionManager}
                       ^
    ERROR: Return type of public getter 'S' from exported class has or is using private name 'SubscriptionManager'.
    

    Funktionieren tut das ganze komischerweise trotzdem, allerdings nur mit einer alten Version vom javascript-Adapter. Mache ich ein Update, starten die Scripte aufgrund der Fehlermeldungen nicht. Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.

    Hat jemand eine Idee, der sich besser mit Java-/Typescript auskennt? Ich komme eher aus der C++/C#-Ecke ...

    UncleSamU 1 Antwort Letzte Antwort
    0
    • D da.phreak

      Hallo,

      Ich hab inzwischen alles versucht, komme aber nicht weiter. Ich habe mehrere globale Scripte, die voneinander abhängen. Das erste soll callbacks verwalten:

      interface Subscription { (sender: object, source:string):void }

      class SubscriptionManager {
          private callbacks:Subscription[];
      
          public Subscribe(callback:Subscription) {
              if(this.callbacks.indexOf(callback) == -1) {
                  this.callbacks.push(callback);
              }
          }
      
          public Unubscribe(callback:Subscription) {
              var index = (this.callbacks.indexOf(callback));
              if(index != -1) {
                  delete this.callbacks[index];
              }
          }
      
          public Notify(sender: object, source:string) {
              for(let callback of this.callbacks) {
                  callback(sender, source);
              }
          }
      
          constructor() {
              this.callbacks = [];
          }
      }
      

      Mit Subscribe() kann man sich auf events anmelden, mit Notify() ein Event senden. Dann habe ich diverse weiter Scripte, um Komponten zu abstrahieren. Sowas hier z. B.:

      class Switch {
          public static readonly STATE:string = "state";
      
          private suffixes:string[] = ['.STATE', '.state' ,'.1.STATE', ''];
          private nodeState:string;
          private subscriptionManager:SubscriptionManager;
      
          public get S():SubscriptionManager { return this.subscriptionManager}
      
          public get State():boolean {
              return getState(this.nodeState).val;
          }
          public set State(value:boolean) {
              setState(this.nodeState, value);
          }
      
          constructor(address:string) {
              this.subscriptionManager = new SubscriptionManager();
      
             for(let suffix of this.suffixes) {
                  this.nodeState = address + suffix;
                  var node = getState(this.nodeState)
                  var exists = !node.notExist;
                  if(exists && typeof node.val === "boolean") {
                      on(this.nodeState, this.OnStateChanged.bind(this) );
                      break;
                  }
              }
          }
      
          private OnStateChanged():void {
              this.subscriptionManager.Notify(this, Switch.STATE);
          }
      }
      

      Man kann also die Adresse von einem Schalter reinwerfen, und sich dann darauf Subscriben. Dazu habe ich weitere Controller-Klassen, die z. B. Switch-Instanzen mit weiteren Klassen (z. B. LightSource für Licht) verbinden.

      Ich bekomme leider viele Fehler wie diese hier:

      ```
      
      private subscriptionManager:SubscriptionManager;
                                      ^
      ERROR: Cannot find name 'SubscriptionManager'.
      
          public get S():SubscriptionManager { return this.subscriptionManager}
                         ^
      ERROR: Cannot find name 'SubscriptionManager'.
      
              this.subscriptionManager = new SubscriptionManager();
                                             ^
      ERROR: Cannot find name 'SubscriptionManager'.
      
          public get S():SubscriptionManager { return this.subscriptionManager}
                         ^
      ERROR: Return type of public getter 'S' from exported class has or is using private name 'SubscriptionManager'.
      

      Funktionieren tut das ganze komischerweise trotzdem, allerdings nur mit einer alten Version vom javascript-Adapter. Mache ich ein Update, starten die Scripte aufgrund der Fehlermeldungen nicht. Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.

      Hat jemand eine Idee, der sich besser mit Java-/Typescript auskennt? Ich komme eher aus der C++/C#-Ecke ...

      UncleSamU Offline
      UncleSamU Offline
      UncleSam
      Developer
      schrieb am zuletzt editiert von
      #2

      @da-phreak Ich würde wohl nicht Abhängigkeiten zwischen globalen Skripten machen. Ich versuche dort nur helper, Basisklassen oder Konstanten zu definieren. In meinen (normalen) Skripten deklariere ich oben die Klassen und unten instanziere ich sie dann.

      Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
      ♡-lichen Dank an meine Sponsoren

      1 Antwort Letzte Antwort
      0
      • D Offline
        D Offline
        da.phreak
        schrieb am zuletzt editiert von
        #3

        Hmmm, ok. Ich dachte genau dazu sind Scripte gut, die in global liegen. Dann müßte ich das händisch vor jedes Script kopieren. Mit allen Nachteilen ... wenn ich was ändern möchte, muß ich es wieder in alle anderen Scripte reinkopieren.

        Wenn es nicht anderes geht, kann ich es natürlich so machen.

        UncleSamU 1 Antwort Letzte Antwort
        0
        • D da.phreak

          Hmmm, ok. Ich dachte genau dazu sind Scripte gut, die in global liegen. Dann müßte ich das händisch vor jedes Script kopieren. Mit allen Nachteilen ... wenn ich was ändern möchte, muß ich es wieder in alle anderen Scripte reinkopieren.

          Wenn es nicht anderes geht, kann ich es natürlich so machen.

          UncleSamU Offline
          UncleSamU Offline
          UncleSam
          Developer
          schrieb am zuletzt editiert von
          #4

          @da-phreak sagte in Problem mit globalen Scripten:

          Ich dachte genau dazu sind Scripte gut, die in global liegen.

          Ja, absolut, aber wie sollen Abhängigkeiten zwischen globalen Skripten aufgelöst werden? Deshalb würde ich zwischen den globalen Skripten keine Abhängigkeiten machen.

          Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
          ♡-lichen Dank an meine Sponsoren

          1 Antwort Letzte Antwort
          0
          • D Offline
            D Offline
            da.phreak
            schrieb am zuletzt editiert von
            #5

            Ok, ist schon eine starke Einschränkung. Dann muß ich nochmal drüber nachdenken, wie ich das mache, da findet sich sicher ein Weg. Immer wieder reinkopieren ist wirklich unschön.

            1 Antwort Letzte Antwort
            0
            • D Offline
              D Offline
              da.phreak
              schrieb am zuletzt editiert von
              #6

              So, alle Abhängigkeiten entfernt, nu läuft es. Ich gebe nun alle Abhängigkeiten per Constructor-injection rein, in den global-Scripten speichere ich das dann einfach als :any. Nicht schön, aber was soll man machen,

              1 Antwort Letzte Antwort
              0
              • AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                schrieb am zuletzt editiert von AlCalzone
                #7

                Globale Skripte können Abhängigkeiten untereinander haben. Es ist aber äußerst unintuitiv, in welcher Reihenfolge diese aneinandergehängt werden. Ich glaube es geht nach der Reihenfolge, mit der die Objekte erstellt wurden oder sowas komisches.

                Bei dem Aufbau würde ich eher alle globale Grundfunktionalität sowie die Abstraktionen ins selbe globale Skript packen.

                @da-phreak sagte in Problem mit globalen Scripten:

                Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.

                Und warum berichtest du sowas nicht auf Github, damit man das sieht und beheben kann?

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                D 1 Antwort Letzte Antwort
                1
                • AlCalzoneA AlCalzone

                  Globale Skripte können Abhängigkeiten untereinander haben. Es ist aber äußerst unintuitiv, in welcher Reihenfolge diese aneinandergehängt werden. Ich glaube es geht nach der Reihenfolge, mit der die Objekte erstellt wurden oder sowas komisches.

                  Bei dem Aufbau würde ich eher alle globale Grundfunktionalität sowie die Abstraktionen ins selbe globale Skript packen.

                  @da-phreak sagte in Problem mit globalen Scripten:

                  Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.

                  Und warum berichtest du sowas nicht auf Github, damit man das sieht und beheben kann?

                  D Offline
                  D Offline
                  da.phreak
                  schrieb am zuletzt editiert von
                  #8

                  @AlCalzone Ok, wenn die Reihenfolge mehr oder wenig zufällig ist, ist es wohl das beste, Abhängigkeiten zu vermeiden.

                  Ich wollte schon auf Github melden. Zum einen war ich mir nicht sicher, wo, javascript oder virtual-tsc. Zum anderen habe ich versucht, das ganze in einer VM reproduzierbar zu machen. Das ist mir leider nicht gelungen, und ich kenn das ja selber, Bug Reports, die nicht reproduzierbar sind, bringen meist nichts.

                  AlCalzoneA 1 Antwort Letzte Antwort
                  1
                  • D da.phreak

                    @AlCalzone Ok, wenn die Reihenfolge mehr oder wenig zufällig ist, ist es wohl das beste, Abhängigkeiten zu vermeiden.

                    Ich wollte schon auf Github melden. Zum einen war ich mir nicht sicher, wo, javascript oder virtual-tsc. Zum anderen habe ich versucht, das ganze in einer VM reproduzierbar zu machen. Das ist mir leider nicht gelungen, und ich kenn das ja selber, Bug Reports, die nicht reproduzierbar sind, bringen meist nichts.

                    AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @da-phreak Im Zweifel beim Adapter

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    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

                    646

                    Online

                    32.6k

                    Benutzer

                    82.0k

                    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