Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. Problem mit Variable

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Problem mit Variable

Scheduled Pinned Locked Moved Node-Red
6 Posts 2 Posters 322 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Schnuller
    wrote on last edited by Schnuller
    #1

    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

    mickymM 1 Reply Last reply
    0
    • S 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

      mickymM Online
      mickymM Online
      mickym
      Most Active
      wrote on last edited by mickym
      #2

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

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      S 1 Reply Last reply
      0
      • mickymM 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 Offline
        S Offline
        Schnuller
        wrote on last edited by Schnuller
        #3

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

        mickymM 1 Reply Last reply
        0
        • S 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 )

          mickymM Online
          mickymM Online
          mickym
          Most Active
          wrote on last edited by mickym
          #4

          @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

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          S 1 Reply Last reply
          0
          • mickymM 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 Offline
            S Offline
            Schnuller
            wrote on last edited by
            #5

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

            mickymM 1 Reply Last reply
            0
            • S Schnuller

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

              mickymM Online
              mickymM Online
              mickym
              Most Active
              wrote on last edited by mickym
              #6

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

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              1 Reply Last reply
              0
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              765

              Online

              32.4k

              Users

              81.4k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe