NEWS
[gelöst] Wie krieg ich "result" an Blockly übergeben
-
Liebes Forum,
ahnungslos doktore ich jetzt schon seit Tagen mit den Blocklybausteinen
herum und komme einfach nicht weiter. Auch finde ich hier im Forum nix was mir weiterhilft, oder ich verwende die falschen Suchkriterien.Ich habe noch 5 alte HM Thermostate in Betrieb. Seit Jahren stelle ich den Modus dieser je nach Bedarf mittels eines abgekupferten und dankenswerter Weise mit Hilfe von @Homoran JS, hin und her.
Beispiel:
sendTo('hm-rpc.0', 'putParamset', {ID: 'GEQ0162204:2', paramType: 'MASTER', params: {'MODE_TEMPERATUR_REGULATOR': 0}}, // res => { // log(JSON.stringify(res)); // } );
Nun möchte ich die Thermostate periodisch prüfen und das Ergebnis mit Blockly verarbeiten. Ich komme nur mit JS nicht auf gleich, bzw. bin einfach zu blöd dafür
// Liest nur 1 Parameter aus // manu (0) oder auto (1) oder cen (2) // Wohnzimmer return 0; sendTo('hm-rpc.0', 'getParamset', {ID: 'HEQ0510329:2', paramType: 'MASTER'}, res => { // log(JSON.stringify(res)); //Liest alle Paprameter aus log(JSON.stringify(res.result.MODE_TEMPERATUR_REGULATOR)); //schreibt nur den aktuellen Modus ins Log // setState('0_userdata.0.Hilfsdatenpunkte.ScriptDP.HM.Thermostat_WZ.Master_Parameter', res.result.MODE_TEMPERATUR_REGULATOR, true); });
Ich krieg das Resultat der Abfrage nicht nach Blockly.
Kann mir bitte jemand unter die Arme greifen?
Danke, mxa
-
@metaxa sagte: Ich krieg das Resultat der Abfrage nicht nach Blockly.
Wenn die Funktion vor sendTo() mit
return 0;
beendet wird, kann nichts geloggt werden.
-
@paul53 Lieben Dank für deine Reaktion!
Dieser "Befehl" kommt automatisch mit wenn ich in Blockly den Baustein "JS-Funktion mit Ergebniss" auswähle. Ich hatte den Befehl auch schon am Ende, aber da kam auch nix an. Oder gehört der auf "1" gestellt?
-
@metaxa sagte in Wie krieg ich "result" an Blockly übergeben:
Dieser "Befehl" kommt automatisch mit wenn ich in Blockly den Baustein "JS-Funktion mit Ergebniss" auswähle
Ja - als Beispiel.
Hinter dem "return" folgt das, was als Ergebnis zurückkommen soll.
Mit einem "return" wird eine Funktion aber auch beendet. Das wird also als letztes aufgerufen. Nachdem das Ergebnis feststeht.Was möchtest Du denn als Ergebnis zurückliefern?
-
sendTo('hm-rpc.0', 'getParamset', {ID: 'HEQ0510329:2', paramType: 'MASTER'}, res => { // log(JSON.stringify(res)); //Liest alle Paprameter aus log(JSON.stringify(res.result.MODE_TEMPERATUR_REGULATOR)); //schreibt nur den aktuellen Modus ins Log // setState('0_userdata.0.Hilfsdatenpunkte.ScriptDP.HM.Thermostat_WZ.Master_Parameter', res.result.MODE_TEMPERATUR_REGULATOR, true); });
Diese Abfrage des aktuellen Modus sollte "0", "1" oder "2" zurückgeben. Mit der Ziffer kann ich dann in Blockly weiterarbeiten.
-
Ich nehme mal an, dass das dann auch als Zahl zurückgegeben werden soll?
Hier stand quatsch ...
-
@metaxa sagte in Wie krieg ich "result" an Blockly übergeben:
Kann mir bitte jemand unter die Arme greifen?
Du musst mit einem Promise arbeiten, da sonst die Callback-Funktion erst aufgerufen wird, wenn Deine Funktion längst abgearbeitet ist.
const res = await sendToAsync('hm-rpc.0', 'getParamset', { ID: 'HEQ0510329:2', paramType: 'MASTER' }); return res.result.MODE_TEMPERATUR_REGULATOR;
-
@metaxa sagte: da kam auch nix an.
Man kann aus einer Callback-Funktion nichts an den Funktionsaufruf zurück geben, da die Callback-Funktion erst später aufgerufen wird. Wenn setState() innerhalb der Callback-Funktion ausgeführt wird, wird das Ergebnis in den DP geschrieben.
-
@haus-automatisierung sagte in Wie krieg ich "result" an Blockly übergeben:
Du musst mit einem Promise arbeiten
Ich verstehe es nicht, liegt an meinen NICHT vorhandenen JS Kenntnissen. Leider gibt es keine Blockly Möglichkeit bei den alten Thermostaten den aktuellen Modus abzufragen, weswegen ich Euch quälen und um Hilfe bitten muss.
Es funktioniert
Lieben Dank @haus-automatisierung & @paul53 & @Codierknecht
-
@metaxa sagte in [gelöst] Wie krieg ich "result" an Blockly übergeben:
Ich verstehe es nicht, liegt an meinen NICHT vorhandenen JS Kenntnissen.
Na in Deinem Ausgangspost rufst Du
sendTo
auf. Als letzten Parameter übergibst Du eine Funktion. Diese Funktion wird dann aufgerufen, sobald das Ergebnis vorliegt. Das Problem ist aber, dass die umliegende Funktion darauf nicht wartet. Das sendTo wird also ausgeführt und sofort ist die umliegende Funktion abgearbeitet.Um diesem Problem vorzubeugen, gibt es in JavaScript sog. Promises (für Google). Für länger laufende Aufgaben kann man sich also explizit entscheiden, auf die Abarbeitung zu warten (mit dem Schlüsselwort
await
. Dafür ist nur wichtig, dass die aufgerufene Funktion ein Promise zurückgibt. Und das macht die Funktion mit dem NamensendToAsync
.Und dann kann man damit eben weiterarbeiten. Damit man mit
await
arbeiten kann, muss die umliegende aber alsasync
definiert sein. Aber das sind alle per Blockly definierten Funktionen automatisch. Siehst Du auch, wenn Du auf JavaScript umschaltest. -
@metaxa sagte in [gelöst] Wie krieg ich "result" an Blockly übergeben:
Es funktioniert
Könnte man aber noch etwas "optimieren".
Muss da wirklich mit 'nem Zeitplan gearbeitet werden?
Gibt es da keinen Datenpunkt, auf dessen Wertänderung man reagieren könnte?Edit
Dieser DP muss ja nicht zwangsläufig einer sein, der auch gleich den passenden Wert liefert. Es reicht ja aus, dass man mitbekommt ob und wann sich da etwas ändert.
Ist halt ein Unterschied, ob man das 1.440 x am Tag aufruft, oder nur dann wenn sich auch tatsächlich etwas geändert hat. -
@codierknecht sagte in [gelöst] Wie krieg ich "result" an Blockly übergeben:
Muss da wirklich mit 'nem Zeitplan gearbeitet werden?
Leider ja, natürlich nicht jede Minute wie in meinem Beispiel, das war nur für die Dauer des Testes. Die alten MH bieten leider keinen DP der sich ändert wenn am Thermostat manuell der Modus verändert wird.
Nachdem ich 5 oder 6 Stk. abfragen muss, werde ich vermutlich auf einen Interval von 10 oder gar 30 Minuten gehen.