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. javascript-Adapter bindet console.log nicht ein bei require

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.0k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

javascript-Adapter bindet console.log nicht ein bei require

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
13 Beiträge 3 Kommentatoren 535 Aufrufe 3 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.
  • T ticaki

    @axel21

    benutze doch this.log()

    A Offline
    A Offline
    Axel21
    schrieb am zuletzt editiert von
    #4

    @ticaki
    Vielen Dank für die schnelle Antwort.
    Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

    Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
    Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
    Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

    Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
    Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
    Aber dazu muss dann eben wieder this übergeben werden.

    Leider ist das keine Lösung. Danke dennoch!

    OliverIOO T 2 Antworten Letzte Antwort
    0
    • A Axel21

      @ticaki
      Vielen Dank für die schnelle Antwort.
      Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

      Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
      Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
      Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

      Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
      Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
      Aber dazu muss dann eben wieder this übergeben werden.

      Leider ist das keine Lösung. Danke dennoch!

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #5

      @axel21

      Nach dem Beispiel von oben müsste es

      this1.log

      heißen.
      Log ist ein Befehl des JavaScript Adapters

      Hier der link zur typdefinition von Log
      https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/src/lib/javascript.d.ts#L1144

      Direkt darunter sieht man auch die Umleitung von console.
      Also ist console nun auch Bestandteil des globalen Objekts

      Wenn du vor console immer dein this1 davor schreibst funktioniert es.

      Also
      this1.console.log(.....

      Das Konzept nennt sich shadowing
      https://www.geeksforgeeks.org/javascript/variable-shadowing-in-javascript/

      In JavaScript ist ja nix geschützt. Auch interne Funktionen können überschrieben werden oder erweitert werden. Da gibt es schöne Beispiele wie bspw das String Objekt mit weiteren Funktionen erweitern , die exakt so angewendet werden können wie die bereits eingebauten.

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      A 1 Antwort Letzte Antwort
      0
      • A Axel21

        @ticaki
        Vielen Dank für die schnelle Antwort.
        Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

        Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
        Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
        Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

        Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
        Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
        Aber dazu muss dann eben wieder this übergeben werden.

        Leider ist das keine Lösung. Danke dennoch!

        T Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von
        #6

        @axel21
        Ich denke wie @OliverIO das du nicht this1.log() verwendet hast, falls doch.

        kannst du auch die log funktion übergeben und diese Verwenden.

        function function1 (a, this1, log){
                  // do some stuff
                  log('console.log innerhalb function1');
                  log('console.debug innerhalb function1');
                 return a+1;
             }
         exports.function1 = function1;
        
        foo = require('../../../iobroker-data/modules/modneu.js');
        console.log(foo.function1(9, this, log));
        

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        OliverIOO 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @axel21

          Nach dem Beispiel von oben müsste es

          this1.log

          heißen.
          Log ist ein Befehl des JavaScript Adapters

          Hier der link zur typdefinition von Log
          https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/src/lib/javascript.d.ts#L1144

          Direkt darunter sieht man auch die Umleitung von console.
          Also ist console nun auch Bestandteil des globalen Objekts

          Wenn du vor console immer dein this1 davor schreibst funktioniert es.

          Also
          this1.console.log(.....

          Das Konzept nennt sich shadowing
          https://www.geeksforgeeks.org/javascript/variable-shadowing-in-javascript/

          In JavaScript ist ja nix geschützt. Auch interne Funktionen können überschrieben werden oder erweitert werden. Da gibt es schöne Beispiele wie bspw das String Objekt mit weiteren Funktionen erweitern , die exakt so angewendet werden können wie die bereits eingebauten.

          A Offline
          A Offline
          Axel21
          schrieb am zuletzt editiert von
          #7

          @oliverio
          Danke, da haben sich die Posts zeitlich überschnitten.

          Nochmal in Kürze:
          Es existiert ein Workaround, ich komme also zurecht.
          a) Aufrufende Funktion um ", this" ergänzen
          b) Aufgerufene Funktion um ", this1" ergänzen.
          c) this1.console.log oder this1.log verwenden.

          Das finde ich reichlich umständlich für ein console.log() zum debuggen.

          Außerdem von der Systematik her:
          console.log schreibt im require-scope "irgendwo" hin, nur wohin???
          Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

          Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
          In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

          Soweit zur Erläuterung hope that helps.
          Tks!

          T OliverIOO 2 Antworten Letzte Antwort
          0
          • A Axel21

            @oliverio
            Danke, da haben sich die Posts zeitlich überschnitten.

            Nochmal in Kürze:
            Es existiert ein Workaround, ich komme also zurecht.
            a) Aufrufende Funktion um ", this" ergänzen
            b) Aufgerufene Funktion um ", this1" ergänzen.
            c) this1.console.log oder this1.log verwenden.

            Das finde ich reichlich umständlich für ein console.log() zum debuggen.

            Außerdem von der Systematik her:
            console.log schreibt im require-scope "irgendwo" hin, nur wohin???
            Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

            Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
            In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

            Soweit zur Erläuterung hope that helps.
            Tks!

            T Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von ticaki
            #8

            @axel21
            Du kannst doch auch

            function bla(this1) {
              const console = this1.console;
              //...
              console.log('geht... yeah! :)');
            }
            

            an den anfang schreiben :)

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            A 1 Antwort Letzte Antwort
            0
            • T ticaki

              @axel21
              Ich denke wie @OliverIO das du nicht this1.log() verwendet hast, falls doch.

              kannst du auch die log funktion übergeben und diese Verwenden.

              function function1 (a, this1, log){
                        // do some stuff
                        log('console.log innerhalb function1');
                        log('console.debug innerhalb function1');
                       return a+1;
                   }
               exports.function1 = function1;
              
              foo = require('../../../iobroker-data/modules/modneu.js');
              console.log(foo.function1(9, this, log));
              
              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von
              #9

              @ticaki

              Doch, genau this1.log meine ich.
              Er übergibt an seine Funktion ja das globale Objekt des JavaScript Adapters.
              Dort ist console und log entsprechend definiert.
              Wenn er es dann in seinen eingebauten Funktionen verwenden will, muss er das entsprechend immer voranschreiten.

              Jetzt etwas hacking, was ich auch noch nicht probiert habe.

              global ist die variable die den aktuellen globalen context enthält.
              Wenn er nun versucht am Anfang einer Funktion bspw mit

              global = this1;

              Diesen globalen context zu korrigieren, dann müsste
              console.log wieder funktionieren.

              Aber keine Ahnung ob global beschreibbar ist.

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              1 Antwort Letzte Antwort
              0
              • A Axel21

                @oliverio
                Danke, da haben sich die Posts zeitlich überschnitten.

                Nochmal in Kürze:
                Es existiert ein Workaround, ich komme also zurecht.
                a) Aufrufende Funktion um ", this" ergänzen
                b) Aufgerufene Funktion um ", this1" ergänzen.
                c) this1.console.log oder this1.log verwenden.

                Das finde ich reichlich umständlich für ein console.log() zum debuggen.

                Außerdem von der Systematik her:
                console.log schreibt im require-scope "irgendwo" hin, nur wohin???
                Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

                Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
                In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

                Soweit zur Erläuterung hope that helps.
                Tks!

                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von
                #10

                @axel21

                Ich vermute, das mit require ein normaler und nicht der vm context erzeugt wird. In diesem sind die ganzen funktionsdefinitionen und Umleitungen aber nicht mehr vorhanden. Daher muss man diese Korrekturen umsetzen.

                Ideal wäre es nun, wenn der require Befehl für den JavaScript Adapter ebenfalls erweitert wird, so das er dort auch den JavaScript context mit bereitstellt.

                Probiere mal das mit dem zuweisen zur variable global. Wenn das funktioniert,
                Könnte ich dir einen workaround zeigen, bei dem man nach require nur einen Befehl ausführen muss um dann alles ganz normal zu verwenden.

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                A 1 Antwort Letzte Antwort
                0
                • T ticaki

                  @axel21
                  Du kannst doch auch

                  function bla(this1) {
                    const console = this1.console;
                    //...
                    console.log('geht... yeah! :)');
                  }
                  

                  an den anfang schreiben :)

                  A Offline
                  A Offline
                  Axel21
                  schrieb am zuletzt editiert von
                  #11

                  @ticaki
                  Ok Danke für diesen Tipp.
                  Der Post läuft gerade in eine andere Richtung als gedacht.

                  Ich habe drei Lösungen wie ich im require-scope ein log in die iobroker-console loggen kann.
                  Alle diese Lösungen erfordern das übergeben von "this" über die Funktion.

                  Für mich ist dieser Teil abgeschlossen.

                  Offen bleibt für mich und darum geht es mir:
                  Ist es so richtig im iobroker-javascript-Adapter implementiert?
                  Ist es so gewollt, dass die Ausgabe eines einfachen console.log im require-scope ohne this-trick - im nirgendwo landet?
                  Ist es gewollt, dass console.log im main und im require-scope an unterschiedliche Stellen (iobroker-console vs. nirgendwo) hinloggen.
                  Ist es gewollt, dass die iobroker-javascript-engine sich hier anders verhält als ein andere engine (hier node.js). Hier bekomme ich in beiden scopes das logging an die gleiche Stelle und kann es dort lesen.

                  Das ist meine Frage. Wenn die erfahrenen Leute hier sagen: "Ist so ok", dann -> closed.

                  1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @axel21

                    Ich vermute, das mit require ein normaler und nicht der vm context erzeugt wird. In diesem sind die ganzen funktionsdefinitionen und Umleitungen aber nicht mehr vorhanden. Daher muss man diese Korrekturen umsetzen.

                    Ideal wäre es nun, wenn der require Befehl für den JavaScript Adapter ebenfalls erweitert wird, so das er dort auch den JavaScript context mit bereitstellt.

                    Probiere mal das mit dem zuweisen zur variable global. Wenn das funktioniert,
                    Könnte ich dir einen workaround zeigen, bei dem man nach require nur einen Befehl ausführen muss um dann alles ganz normal zu verwenden.

                    A Offline
                    A Offline
                    Axel21
                    schrieb am zuletzt editiert von
                    #12

                    @oliverio
                    Zu Deinem Trick mit "global". Eben ausprobiert:

                    function function1 (a,this1) {
                        global=this1;
                        this1.console.log('innerhalb function1 this1.console.info'); // wird geloggt
                        console.log('innerhalb function1 mit global-Trick'); // wird leider ins nirgendwonicht geloggt
                    return a+1;
                    }
                    exports.function1 = function1;
                    
                    

                    mit Aufruf

                    foo = require('../../../iobroker-data/modules/modneu.js');
                    console.log(foo.function1(9, this));
                    

                    Leider nein: Aber einen solchen Hack hatte ich bei java vor jahren einmal. Mit einigen (internen und problematischen) Funktionen war es meiner Erinnerung nach möglich, den Kontext der aufrufenden Funktion zu ermitteln. War nicht lehrbuchgemäß, hatte aber funktioniert.

                    Danke dennoch, jetzt wissen wir, dass es so nicht geht.
                    Und wenn kein Erfahrener hier meint, dass man das an die javascript-Adapter-Leute weitermelden soll, dann ist es auch für mich gut.
                    Danke nochmals an alle, die bisher mitgedacht haben.

                    OliverIOO 1 Antwort Letzte Antwort
                    0
                    • A Axel21

                      @oliverio
                      Zu Deinem Trick mit "global". Eben ausprobiert:

                      function function1 (a,this1) {
                          global=this1;
                          this1.console.log('innerhalb function1 this1.console.info'); // wird geloggt
                          console.log('innerhalb function1 mit global-Trick'); // wird leider ins nirgendwonicht geloggt
                      return a+1;
                      }
                      exports.function1 = function1;
                      
                      

                      mit Aufruf

                      foo = require('../../../iobroker-data/modules/modneu.js');
                      console.log(foo.function1(9, this));
                      

                      Leider nein: Aber einen solchen Hack hatte ich bei java vor jahren einmal. Mit einigen (internen und problematischen) Funktionen war es meiner Erinnerung nach möglich, den Kontext der aufrufenden Funktion zu ermitteln. War nicht lehrbuchgemäß, hatte aber funktioniert.

                      Danke dennoch, jetzt wissen wir, dass es so nicht geht.
                      Und wenn kein Erfahrener hier meint, dass man das an die javascript-Adapter-Leute weitermelden soll, dann ist es auch für mich gut.
                      Danke nochmals an alle, die bisher mitgedacht haben.

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #13

                      @axel21

                      Gut, workaround ist da, ich werde bei Gelegenheit selber mal experimentieren.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      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

                      598

                      Online

                      32.5k

                      Benutzer

                      81.6k

                      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