NEWS
Funktionsrückgabewert = Skript und nicht Ergebniss
-
Hallo,
ich habe ein Problem mit einen Skript un komme nicht auf die Lösung. Gleich zu Beginn mein Geständniss, ich bin keine JS Profi, sondern viel nach try and error und, wie würde es ein blockly skript machen.
Jetzt stehe ich aber an und frage mich warum der Rückgabewert meiner function "getACgesamt" im Log der code der funktion getACgesamt ist, und nicht die Summe der SPannungswerte der einzelnen Wechselrichter --> hier der Screenshot aus dem LOG:
Nachfolgend auch noch das gesamte Skript.
async function getACgesamt() { var wr_ost1 = 92932006106226; //WR-Seriennummern definieren var wr_ost2 = 92932007107063; var wr_sued1 = 92932007107055; var wr_sued2 = 92932007102044; var wr_west1 = 92932007107053; var wr_west2 = 92932006106237; var ACin_L1_1, ACin_L1_2, ACin_L2_1, ACin_L2_2, ACin_L3_1, ACin_L3_2, AC_ges; var WrSerNr = 0; // Selektion und Zuteilung der Wechselricher auf die Phasen for (var i = 1; i < 7; i++) { // 6 durchläufe um alle WR Abzufragen WrSerNr = getState("mqtt.0.solpiplog.pip" + i + ".serial").val; //SerNr des aktuellen WR abfragen console.log(WrSerNr); //Nun kommt die if Schleife um die WR basierend auf der Seriennummer der Phase zuzuordnen if (WrSerNr == wr_ost1) { ACin_L1_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_ost2) { ACin_L1_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_sued1) { ACin_L2_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_sued2) { ACin_L2_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_west1) { ACin_L3_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_west2) { ACin_L3_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } } AC_ges = ACin_L1_1 + ACin_L1_2 + ACin_L2_1 + ACin_L2_2 + ACin_L3_1 + ACin_L3_2; return AC_ges; } //Nun alle 30 Sek status der ACin-Werte abfragen schedule("*/30 * * * * *", async function () { var AC_Sum; AC_Sum = getACgesamt; console.log(AC_Sum); if (AC_Sum < 1290) { // Wenn Summe ACin kleiner als 215Vx6=1290V await wait(10000); // 10 sec warten und nochmals checken AC_Sum = getACgesamt; if (AC_Sum < 1290) { setState('rpi2.1.gpio.23.state' /* GPIO 23 */, false); //Externe WP-Abschaltung aktivieren } } });
UseCase: Es soll von meinen 6 Wechselrichtern die jeweils anliegende NetzSpannung einlesen, dass ich im Falle eines Stromausfalles die Stromfresser wie die Wärmepumpe usw. abschalten kann, damit der Speicher länger durchhält.
Hoffe Ihr habt eine Idee..
Danke und vG Etze
-
-
@paul53
Hallo Paul,
funktioniert natürlich!! Vielen Dank für Wink. Machmal siehr man den Wald vor lauter Bäumen nicht.... -
@paul53
Hallo, jetzt hat sich gleich noch eine Frage ergeben aus der ich nicht schlau werde...
Ich lasse zur Kontrolle den Ausgabewert der Funktion innerhalb der Funktion ausgeben... und mache das gleiche nochmal in der Hauptschleife. Interessanterweise habe ich da keinen Wert im Log? hast du auch hier einen Wink für mich?async function getACgesamt() { var wr_ost1 = 92932006106226; //WR-Seriennummern definieren var wr_ost2 = 92932007107063; var wr_sued1 = 92932007107055; var wr_sued2 = 92932007102044; var wr_west1 = 92932007107053; var wr_west2 = 92932006106237; var ACin_L1_1, ACin_L1_2, ACin_L2_1, ACin_L2_2, ACin_L3_1, ACin_L3_2, AC_ges; var WrSerNr = 0; // Selektion und Zuteilung der Wechselricher auf die Phasen for (var i = 1; i < 7; i++) { // 6 durchläufe um alle WR Abzufragen WrSerNr = getState("mqtt.0.solpiplog.pip" + i + ".serial").val; //SerNr des aktuellen WR abfragen //console.log(WrSerNr); //Nun kommt die if Schleife um die WR basierend auf der Seriennummer der Phase zuzuordnen if (WrSerNr == wr_ost1) { ACin_L1_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_ost2) { ACin_L1_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_sued1) { ACin_L2_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_sued2) { ACin_L2_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_west1) { ACin_L3_1 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } else if (WrSerNr == wr_west2) { ACin_L3_2 = getState("mqtt.0.solpiplog.pip" + i + ".acin").val; } } AC_ges = ACin_L1_1 + ACin_L1_2 + ACin_L2_1 + ACin_L2_2 + ACin_L3_1 + ACin_L3_2; console.log(AC_ges); return AC_ges; } //Nun alle 30 Sek status der ACin-Werte abfragen schedule("*/30 * * * * *", async function () { var AC_Sum; AC_Sum = getACgesamt(); console.log(AC_Sum); if (AC_Sum < 1290) { // Wenn Summe ACin kleiner als 215Vx6=1290V await wait(10000); // 10 sec warten und nochmals checken AC_Sum = getACgesamt; if (AC_Sum < 1290) { setState('rpi2.1.gpio.23.state' /* GPIO 23 */, false); //Externe WP-Abschaltung aktivieren } } });
-
@etzeste13 sagte: keinen Wert im Log? hast du auch hier einen Wink für mich?
Nein, der Wert sollte als erster Eintrag im Log erscheinen.
-
Bitte benutze
log
nichtconsole.log
. Dann verwendetlog(`Dat ist en Kontrollvalue: ${AC_ges}`); //Ich verwende fast nur `` strings
Damit man im Log sieht welches
log()
welche Ausgabe erzeugt.und zu deiner Frage:
async
erzwingt einawait
wenn du eine Rückgabe haben möchtest.async function getACgesamt() { ... AC_Sum = getACgesamt(); // rückgabe Promise<any> // richtig AC_Sum = await getACgesamt();
EDIT:
Jedoch wäre es sinnvoller dasasync
inasync function getACgesamt()
zu entfernen. Ist unnötig und nur eine zusätzliche Fehlerquelle. -
@ticaki
Hallo und vielen Dank!! Funktioniert ohne dem async natürlich, und auch nur log funktioniert tadellos.Stellt sich mir nun die Frage, warum wählt den Bockly bei einer Funktion den Wert async und bei einer Ausgabe das console.log?
Wie oben beschrieben, versuche ich viel zu lernen indem ich Blocklys mache und mir dann ansehe wie das in JS umgewandelt wird...
lg Etze -
Zu dem
console.log
weiß ich nichts zu sagen, das muß @haus-automatisierung beantworten. ´log` ist im JS auf jeden Fall die bevorzugte Methode.Das async ist kein Problem, da Blockly ja nicht das await vergisst
Und in deinem schedule hast du ein await sleep() drin, dafür muß diese Funktion mit async gekennzeichnet sein.
-
@ticaki
Ich verstehe und ich kann mit dem Feedback auch arbeiten.
Was ich noch probiert habe und bei mir von deinem Codvorschlag nicht funktioniert hat warlog(`Dat ist en Kontrollvalue: ${AC_ges}`);
bei mir hat folgendes funktioniert:
log('Das ist Rückgabewert der Funktion:' + AC_ges);
lg
-
@etzeste13
Ich wette du hast den gleichen Fehler gemacht wie ich am anfangfolgendes ist nicht das gleiche:
"" // double quote '' // single quote `` // template literals ´´ // das ist garnix
ich hab oben:
``
verwerdet.
https://www.w3schools.com/js/js_string_templates.asp
mit template literals kannste halt sowas machen:
log(`${topic}: ${type} - ${typeof value == 'object' ? JSON.stringify(value) : value}`);
die alternative sieht so aus:
log(topic + ': ' + type + ' - ' + typeof value == 'object' ? JSON.stringify(value) : value);
Wenn das jetzt aufbläst wird es unlesbar
-
@ticaki
Das war´s!! Vielen Dank für die Hilfe!! So habe ich heute wirklich was gelernt!!