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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. setStateAsync in externem js-file evtl mit require??

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

setStateAsync in externem js-file evtl mit require??

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
7 Beiträge 4 Kommentatoren 317 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.
  • A Offline
    A Offline
    Axel21
    schrieb am zuletzt editiert von Axel21
    #1

    Hallo zusammen!
    Ich habe eine JS-Funktion, die eine ausgelagerte Funktion aufruft:

    // Beschreibe diese Funktion …
    async function mywrite(cmd) {
        my = require('../../../iobroker-data/modules/mod1.js');
        result = await my.mywrite(cmd);
    // weiteres
        return result;
    }
    

    die Datei mod1.js lautet

    async function mywrite(cmd) { 
    // do some stuff
    // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
      return myresult; 
    }
    
    

    Wie setzt man in dieser augelagerten Datei einen iobroker-state 0_userdata.0.errstate??
    Die Funktionen setState und setStateAsync sind in der ausgelagerten Datei nicht verfügbar!
    Ich vermute, man muss am Anfang der ausgelagerten Datei ein require einfügen. Nur welches Module und wie genau mache ich das?
    Ich habe im Netz mir einen Wolf gesucht, daher wäre ich dankbar über

    1. Eine Lösung
    2. Einen Hinweis nach welchen Stichworten ich hätte suchen müssen, um die Lösung selbst herauszufinden.

    Danke!

    Warum die ausgelagerte Datei? Weil die Funktion dort sehr lange ist und immer mal wieder geändert werden muss und in vielen Skripten Verwendung findet. Mir ist bekannt, dass ich den javascript-Adapter nach jeder Änderung dieser ausgelagerten Datei neu starten muss. Und bisher möchte ich mich nicht in die Adapter-Entwicklung einarbeiten, außer es geht nicht anders.

    AsgothianA OliverIOO 2 Antworten Letzte Antwort
    0
    • A Axel21

      Hallo zusammen!
      Ich habe eine JS-Funktion, die eine ausgelagerte Funktion aufruft:

      // Beschreibe diese Funktion …
      async function mywrite(cmd) {
          my = require('../../../iobroker-data/modules/mod1.js');
          result = await my.mywrite(cmd);
      // weiteres
          return result;
      }
      

      die Datei mod1.js lautet

      async function mywrite(cmd) { 
      // do some stuff
      // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
        return myresult; 
      }
      
      

      Wie setzt man in dieser augelagerten Datei einen iobroker-state 0_userdata.0.errstate??
      Die Funktionen setState und setStateAsync sind in der ausgelagerten Datei nicht verfügbar!
      Ich vermute, man muss am Anfang der ausgelagerten Datei ein require einfügen. Nur welches Module und wie genau mache ich das?
      Ich habe im Netz mir einen Wolf gesucht, daher wäre ich dankbar über

      1. Eine Lösung
      2. Einen Hinweis nach welchen Stichworten ich hätte suchen müssen, um die Lösung selbst herauszufinden.

      Danke!

      Warum die ausgelagerte Datei? Weil die Funktion dort sehr lange ist und immer mal wieder geändert werden muss und in vielen Skripten Verwendung findet. Mir ist bekannt, dass ich den javascript-Adapter nach jeder Änderung dieser ausgelagerten Datei neu starten muss. Und bisher möchte ich mich nicht in die Adapter-Entwicklung einarbeiten, außer es geht nicht anders.

      AsgothianA Offline
      AsgothianA Offline
      Asgothian
      Developer
      schrieb am zuletzt editiert von Asgothian
      #2

      @axel21 ich würde das so lösen:

      async function mywrite(cmd, setStateFunc) { 
      // do some stuff
        if (typeof setStateFunc === "function") await setStateFunc('0_userdata.0.errstate', true)
      // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
        return myresult; 
      }
      

      Aufruf mit

      await mywrite(cmd, setStateAsync);
      

      A.

      ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
      "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

      1 Antwort Letzte Antwort
      0
      • A Axel21

        Hallo zusammen!
        Ich habe eine JS-Funktion, die eine ausgelagerte Funktion aufruft:

        // Beschreibe diese Funktion …
        async function mywrite(cmd) {
            my = require('../../../iobroker-data/modules/mod1.js');
            result = await my.mywrite(cmd);
        // weiteres
            return result;
        }
        

        die Datei mod1.js lautet

        async function mywrite(cmd) { 
        // do some stuff
        // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
          return myresult; 
        }
        
        

        Wie setzt man in dieser augelagerten Datei einen iobroker-state 0_userdata.0.errstate??
        Die Funktionen setState und setStateAsync sind in der ausgelagerten Datei nicht verfügbar!
        Ich vermute, man muss am Anfang der ausgelagerten Datei ein require einfügen. Nur welches Module und wie genau mache ich das?
        Ich habe im Netz mir einen Wolf gesucht, daher wäre ich dankbar über

        1. Eine Lösung
        2. Einen Hinweis nach welchen Stichworten ich hätte suchen müssen, um die Lösung selbst herauszufinden.

        Danke!

        Warum die ausgelagerte Datei? Weil die Funktion dort sehr lange ist und immer mal wieder geändert werden muss und in vielen Skripten Verwendung findet. Mir ist bekannt, dass ich den javascript-Adapter nach jeder Änderung dieser ausgelagerten Datei neu starten muss. Und bisher möchte ich mich nicht in die Adapter-Entwicklung einarbeiten, außer es geht nicht anders.

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

        @axel21

        wenn man globalThis mit übergibt, bekommt man einen zeiger auf den aktuellen kontext in dem dann alle befehle verfübar sind

        function test(iob) {
            console.log(iob);
            iob.setStateAsync(......
        }
        test(globalThis);
        

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

        T 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @axel21

          wenn man globalThis mit übergibt, bekommt man einen zeiger auf den aktuellen kontext in dem dann alle befehle verfübar sind

          function test(iob) {
              console.log(iob);
              iob.setStateAsync(......
          }
          test(globalThis);
          
          T Nicht stören
          T Nicht stören
          ticaki
          schrieb am zuletzt editiert von
          #4

          @oliverio
          ist das neue? letztes oder vorletztes Jahr ging das noch mit this

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          OliverIOO 1 Antwort Letzte Antwort
          0
          • T ticaki

            @oliverio
            ist das neue? letztes oder vorletztes Jahr ging das noch mit this

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

            @ticaki
            Habe jetzt erst danach geschaut.
            Weiß nicht wann das eingeführt wurde.

            this könnte schwierig sein, wenn du dich in einem objekt kontext befindest. da ist dann this uU nicht identisch.

            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
            • OliverIOO OliverIO

              @ticaki
              Habe jetzt erst danach geschaut.
              Weiß nicht wann das eingeführt wurde.

              this könnte schwierig sein, wenn du dich in einem objekt kontext befindest. da ist dann this uU nicht identisch.

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

              @oliverio @ticaki @Asgothian
              Ein ganz herzliches Dankeschön! Drei Lösungen, die funktionieren. :-)

              @oliverio @ticaki:
              Aus Euren Beiträgen habe ich verstanden, warum ich beim Suchen im Netz nicht fündig wurde: Ich habe nach dem Falschen gesucht. Ich wollte die gesuchte Funktion erneut einbinden. Jetzt habe ich verstanden, dass es darum geht, den this Kontext mit zu übergeben. Dann kann ich in der include-Datei auf alles was ich möchte zugreifen - wunderbar!
              Mit dieser Lösung kann ich meinen state iobroker-State 0_userdata.0.errstate im Fehlerfall setzten und diesen im Hauptprogramm dann mit einer Fehlerbehandlung weiterverfolgen. Das ist genau das, was ich für mein großes Script brauche, das einen größeren Ablauf steuert und im Fehlerfall dann in den "Error"-Zustand versetzt wird. Prima!

              @Asgothian: Auch Deine Lösung, eine Funktion mit zu übergeben, funktioniert.
              Durch Deinen Post habe ich nocheinmal über eine callback-Funktion nachgedacht. Denn in einem anderen main Skript möchte ich - ohne states - einfach nur die Variable senderror im main-Prog durch das Include-Prg. setzen.

              Das hatte ich zunächst verworfen, denn ich dachte fälschlicherweise, die callback-Funktion wird im context der include-Datei ausgeführt und damit wäre das Setzen meiner senderror-Variable des main-Programmes in diesem context nicht möglich.
              Dennoch funktioniert es!
              Wenn ich also (in einem anderen Skript) nur einen Schreibbefehl habe, dann kann ich mit

               my = require('../../../iobroker-data/modules/mod1.js');
               result = await my.mywrite(cmd, (h) => {senderror=(h)});
              

              meine Variable errstate im main-Programm setzten und direkt abfragen, wenn ich in der includedatei mod1.js die callbackfunktion aufrufe.

              async function mywrite(cmd, callback) { 
              // do some stuff
              // im Fehlerfall: 
              callback("ERROR77");
              return myresult; 
              }
              

              Dass dies funktioniert, zeigt, dass ich noch einiges zu lernen habe über JS-scopes und JS-this (das anders ist als java-this). Bei der Internetrecherche bin ich dann auf .call und .bind gestoßen und .... Puh, es ist kompliziert.

              Dabei will ich ja eigentlich nur ein einfaches #include(mod1.js). Das wäre so einfach, kein scope-Wechsel, kein require, kein this. Aber dass es #include nicht gibt, wurde in einem anderen Beitrag im Forum ja schon mehrfach erläutert.

              So damit habe ich jetzt zwei Lösungen. Eine "große" und eine "kleine" und ich sage nochmals

              D A N K E

              für die passenden und schnellen Lösungen!

              OliverIOO 1 Antwort Letzte Antwort
              0
              • A Axel21

                @oliverio @ticaki @Asgothian
                Ein ganz herzliches Dankeschön! Drei Lösungen, die funktionieren. :-)

                @oliverio @ticaki:
                Aus Euren Beiträgen habe ich verstanden, warum ich beim Suchen im Netz nicht fündig wurde: Ich habe nach dem Falschen gesucht. Ich wollte die gesuchte Funktion erneut einbinden. Jetzt habe ich verstanden, dass es darum geht, den this Kontext mit zu übergeben. Dann kann ich in der include-Datei auf alles was ich möchte zugreifen - wunderbar!
                Mit dieser Lösung kann ich meinen state iobroker-State 0_userdata.0.errstate im Fehlerfall setzten und diesen im Hauptprogramm dann mit einer Fehlerbehandlung weiterverfolgen. Das ist genau das, was ich für mein großes Script brauche, das einen größeren Ablauf steuert und im Fehlerfall dann in den "Error"-Zustand versetzt wird. Prima!

                @Asgothian: Auch Deine Lösung, eine Funktion mit zu übergeben, funktioniert.
                Durch Deinen Post habe ich nocheinmal über eine callback-Funktion nachgedacht. Denn in einem anderen main Skript möchte ich - ohne states - einfach nur die Variable senderror im main-Prog durch das Include-Prg. setzen.

                Das hatte ich zunächst verworfen, denn ich dachte fälschlicherweise, die callback-Funktion wird im context der include-Datei ausgeführt und damit wäre das Setzen meiner senderror-Variable des main-Programmes in diesem context nicht möglich.
                Dennoch funktioniert es!
                Wenn ich also (in einem anderen Skript) nur einen Schreibbefehl habe, dann kann ich mit

                 my = require('../../../iobroker-data/modules/mod1.js');
                 result = await my.mywrite(cmd, (h) => {senderror=(h)});
                

                meine Variable errstate im main-Programm setzten und direkt abfragen, wenn ich in der includedatei mod1.js die callbackfunktion aufrufe.

                async function mywrite(cmd, callback) { 
                // do some stuff
                // im Fehlerfall: 
                callback("ERROR77");
                return myresult; 
                }
                

                Dass dies funktioniert, zeigt, dass ich noch einiges zu lernen habe über JS-scopes und JS-this (das anders ist als java-this). Bei der Internetrecherche bin ich dann auf .call und .bind gestoßen und .... Puh, es ist kompliziert.

                Dabei will ich ja eigentlich nur ein einfaches #include(mod1.js). Das wäre so einfach, kein scope-Wechsel, kein require, kein this. Aber dass es #include nicht gibt, wurde in einem anderen Beitrag im Forum ja schon mehrfach erläutert.

                So damit habe ich jetzt zwei Lösungen. Eine "große" und eine "kleine" und ich sage nochmals

                D A N K E

                für die passenden und schnellen Lösungen!

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

                @axel21

                ja scopes ist schon ein Thema, was man erst nach einer weile versteht.
                Wer kennt schon den Unterschied zwischen var und let oder einer normalen Function oder einer Arrow Function ()->
                Hier gute quellen zur Erklärung.
                https://javascript.info/variables
                https://javascript.info/closure

                sowie 2.15-2.17 + 6.6,6.7,6.10,6.11

                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
                1
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                731

                Online

                32.4k

                Benutzer

                81.4k

                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