Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Ändern einer Variable in einer Funktion

    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

    Ändern einer Variable in einer Funktion

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

      Hallo zusammen,

      ich habe eine Funktion die einen übergebenen Text mit einer übergebenen Lautstärke auf einem Echo ausgibt. Das funktioniert soweit.
      Jetzt wollte ich die Funktion dahingehend erweitern, dass sie sich am Anfang die aktuelle/ursprüngliche Lautstärke merkt um diese nach erfolgter Sprachausgabe am Ende wiederherzustellen.

      Nur funktioniert das merken nicht und ich habe keine Idee warum.
      Hier mal der relevante Teil der Funktion:
      funktion.JPG
      Der Output ist
      40 (aktuell eingestellte Lautstärke)
      22 (Testwert, der eigentlich mit den 40 überschrieben werden sollte)

      Die Debugausgabe von 40 zeigt, dass "Wert von ObjektID EchoSpeakVolumeID" das liefert, was ich erwarte.
      Warum funktioniert dann das erste "schreibe" nicht?

      Übrigens: Das untere "schreibe" funktioniert wunderbar und ist ja quasi nur das umgekehrte des oberen "schreibe"

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

        @oetzi
        Den Lautstärke-Wert in einer Variablen (nicht Datenpunkt) merken; übergebene Werte ausgeben und mit Verzögerung die alte Lautstärke schreiben. Stark verkürzt:

        Bild_2021-04-25_164511.png

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

          @paul53
          ah ja, so geht es. Dank dir.

          Würde trotzdem noch gerne verstehen, wann genau man welchen Weg einsetzen muss, damit ich nicht immer try and error machen muss 🙂

          Die Differenzierung die ich mir vorstellen kann ist, dass man "schreibe" nur für Werte von irgendwelchen Objekte nutzen darf und für Variablen eben den oben gezeigten Weg.
          Ist das korrekt?

          Xenon 1 Reply Last reply Reply Quote 0
          • Xenon
            Xenon Forum Testing Developer @oetzi last edited by

            @oetzi variablen sind immer local (also im RAM gespeichert). Hier holst du dir den Wert aus einem DP mit getState (in JS) oder "Wert vom...." in blockly und schreibst in die Variable.

            Wenn du einen state setzen möchtest, machst du das mit setState ('datenpunkt', wert) (in JS), übersetzt in blockly dann "schreibe Objekt ID ...). So steuerst du Datenpunkte in Adaptern an. Der Unterschied zwischen Schreibe und aktualisiere ist auch wichtig:

            Schreibe -> Hallo Adapter, setze mir bitte den Wert XYZ auf 1 -> Antwort Adapter: "Ok, 1 ist plausibel, das mache ich und bestätige dir das"
            Aktualisiere: -> Hallo Adapter, setze mir den Wert XYZ auf 1, du brauchst den nicht prüfen, das mache ich für dich. -> keine Reaktion vom Adapter und folglich keine Änderung des Datenpunktes (zumindest sollte es so sein)

            Wenn du in selbst erstellte Datenpunkte Werte schreiben möchtest, ist es dir überlassen ob "schreibe" oder "aktualisiere". Hier wird es dann nur interessant, auf was dein Trigger lauscht... ich hoffe, dass war ein wenig verständlich 🙂 sonst einfach fragen

            oetzi 1 Reply Last reply Reply Quote 1
            • oetzi
              oetzi @Xenon last edited by

              Vielen lieben Dank für die sehr gute Erklärung! Auch der Vergleich von JS und Blockly hilft fürs Verständnis. Wollte mir ohnehin demnächst mal die JS Welt angucken.

              @xenon said in Ändern einer Variable in einer Funktion:

              Schreibe -> Hallo Adapter, setze mir bitte den Wert XYZ auf 1 -> Antwort Adapter: "Ok, 1 ist plausibel, das mache ich und bestätige dir das"
              Aktualisiere: -> Hallo Adapter, setze mir den Wert XYZ auf 1, du brauchst den nicht prüfen, das mache ich für dich. -> keine Reaktion vom Adapter und folglich keine Änderung des Datenpunktes (zumindest sollte es so sein)

              Hierzu noch eine Nachfrage: Mit "keine Reakton vom Adapter" meinst du, dass er nichts ändert, wenn er den Datenpunkt nicht ändern kann, also z. B. der übergebene Wert vom Typ her nicht passt?

              Dann frage ich mich, wozu es überhaupt Aktualisiere gibt. Eine explizite Prüfung bzw. Rückmeldung ist doch im Zweifel immer besser, auch wenn ich es vorher selber prüfe. Kann sich ja schließlich immer ein Fehler einschleichen.

              Xenon 1 Reply Last reply Reply Quote 0
              • Xenon
                Xenon Forum Testing Developer @oetzi last edited by

                @oetzi aktualisiere ist zb bei alias sehr wichtig. Im Adapter wird immer geprüft ob der state plausibel ist und wird dann entweder nicht akzeptiert oder halt bestätigt

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

                Support us

                ioBroker
                Community Adapters
                Donate

                1.0k
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                3
                6
                230
                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