Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Zugriff auf globale Variablen in global Skripten

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Zugriff auf globale Variablen in global Skripten

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @eumats last edited by

      @eumats sagte:

      "Skripte" unter global angelegt. Z.B.:

      globale Variablen
      globale Funktionen
      alle Shelly Geräte
      alle Xiaomi Geräte

      Dir ist bewusst, dass globale Skripte in jedes andere (nicht globale) Skript kopiert werden ?

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

        @paul53
        Nein, das war mir nicht bewusst. Aber ich dachte dafür ist global doch da oder? Oder wo kann soll ich sonst global gültige Dinge definieren?
        Ich stehe da etwas auf dem Schlauch...

        Ich bin da offen für Tipps wie man das besser machen kann.

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

          @AlCalzone

          Variablen, die ich z.B. in der Datei "globale Variablen" definiere können z.B. unter globale Funktionen nicht genutzt werden...

          Es wird dann ein "undefined" ausgegeben.

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

            @eumats sagte:

            dafür ist global doch da oder?

            In der Gruppe global legt man eigene, häufig verwendete Funktionen an. Ich habe nur eine Funktion unter global:

            function runden(val, digits) {
                return Math.round(val * Math.pow(10, digits)) / Math.pow(10, digits);
            }
            

            @eumats sagte in Zugriff auf globale Variablen in global Skripten:

            Ich bin da offen für Tipps wie man das besser machen kann.

            Eigene Module verwenden.

            AlCalzone 1 Reply Last reply Reply Quote 0
            • eumats
              eumats last edited by

              ok. Dann habe ich da wohl ein Verständnisproblem.

              Wo/wie definiere ich dann globale Variablen, Datenpunkte?

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

                @eumats sagte:

                Datenpunkte?

                Datenpunkte sind immer global (Skript übergreifend verfügbar).

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

                  @paul53

                  Heist das ich kann einem Datenpunkt einen Namen zuweise der dann global verfügbar ist?

                  Wie mache ich z.B. den folgenden Datenpunkt so global bekannt, dass ich potentiell in jedem Skript nutzen könnte?
                  javascript.0.virtualDevice.Sensoren.Regen.Regensensor

                  paul53 2 Replies Last reply Reply Quote 0
                  • paul53
                    paul53 @eumats last edited by

                    @eumats sagte:

                    dass ich potentiell in jedem Skript nutzen könnte?

                    Jeder Datenpunkt kann in jedem Skript genutzt werden. Falls der Name "Regensensor" und dieser eindeutig ist, kann die ID aus dem Namen ermittelt werden:

                    let regen = getState(getIdByName('Regensensor')).val;
                    
                    1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer @paul53 last edited by

                      @paul53 sagte in Zugriff auf globale Variablen in global Skripten:

                      Eigene Module verwenden.

                      Nachteilig ist hierbei, dass es da keine Syntax-Hilfe gibt. Und TypeScript-Skripte werden so auch nicht funktionieren.
                      Wenn das nicht stört, ok.

                      @eumats sagte in Zugriff auf globale Variablen in global Skripten:

                      Es wird dann ein "undefined" ausgegeben.

                      Kannst du mir mal so ein Skript (oder einen Auszug) zeigen?
                      Ich war bisher der Ansicht, dass das funktioniert.

                      eumats N 2 Replies Last reply Reply Quote 0
                      • OstfrieseUnterwegs
                        OstfrieseUnterwegs @eumats last edited by

                        @eumats sagte in Zugriff auf globale Variablen in global Skripten:

                        Variablen, die ich z.B. in der Datei "globale Variablen" definiere können z.B. unter globale Funktionen nicht genutzt werden...
                        Es wird dann ein "undefined" ausgegeben.

                        Ich glaub, das kann nicht funktionieren. Das Prinzip ist ja, dass die Scripte in 'global' quasi zur Laufzeit an den Anfang eines jeden anderen Scriptes kopiert werden. Außer das Script ist selber in 'global'. Die global Scripte sind quasi voneinander isoliert. Ansonsten würde es ja eine ziemliche rekursive hin-und-her Kopiererei geben.

                        1 Reply Last reply Reply Quote 0
                        • AlCalzone
                          AlCalzone Developer last edited by

                          Wenn die Reihenfolge stimmt, dann schon (erst Variablen, dann Funktionen, die diese nutzen). Wie man das garantiert, weiß ich aber gerade auch nicht - mein Skripte-Tab lädt nicht.

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

                            @eumats sagte:

                            Wie mache ich z.B. den folgenden Datenpunkt so global bekannt, dass ich potentiell in jedem Skript nutzen könnte?

                            Habe es getestet. Im globalen Skript globalIDs:

                            const idRegen = 'javascript.0.virtualDevice.Sensoren.Regen.Regensensor';
                            

                            In einem Test-Skript unter common:

                            globalIDs.JPG

                            Es ist also möglich, immer wieder benötigte IDs unter global zuzuweisen. Der Editor meckert natürlich, da die ID nicht innerhalb des editierten Skripts deklariert ist. Das macht er aber auch bei Aufruf globaler Funktionen.

                            AlCalzone eumats 2 Replies Last reply Reply Quote 2
                            • AlCalzone
                              AlCalzone Developer @paul53 last edited by

                              @paul53 sagte in Zugriff auf globale Variablen in global Skripten:

                              Der Editor meckert natürlich

                              Spätestens nach dem Speichern und erneuten Laden des Skript-Tabs sollte er das nicht mehr tun:
                              dcb826de-8c9b-4b4a-aa93-a4850e16446a-grafik.png
                              Die Variable ist im globalen Skript definiert.

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

                                @AlCalzone sagte:

                                nach dem Speichern und erneuten Laden des Skript-Tabs sollte er das nicht mehr tun:

                                Stimmt.

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

                                  @paul53

                                  Genau. So herum klappt es. Also in global definieren und in common nutzen. Nur die Nutzung in einem anderen global Skript nicht.

                                  1 Reply Last reply Reply Quote 0
                                  • eumats
                                    eumats @AlCalzone last edited by

                                    @AlCalzone

                                    Man kann das gut analog zum Test von paul53 testen. Nur das beide Skripte in global liegen.

                                    Also z.B.:

                                    Skript 1: const idRegen = 'javascript.0.virtualDevice.Sensoren.Regen.Regensensor';
                                    Skript 2: log(idRegen)
                                    

                                    Bei mir kommt dann im Log ein "undefined".

                                    AlCalzone 1 Reply Last reply Reply Quote 0
                                    • AlCalzone
                                      AlCalzone Developer @eumats last edited by

                                      @eumats Bei mir nicht und es scheint daran zu liegen, in welcher Reihenfolge die globalen Skripte angelegt wurden. Die folgenden wurden in der Reihenfolge g1, g2, c erstellt:

                                      // global/g1
                                      const foo = "123";
                                      
                                      // global/g2
                                      log(foo);
                                      
                                      // common/c
                                      log("abc")
                                      

                                      174bc9cd-a8ad-4a36-86fe-7011f0c7ff32-grafik.png

                                      Füge ich jetzt aber ein zusätzliches globales Skript ein und erstelle darin eine ID, habe ich aus den vorher existierenden keinen Zugriff darauf, unabhängig vom Namen.

                                      paul53 1 Reply Last reply Reply Quote 1
                                      • paul53
                                        paul53 @AlCalzone last edited by paul53

                                        @AlCalzone sagte:

                                        in welcher Reihenfolge die globalen Skripte angelegt wurden.

                                        Ja, bei Deklaration mit const und let. Siehe Ausschnitt aus Mozilla:

                                        Für const gelten die gleichen Regel hinsichtlich der toten Zone wie für let. Auch Konstanten sind erst nach ihrer Deklaration verfügbar, nicht jedoch zwischen dem Beginn des Blocks und der Deklaration.
                                        Dies ist ein Unterschied zur Variablendeklaration mit var. Mit var deklarierte Variablen sind in der gesamten Funktion verfügbar, in der sie deklariert wurden, selbst falls die Variablendeklaration die letzte Anweisung der Funktion war.

                                        Abhilfe: Deklaration mit var

                                        1 Reply Last reply Reply Quote 2
                                        • eumats
                                          eumats last edited by

                                          Die korrekte Reihenfolge unter global war die Lösung. Ich habe jetzt die Datei mit den globalen Variablen in "1_globaleVariablen" und die Datei in der sie u.a. genutzt werden in "8_steuereRollaedenEG" umbenannt. Und schon klappt das Ganze! Die Variable werden mit var definiert.

                                          Danke für Eure Hilfe...

                                          1 Reply Last reply Reply Quote 0
                                          • N
                                            noox @AlCalzone last edited by noox

                                            @AlCalzone said in Zugriff auf globale Variablen in global Skripten:

                                            Zum Thema eigene Module und TypeScript:

                                            Nachteilig ist hierbei, dass es da keine Syntax-Hilfe gibt. Und TypeScript-Skripte werden so auch nicht funktionieren.

                                            Syntax-Hilfe für TypeScript hätte ich sogar zusammengebracht. Ich hab mir gestern Visual Studio Code installiert und Remote Development eingerichtet.

                                            Im eigenen Script dann oben hinzugefügt:

                                            /// <reference path='../../node_modules/iobroker.javascript/lib/javascript.d.ts' />
                                            

                                            Ob das sinnvoll ist, weiß ich nicht. Aber da ich mit TypeScript dann sowieso nicht weiter komme, eher nicht:

                                            Ich hab bisher nur das eine oder andere Angular-Projekt im Visual Studio (nicht Code) eingerichtet. Und bin daher bezüglich TypeScript-Einrichten alles andere als ein Experte. Aber ich befürchte, dass es nicht möglich ist, ein eigenes TS-Script in den Build-Prozess zu integrieren, sodass es dann mit

                                            import { Light } from '../../../iobroker-data/modules/Light';
                                            

                                            oder ähnlich eingebunden werden kann. Oder gibt's eine andere Möglichkeit, es einzubinden?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            548
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            5
                                            23
                                            2555
                                            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