Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  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.4k

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

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

Problem mit Variable

Geplant Angeheftet Gesperrt Verschoben Node-Red
6 Beiträge 2 Kommentatoren 328 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    Schnuller
    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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
        schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              512

              Online

              32.4k

              Benutzer

              81.4k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe