NEWS
Ändern einer Variable in einer Funktion
-
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:
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"
-
@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: -
@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? -
@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
-
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.
-
@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