Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Problem mit Variable

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Problem mit Variable

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Schnuller last edited by Schnuller

      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

      mickym 1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @Schnuller last edited by mickym

        @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:

        12e6b6e9-8b2a-4428-8a55-6566e4608a8e-image.png

        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:

        7a3facc5-da5a-4d6e-83e4-9a0f1ee0d80d-image.png

        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.

        d4667d6c-6068-4cf4-b732-977bfc6a7c74-image.png

        Also nur über den Kontext kann man Variablen mit Inhalten permanent definieren.

        S 1 Reply Last reply Reply Quote 0
        • S
          Schnuller @mickym last edited by Schnuller

          @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 )

          mickym 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active @Schnuller last edited by mickym

            @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:

            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;
            

            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ü:

            1801438c-ab96-477b-8a95-c64b01e67c2a-image.png

            S 1 Reply Last reply Reply Quote 0
            • S
              Schnuller @mickym last edited by

              @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!!!!!

              mickym 1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @Schnuller last edited by mickym

                @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.

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                443
                Online

                31.8k
                Users

                79.9k
                Topics

                1.3m
                Posts

                2
                6
                198
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo