NEWS
Problem mit Variable
-
Hallo
verwende eine Funktion um einen Hoymiles Wechselrichter von 0-100% anzusteuern, anhand der aktuellen Leistung ( PowCounter )var PowCounter;
PowCounter = msg.payload;
if (PowCounter > 10 && Limit <= 98) Limit = Limit + 2;
if (PowCounter > 50 && Limit <= 94) Limit = Limit + 6;
if (PowCounter < -10 && Limit >= 2 ) Limit = Limit - 2;
if (PowCounter < -50 && Limit >= 6 ) Limit = Limit - 6;
msg.payload = Limit;
return msg;jetzt wird aber angemeckert, das die Variable Limit nicht definiert ist:
function : (error)
"ReferenceError: Limit is not defined (line 3, col 24)" (((= Limit)))habe aber in der Start Funktion stehen:
var Limit = 0;was mache ich falsch?
ich kann in der Funktion selber Limit nicht festlegen, sie soll ja eingeregelt werden
aber sie muss einmal definiert werden, dachte Start Funktion ist dafür da!Ist wohl ein Henne Ei Problem
-
@schnuller Nein die Start Funktion hat damit nicht zu tun. Du musst die Variable ganz normal in dem Function Tab definieren.
In der Hilfe zur Function Node:
Das ist aber nur wenn die Nodes oder die Flows gestartet und gestoppt werden. Die eigentliche function Node wird aber durch ein Nachrichtenobjekt getriggert.
Deswegen weiß die function oder der Tab nichts davon was zu Beginn oder am Ende ausgeführt wird. Also einfach Limit auch wie PowCounter in der function definieren.
Was Du machen kannst ist mit dem Start Tab ist zum Beispiel den Kontext zu initialisieren:
Generell wird mit jedem ankommenden Nachrichtenobjekt - der "function" code neu ausgeführt und initialisiert. Sollen Variablen über verschiedene Nachrichtenobjekte gültig sein, geht das nur über den Kontext.
Also nur über den Kontext kann man Variablen mit Inhalten permanent definieren.
-
@mickym sorry bin leider zu blöd
kannst du das beispiel etwas detailierter erklären?
muss ich einen inject machen damit die "var Limit" manuell definiert wird
in der function kann ich ja nicht, weil es dann fixiert wäre
aber die function ist ja da um Limit zu verändern, nach den Daten der
Empfangs Payload = PowCounter
die Ausgangs Payload ist dann die variable Limit 0-100
dein Beispiel mit context ( noch nie verwendet und verstehe es auch nicht )
und dem Inhalt "test" ist mir unklar, sorry
bin nur Elektroniker aber kein Programmierer
und ausserdem wohl auch zu alt ( 59 ) -
@schnuller Na in der Regel musst Du das Limit im Kontext speichern und dann auch wieder auslesen. Kontext heißt, dass Du es dort auch eine Variable ist, die Du auslesen und auch wieder speichern musst.
Du willst also Limit zwischen den Nachrichten speichern, dass machst Du mit dem Node Kontext.
var Limit = context.get("Limit") || 0; var PowCounter; PowCounter = msg.payload; if (PowCounter > 10 && Limit <= 98) Limit = Limit + 2; if (PowCounter > 50 && Limit <= 94) Limit = Limit + 6; if (PowCounter < -10 && Limit >= 2 ) Limit = Limit - 2; if (PowCounter < -50 && Limit >= 6 ) Limit = Limit - 6; context.set("Limit",Limit) msg.payload = Limit; return msg;
Hier der ganze Flow zum Import:
Und wenn Du nicht programmieren willst, warum programmierst Du dann und nutzt function Nodes - anstelle, dass du es ohne Programmierung mit Standardnodes machst???
Kontextvariablen siehst Du im Kontextmenü:
-
@mickym Super und Danke
wieder was gelernt
Standard Nodes können halt nicht alles
hab mal wieder anschiss bekommen, aber nehm ich gern in kauf
denke ich habe wieder was gelernt!
Danke nochmal!!!!! -
@schnuller sagte in Problem mit Variable:
Standard Nodes können halt nicht alles
Oh viel mehr als Du denkst - aber dazu müsstest Du Dich halt darauf einlassen, zum Beispiel diese function Node durch Standardnodes zu ersetzen.