Mathematische Operation mit einer „Szene-Variablen“ durchführen

Hallo,

Vielen Dank für das Teilen dieser API! Und vielen Dank für die laufenden Anpassungen, um sie nutzen zu können.

Ich habe versucht, das Ergebnis der Berechnung in eines meiner Geräte zu injizieren, aber es funktioniert nicht.

Die URL des Posts: https://api.gladysgateway.com/v1/api/device/state/

Ich habe die Injektion ohne die Variable versucht und es funktioniert.

Mache ich etwas falsch oder ist das Ergebnis der API nicht im richtigen Format?

Vielen Dank für Ihre Hilfe

Bist du sicher, was der Inhalt der Variable ist? Hast du in einer Aktion „Nachricht senden“ getestet, was sie zurückgibt?

Hallo @pierre-gilles, die Nachrichtenübermittlung funktioniert gut.

Falls nötig, hier ist der Auszug der MQTT-Gerätefunktion:

@PhilippeMA Alles scheint in Ordnung zu sein. Ich habe auf der Seite von Gladys Plus nachgeschaut, ob ein Fehler aufgetreten ist, aber nichts.

Kannst du vielleicht deine Gladys-Logs zum Zeitpunkt des Senden der Anfrage überprüfen?

Gut gesehen, da ist ein Fehler:

2022-10-04T10:04:30+0200 <warn> scene.executeActions.js:37 (executeAction) Error: Parsefehler in Zeile 2:
...": {{1.0.data.result}}}
-----------------------^
Erwartet wurde 'CLOSE', 'OPEN_SEXPR', 'ID', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', gefunden wurde 'CLOSE_UNESCAPED'
    at Parser.parseError (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js:267:19)
    at Parser.parse (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js:336:30)
    at parseWithoutProcessing (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js:46:33)
    at HandlebarsEnvironment.parse (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js:52:13)
    at compileInput (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:508:19)
    at ret (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:517:18)
    at Object.http.request (/src/server/lib/scene/scene.actions.js:250:76)
    at executeAction (/src/server/lib/scene/scene.executeActions.js:32:35)
    at /src/server/lib/scene/scene.executeActions.js:66:13
    at tryCatcher (/src/server/node_modules/bluebird/js/release/util.js:16:23)
    at MappingPromiseArray._promiseFulfilled (/src/server/node_modules/bluebird/js/release/map.js:68:38)
    at MappingPromiseArray.PromiseArray._iterate (/src/server/node_modules/bluebird/js/release/promise_array.js:115:31)
    at MappingPromiseArray.init (/src/server/node_modules/bluebird/js/release/promise_array.js:79:10)
    at MappingPromiseArray._asyncInit (/src/server/node_modules/bluebird/js/release/map.js:37:10)
    at _drainQueueStep (/src/server/node_modules/bluebird/js/release/async.js:97:12)
    at _drainQueue (/src/server/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/src/server/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues (/src/server/node_modules/bluebird/js/release/async.js:15:14)
    at processImmediate (internal/timers.js:464:21)

Kannst du mir bestätigen, dass du die Szene ausführst, indem du sie startest? Nicht, indem du auf „Ausprobieren“ klickst? (Das wird nicht wie in der Beschreibung funktionieren)

Ah, ich sehe, was nicht stimmt, @PhilippeMA, bist du auf der PROD-Version?

Das ist der gleiche Bug, den @lmilcent gemeldet hat, er ist behoben, aber noch nicht deployt!

ach so, entschuldige bitte, ich hatte nicht verstanden, dass das gerade korrigiert wird.

Ich bestätige dir, es ist meine PROD-Umgebung.

Danke @pierre-gilles.

Update veröffentlicht in Gladys Assistant v4.11 :slight_smile:

Hallo,

ich habe einen Fehler, wenn ich die folgende Szene verwende:

die gesendete Anfrage lautet wie folgt:

Habe ich einen Fehler gemacht oder ist es ein anderer Bug?

Wenn du in deinem Ausdruck Leerzeichen hast, gibt mathjs einen Fehler zurück.
Wenn du auf einem Mobilgerät eine Variable in einen gladys-Block hinzufügst, habe ich festgestellt, dass dieser dir immer ein Leerzeichen danach hinzufügt.
Versuche, die Leerzeichen zu entfernen, falls das der Grund ist.

Allerdings enthält die gesendete Anfrage nicht den Wert der Variable, sondern nur einen Ausdruck der Form {{0.0.last_value}}, wodurch der mathjs-Fehler zurückgegeben wird.

vielleicht weil deine Variable nicht den richtigen Wert enthält? Ich nehme an, du hast sie über eine API abgerufen?
Kannst du zeigen, wie du sie gesetzt hast?

Ich erhalte den Wert bei der Nachrichtenübermittlung.

Der Wert stammt von einem Gerät, das über MQTT erstellt wurde

gerät wird über eine Anfrage in NodeRed versorgt

Tatsächlich entspricht das dem Bug, auf den lmilcent am 22/09 gestoßen ist, der bereits behoben wurde. Ein Rückfall?

Vergiss nicht, dass die Szene von alleine ausgelöst werden muss, damit es funktioniert. Der „Testen“-Button sendet keinen echten Wert.

Du hast einen langen Gerätenamen und Feature-Namen, vielleicht liegt das Problem dort?

Alles klar, tatsächlich habe ich meine Tests mit dem „Ausprobieren“-Button durchgeführt. Ich bestätige auch, dass man die Leerzeichen löschen muss, sonst gibt es kein Berechnungsergebnis.
Danke für die Infos und für Ihre Schnelligkeit.

Hallo, wie hier beschrieben, habe ich damit begonnen, Berechnungen direkt in den Szenen durchzuführen. Ich mache das in den Blöcken „Bedingung“ und „Gerät steuern“. Hier ist, was es bisher gibt

Jetzt brauche ich eure Hilfe. Kleine Erklärung: Sobald die Variablen durch die Werte ersetzt wurden, wird die Bibliothek mathjs verwendet, um die Berechnung auszuführen. Das Problem ist, dass die verwendete Methode evaluate() möglicherweise unerwünschten JS-Code in Gladys injizieren könnte. Daher müssen wir diese Methode auf die mathematischen Funktionen beschränken, die wir wirklich in Gladys verwenden wollen. Grundsätzlich werden wir mindestens die klassischen Operatoren +, -, *, / haben. Welche anderen mathematischen Funktionen würdet ihr gerne verwenden (oder verwendet ihr bereits mit der mathjs-API)?
Eine Liste ist hier verfügbar: math.js | an extensive math library for JavaScript and Node.js

Genial, danke für deine Hilfe, um das Thema voranzubringen :blush:

Ich würde mit den grundlegenden Operationen gehen, die du erwähnt hast. Persönlich konnte ich bisher nichts anderes verwenden.
Nicht die Klammern vergessen, natürlich!