Ankündigung

Einklappen
Keine Ankündigung bisher.

Node Red Fragen

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #91
    Hi,

    ich stoße immer mal wieder auf die Herausforderung, dass ich den Status eines Input-Nodes zwar als Wert für einen AND-Node benötige, aber trotzdem damit kein Telegram auslösen will.

    Beispiel:

    Notification.JPG Hier wird zum einen eine Meldung gesendet, wenn ich die Abwesenheit aktiviere und noch Fenster offen sind. Im Nachgang wird eine Meldung gesendet, wenn die offenen Fenster geschlossen wurden.

    Allerdings wird auch eine Meldung "Fenster geschlossen" gesendet, wenn die Abwesenheit bei geschlossenen Fenstern aktiviert wird. Das möchte ich verhindern.

    Nach meinem Verständnis müsste ich nach dem unteren "AND"-Node unterscheiden können, von welchem Input-Node die Message getriggert wurde - und nur die Nachrichten durchlassen, die von dem Node "Fenster DG - Status" getriggert wurden. Da auch das Topic vom "AND"-Node neu gesetzt wird, kann ich es nicht als Unterscheidungskriterium verwenden. Ich bin aber vermutlich auf der falschen Fährte...

    Hat jemand von Euch eine Idee wie ich das lösen kann?

    Danke & Viele Grüße
    Jens

    Kommentar


      #92
      Zitat von Neelex Beitrag anzeigen
      Allerdings wird auch eine Meldung "Fenster geschlossen" gesendet, wenn die Abwesenheit bei geschlossenen Fenstern aktiviert wird. Das möchte ich verhindern.
      Genau das muss durch die Logik verhindert werden.
      Das geht z.B. über eine zeitliche Torschaltung, die die Nachricht "Fenster geschlossen" blockiert, wenn man "Abwesenheit" aktiviert

      abwesend.PNG

      ... ich habs allerdings nicht getestet.
      Chris (https://proknx.com)
      realKNX: Neben Visualisierung jetzt auch Sprachsteuerung ohne Cloud https://proknx.com/realknx-de
      Ausserdem: Automatisierungsideen mit NodeRED: (Logik, Sprachausgabe, Fremdprotokolle bis hin zur Alarmanlage)

      Kommentar


        #93
        Hallo Christian,

        auch so spät noch am Rechner gewesen? Vielen Dank!!!

        Habe es getestet. Bei Deiner Variante wird die Nachricht trotzdem geschickt, da zuerst das TRUE von "Allgemein - Abwesend" in den unteren AND-Knoten läuft (mit TRUE) und die Nachricht antriggert und erst 250ms später wird invertiert (FALSE) geschickt.

        Ich habe noch einiges ausprobiert heute - auch mit Deinem Ansatz. Je mehr ich getestet habe mit AND-Knoten, desto mehr war ich der Meinung dass das damit nicht funktionieren kann. Jedes Triggern eines invertierten bzw. anderen Status-Werts - um zu verhindern, dass der AND-Knoten TRUE wird - führt beim nachfolgenden Senden des korrekten Wertes wieder zu einer Message und damit zur Notification. Man muss wohl die Funktionen "Abwesenheits-Status speichern" und "Nachricht triggern" trennen.

        Heute morgen bin ich auf die Idee gekommen, dass man den aktuellen Abwesenheits-Status vielleicht in eine Flow-Variable schreiben (Status speichern) und dann statt AND-Knoten einen Function-Knoten für die Auswertung (Message triggern) verwenden könnte. Da ich mich mit Java überhaupt nicht auskenne, war das sehr spannend. Nach langem Anschauen von Beispielen und gefühlten tausend Versuchen und Änderungen scheint es zu funktionieren. Von Code-Seite her geht das bestimmt auch irgendwie eleganter...

        image_83716.jpg

        Knoten "Set status to flow variable":
        Code:
        status = flow.get("status") || "";
        var statustopic = msg.topic;
        var statuspayload = msg.payload;
        
        if (statustopic == "Abwesend" && statuspayload === true)
            flow.set("status", "TRUE");
         else
        
        if(statustopic == "Abwesend" && statuspayload === false)
            flow.set("status", "FALSE");
         else
        
         return message;

        Knoten "Fenster geschlossen DG":
        Code:
        status = flow.get("status") || "";
        var topicDG = msg.topic;
        var payloadDG = msg.payload;
        var payloadgeschlossen = "geschlossen";
        
        if(topicDG == "Fenster" && payloadDG === false && status == "TRUE")
            msg.payload = payloadgeschlossen;
        else
            msg.payload = "";
        return msg;
        Grüße
        Jens
        Zuletzt geändert von Neelex; 14.04.2019, 11:16.

        Kommentar


          #94
          Hallo Jens,
          sorry, man sollte nie etwas ungetestet veröffentlichen.
          Du hast vollkommen recht, so wie von mir angedacht gehts nicht.
          Super, wie Du das mit JavaScript gelöst hast.

          Ich möchte hier noch einen Lösungsweg aufzeigen, ohne scripten zu müssen. Soll kein Besserwissen sein...
          Immer wenn Zustände von mehreren Variablen erfasst werden und dann über unterschiedliche Bedingungen weiterverarbeitet werden sollen, kann das mit reiner boolschen Logik schwierig werden.
          Eine super Hilfe ist hier die "finite state machine", die ich ich kurz an Deinem Beispiel vorstellen möchte.

          Die Zustände und die Weiterschaltbedingungen können dazu im Klartext festgelegt werden. Das ganze schaut in der Konfiguration so aus:
          configStateMachine.PNG
          Der Flow könnte dann wie folgt aussehen:

          state-machine.PNG


          Die drei Weiterschaltbedingungen sind Eingangsseitig der state machine angelegt. Am Ausgang testet man dann den Zustand über das entsprechende Topic, und könnte den Text in Deinem Fall auch gleich raussenden.

          Diesmal hab ich's auch getestet, und es funktioniert

          Hier noch der Code zum Übernehmen aus der Zwischenablage:
          Code:
          [{"id":"b348209d.ac5fa","type":"tab","label":"Flow 2"},{"id":"8efc9d36.c4482","type":"state-machine","z":"b348209d.ac5fa","name":"","triggerProperty":"topic","triggerPropertyType":"msg","stateProperty":"topic","statePropertyType":"msg","outputStateChangeOnly":false,"throwException":false,"states":["start","Melden Fenster offen","Melden Fenster geschlossen"],"transitions":[{"name":"Abwesend aktiviert + Fenster offen","from":"*","to":"Melden Fenster offen"},{"name":"Abwesend aktiviert + Fenster geschlossen","from":"Melden Fenster offen","to":"Melden Fenster geschlossen"},{"name":"Abwesend wird aktiviert","from":"*","to":"start"}],"x":1076,"y":180,"wires":[["196dbd3a.a54053"]]},{"id":"fbf70e21.5e8e2","type":"realknx-in","z":"b348209d.ac5fa","name":"","controller":"b1d2fbe.d184108","itemname":"Test - Abwesend","passthru":false,"booleanoutput":true,"outputatstartup":true,"x":140,"y":160,"wires":[["86c7f601.efb648","d6615501.9edb48","998cc053.3eb13"]]},{"id":"1204b37f.4a7afd","type":"realknx-in","z":"b348209d.ac5fa","name":"","controller":"b1d2fbe.d184108","itemname":"Test - Fenster offen","passthru":false,"booleanoutput":true,"outputatstartup":true,"x":130,"y":220,"wires":[["d6615501.9edb48","13d7eb93.c55e84"]]},{"id":"ef154cbe.c06d2","type":"change","z":"b348209d.ac5fa","name":"Abwesend wird aktiviert","rules":[{"t":"set","p":"topic","pt":"msg","to":"Abwesend wird aktiviert","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":100,"wires":[["8efc9d36.c4482"]]},{"id":"86c7f601.efb648","type":"switch","z":"b348209d.ac5fa","name":"IS TRUE?","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":458,"y":100,"wires":[["ef154cbe.c06d2"]]},{"id":"d6615501.9edb48","type":"BooleanLogic","z":"b348209d.ac5fa","name":"","operation":"AND","inputCount":2,"topic":"result","x":400,"y":180,"wires":[["9075b283.e5e9c"]]},{"id":"587210a1.f026e","type":"change","z":"b348209d.ac5fa","name":"Abwesend aktiviert + Fenster offen","rules":[{"t":"set","p":"topic","pt":"msg","to":"Abwesend aktiviert + Fenster offen","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":180,"wires":[["8efc9d36.c4482"]]},{"id":"998cc053.3eb13","type":"BooleanLogic","z":"b348209d.ac5fa","name":"","operation":"AND","inputCount":2,"topic":"result","x":520,"y":280,"wires":[["56645366.b3cafc"]]},{"id":"13d7eb93.c55e84","type":"Invert","z":"b348209d.ac5fa","name":"Invert","x":350,"y":280,"wires":[["998cc053.3eb13"]]},{"id":"fe8cfe3b.96ad1","type":"change","z":"b348209d.ac5fa","name":"Abwesend aktiviert + Fenster geschlossen","rules":[{"t":"set","p":"topic","pt":"msg","to":"Abwesend aktiviert + Fenster geschlossen","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":280,"wires":[["8efc9d36.c4482"]]},{"id":"196dbd3a.a54053","type":"debug","z":"b348209d.ac5fa","name":"","active":true,"console":"false","complete":"false","x":1230,"y":280,"wires":[]},{"id":"9075b283.e5e9c","type":"switch","z":"b348209d.ac5fa","name":"IS TRUE?","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":558,"y":180,"wires":[["587210a1.f026e"]]},{"id":"56645366.b3cafc","type":"switch","z":"b348209d.ac5fa","name":"IS TRUE?","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":660,"y":280,"wires":[["fe8cfe3b.96ad1"]]},{"id":"b8864948.4ca2d8","type":"comment","z":"b348209d.ac5fa","name":"init","info":"","x":310,"y":80,"wires":[]},{"id":"b1d2fbe.d184108","type":"realknx-controller","z":"","name":"realknx-ctrl","host":"localhost","port":"3000"}]
          Viele Grüsse
          Christian
          Chris (https://proknx.com)
          realKNX: Neben Visualisierung jetzt auch Sprachsteuerung ohne Cloud https://proknx.com/realknx-de
          Ausserdem: Automatisierungsideen mit NodeRED: (Logik, Sprachausgabe, Fremdprotokolle bis hin zur Alarmanlage)

          Kommentar


            #95
            Hallo Christian,

            wow, vielen Dank! Mit der State Machine ist das natürlich deutlich schneller und nachvollziehbarer umzusetzen, werde ich so verwenden! Da sieht man eben wer der Experte ist .Die State Machine scheint wirklich ein zentraler Knoten zu sein, wenn man etwas komplexere Logik-Aufgaben lösen möchte.

            Kein Problem übrigens, dass das andere nicht funktioniert hat. Du musst uns nicht für jedes individuelle Problem (getestete) Flows zur Verfügung stellst, ich sehe das als großes Entgegenkommen von Deiner Seite! Außerdem hat mich das dazu gebracht mich ein bisschen mit Java Coding zu beschäftigen - schadet auch nicht. Grundsätzlich muss schon selbst probieren und findet manchmal dann auch Lösungen. Deine Lösungen sind aber immer logischer und besser nachvollziehbarer

            Viele Grüße
            Jens

            Kommentar

            Lädt...
            X