Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. setStateAsync-Änderungen landen in Endlosschleife

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    setStateAsync-Änderungen landen in Endlosschleife

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

      @sir0drake sagte: aber nicht als Feedback zurück nach B.

      if(obj.state.from != 'system.adapter.javascript.0') setState(...);
      

      verhindert eine Endlosschleife durch das Skript.
      Als Blockly:

      Bild_2021-08-28_190236.png

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

        @paul53

        ich fürchte, das jede Änderung von A oder B von "system.adapter.javascript.0" kommt.
        Von beiden State's, da die Änderungen ja jedes Mal per Script abgefangen werden.

        ich brauche irgendwas, das ich jeweils zur Entscheidung benutzen kann.
        Eine Erweiterung, die ich auch Absender-Ebene setzen kann
        und die bis zur Empfänger-Ebene mitgeht.

        so etwas wie obj.state.ack
        kommt auch vom Absender und wird durchgereicht bis zum Empfänger.
        Ist aber eben nicht nutzbar für meine Zwecke.

        ich schaue mir aber auf jeden Fall noch deine Idee an.

        danke dafür !

        vg

        T paul53 2 Replies Last reply Reply Quote 0
        • T
          ticaki Developer @sir0drake last edited by ticaki

          @sir0drake
          Das denke ich nicht

          Eine Änderung ( kann von Jarvis kommen ) an A soll nach B weitergegeben werden.
          B wird durch ein Skript geändert

          Eine Änderung von der Hardware über B, soll nach A gehen, aber nicht als Feedback zurück nach B.
          B wird durch einen Adapter geändert.

          Aber du könntest auch einfach State A und B vergleichen und eine Übertragung nur auslösen wenn sie nicht gleich sind

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

            @ticaki

            vielen Dank für deinen Input.

            leider komme ich auch hiermit nicht weiter,
            da von beiden Seite Änderungen getriggert werden können.

            ich komme immer wieder an den punkt,
            das ich genau so eine zirkuläre schleife erzeuge
            und ein state den anderen seinen wert zuweisen will.

            Ich bin für jeden weiteren Vorschlag dankbar...

            viele grüße

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

              @sir0drake sagte: jede Änderung von A oder B von "system.adapter.javascript.0" kommt.

              Aus anderen Skripten? Dann füge die Skripte zusammen und verwende Sperrvariablen.

              S 1 Reply Last reply Reply Quote 0
              • B
                BoehserWolf @sir0drake last edited by

                @sir0drake Wie wäre es bei setState mit dem ack zu arbeiten und das entsprechend nach Absender bzw. Script auf true oder false zu setzen?

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

                  @paul53
                  danke Paul.
                  Schaue ich mir an.
                  vg

                  1 Reply Last reply Reply Quote 0
                  • S
                    sir0drake @BoehserWolf last edited by

                    @boehserwolf

                    Hallo Wolf,
                    das war in der tat eine ausgangssituation.
                    Aber auf lange sicht komme ich da in teufels küche,
                    da das ack-flag für anderes bestimmt ist.

                    Aber ja, das flag selbst ist sowas , das vom "Verursacher" an den "Empfänger" durchgereicht wird.

                    hab dank für deinen input

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

                      @sir0drake
                      Ist etwas schwierig gute Vorschläge zu unterbreiten ohne alle Infos zu haben. Was auf jeden Fall funktionieren dürfte ist:
                      Eine weitere Instanz des Scriptadapters installieren, dort dieses Skript laufen lassen mit der von Paul vorgeschlagenen Abfrage.

                      if(obj.state.from != 'system.adapter.javascript.1') setState(...);
                      

                      Dort ist dann klar zu erkennen das die Änderung von diesem Skript kommt und nicht von irgendeinem anderen Skript.

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

                        @ticaki said in setStateAsync-Änderungen landen in Endlosschleife:

                        Ist etwas schwierig gute Vorschläge zu unterbreiten ohne alle Infos zu haben.

                        Hallo ticaki,
                        da hast du sicher recht.
                        Aber es geht mir um ein Grundprinzip, wie ich mehr wie einen Wert in ein SetState kommando packen kann.

                        Im Moment teste ich eine Idee aus, die leider auch so ihre tücken hat.

                        ich packe statt eines Wertes
                        setState( ziel_node, 1 )

                        ein JSON.Object rein

                        let msg = { "val": 10,
                        "txt": "hurra",
                        "ack": false,
                        "fwd": true
                        }
                        setState( ziel_node, JSON.stringify(msg) )

                        Am Ende parse ich in der On(...) Ereigniss das ganze wieder zurück und habe quasi was ich möchte.

                        Nachteil: Der Typ des ziel_nodes ist natürlich immer unterschiedlich. String, number, boolean.
                        Ich zwinge dem ZielNode erst einmal ein artfremden Inhalt auf ( das geht wirklich trotz typ-declaration )
                        und muss sehen wie ich jetzt den Inhalt korrigiert bekomme.
                        eine typeof überprüfung von obj.state.val hilft schon mal.
                        aber da bin ich erst am anfang der tüftelei.

                        Habt alle vielen Dank für euren Input.
                        Viele Leute, viele Ideen !!!!

                        Große Klasse dieses Forum.

                        1 Reply Last reply Reply Quote 0
                        • S
                          sir0drake last edited by

                          dear all,

                          auf meiner Suche bin ich auf folgende Dokumentation gestoßen:
                          attributes for getState/stateChange/setState object:

                          getState method and stateChange event delivers an object with all attributes

                          So habe ich getestet mit:
                          await setStateAsync( _node, {val: 12, from: "FWD", c:"a" } );

                          Am Ende des setState konnte ich im stateChange event folgendes auslesen:
                          {"val":12,"ts":1630432308218,"ack":false,"lc":1630431023088,"from":"FWD","q":0}

                          obj.state.c wird mir zwar im javascript-editor als Option angegeben,
                          nur wird nicht "übertragen".

                          Nun meine Fragen:

                          a) Wird dieses Attribut c ausschließlich von ioBroker gesetzt ?

                          b) Darf ich das Attribut from mit einem String meiner Wahl besetzen,
                          ohne im Hintergrund Chaos anzurichten ?

                          habt dank für eure Antwort(en)

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

                            @sir0drake sagte: a) Wird dieses Attribut c ausschließlich von ioBroker gesetzt ?

                            Gerade getestet: Das Attribut c enthält den Skriptnamen, wenn der Wert mit setState() aus einem Skript gesetzt wurde.

                            log(getState('0_userdata.0.Test.neueZahl'));
                            setState('0_userdata.0.Test.neueZahl'/*neueZahl*/, {val:11, ack:true, c: 'Kommentar'});
                            

                            Log:

                            script.js.common.Neuer_Test: {'val':11,'ack':true,'ts':1630442081839,'q':0,'c':'script.js.common.Neuer_Test','from':'system.adapter.javascript.0','user':'system.user.admin','lc':1630441922443}
                            

                            @sir0drake sagte in setStateAsync-Änderungen landen in Endlosschleife:

                            b) Darf ich das Attribut from mit einem String meiner Wahl besetzen,
                            ohne im Hintergrund Chaos anzurichten ?

                            from wird vom js-controller gesetzt, genauso wie ts, lc, und q.

                            Die Attribute c und user werden an getState() übergeben, aber nicht an on().

                            1 Reply Last reply Reply Quote 2
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            388
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            4
                            13
                            366
                            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