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. Node-Red Filter

    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

    Node-Red Filter

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      ranzen @ranzen last edited by

      Hier mal ein Blick in die DB. Da stehen in den letzten beiden Zeilen sowohl die Werte nach der Funktion, aber noch vor Deiner Regel als auch nach Deiner Regel.

      Und die Zeilen sind identisch.

      Also im Moment werden alle richtigen Werte durchgelasseb und in die DB geschrieben. Ob allerdings -100 rausgefiltert wird, weiss ich jetzt noch nicht. Da muss ich warten, bis der Sensor wieder diesen Wert schickt. Das ist total unregelmäßig.

      R 2 Replies Last reply Reply Quote 0
      • R
        ranzen @ranzen last edited by

        2024-05-23T15:37:22.658452338Z 3.378   7.081      1          24.200000000000003   0
        2024-05-23T15:37:22.660494064Z 3.378   7.081      1          24.200000000000003   0
        
        
        1 Reply Last reply Reply Quote 0
        • R
          ranzen @ranzen last edited by ranzen

          Nur der Zeitstempel unterscheidet sich um ein paar Millisekunden oder so.

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

            @ranzen Ich weiß zwar nicht was Du vergleichst, aber ich hoffe Du kannst mit den 2ms Zeitdifferenz leben. Sonst brauchst du wahrscheinlich einen Hochleistungsrechner. Ansonsten kann man über die InfluxDB Nodes auch bis auf Nanosekunden, den Zeitpunkt festlegen. Der wird in der Influx nur dann automatisch hinzugefügt, wenn man keinen Zeitstempel angibt.

            R 1 Reply Last reply Reply Quote 0
            • R
              ranzen @mickym last edited by

              @mickym Die erste Regel mit dem msg. payload.uplink_message.decoded_payload wird nicht akzeptiert. Da steht ein rotes Dreieck.

              R mickym 2 Replies Last reply Reply Quote 0
              • R
                ranzen @ranzen last edited by

                @ranzen Bildschirmfoto 2024-05-23 um 17.53.01.png

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

                  @ranzen sagte in Node-Red Filter:

                  @mickym Die erste Regel mit dem msg. payload.uplink_message.decoded_payload wird nicht akzeptiert. Da steht ein rotes Dreieck.

                  Hast Du den Flow importiert?

                  Ich konnte den problemlos importieren. Und Du solltest die Change Node ANSTELLE Deiner function Node nehmen und nicht hinter Deine function Node.

                  R 1 Reply Last reply Reply Quote 0
                  • R
                    ranzen @mickym last edited by

                    @mickym Anstelle ? Ok.

                    R 1 Reply Last reply Reply Quote 0
                    • R
                      ranzen @ranzen last edited by

                      Habe ich auch gemacht. Gerade noch mal überprüft.

                      Bildschirmfoto 2024-05-23 um 17.57.41.png

                      R mickym 2 Replies Last reply Reply Quote 0
                      • R
                        ranzen @ranzen last edited by

                        So sieht es jetzt aus:

                        Bildschirmfoto 2024-05-23 um 18.00.07.png

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

                          @ranzen Ich verstehs nicht-Wenn das Objekt das ist was ich unten geschrieben habe,

                          Also das hier aus Deine mqtt Node rauskommt.

                          c2be912e-7826-47ad-b84f-81039af08528-image.png

                          Dann füge direkt die ChangeNode mit den 2 Regeln dahinter.

                          So und das funktioniert auch, wie Du siehst, wenn die temperatur -100 ist:

                          b57ca950-3e89-4c65-9f73-d8b42ad4c613-image.png

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

                            @ranzen sagte in Node-Red Filter:

                            So sieht es jetzt aus:

                            Bildschirmfoto 2024-05-23 um 18.00.07.png

                            Na das ist doch nur eine Change NOde mit EINER Regel - beide Regeln.

                            49e34198-6003-4db7-9fce-80ff85bb9e49-image.png

                            86f7156e-ed15-40ab-b9db-42b7f597067b-image.png

                            Diese Change Node hier zum IMPORT:

                            [{"id":"69bdba3e138433d4","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.uplink_message.decoded_payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.temperature = -100 ? payload~>|$|{},\"temperature\"| : payload","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":6580,"wires":[["9a4ef5f62cf3ee3c"]]}]
                            

                            hinter deine mqtt Node. Da steht dann change: 2 Regeln und nicht setze msg.payload

                            R 1 Reply Last reply Reply Quote 0
                            • R
                              ranzen @mickym last edited by

                              @mickym Ich hatte immer direkt die Regel angepasst. Jetzt habe ich aber trotzdem noch einmal einen IMPORT gemacht.

                              Wie gesagt: wann der Wert -100 kommt, weiss ich nicht. Aber sicher ist , dass er mehrfach am Tag kommt. Wenn ich jetzt also 2-3 Tage nichts mehr von ihm sehe, hat Deine Hilfe dafür gesorgt, dass dieses problem nicht mehr aktuell ist.

                              Nochmals Danke dafür.

                              Wenn es in nächster Zeit wider Erwarten doch noch zu Problemen kommt, melde ich mich einfach noch einmal.

                              VG Heiner

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

                                @ranzen OK - sind jetzt beide Regeln in der Change Node?

                                R 1 Reply Last reply Reply Quote 0
                                • R
                                  ranzen @mickym last edited by

                                  @mickym Ja, ich habe meinen alten mit Deinen letzten IMPORT Change Node ersetzt. Es arbeitet jetzt nur der neue.

                                  R mickym 2 Replies Last reply Reply Quote 0
                                  • R
                                    ranzen @ranzen last edited by

                                    @ranzen Und die Einträge in der DB sind auch ok. Alles passt.

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

                                      @ranzen sagte in Node-Red Filter:

                                      @mickym Ja, ich habe meinen alten mit Deinen letzten IMPORT Change Node ersetzt. Es arbeitet jetzt nur der neue.

                                      Ok - dann schauen wir mal.

                                      @ranzen sagte in Node-Red Filter:

                                      @ranzen Und die Einträge in der DB sind auch ok. Alles passt.

                                      👍 👍 👍

                                      R 1 Reply Last reply Reply Quote 0
                                      • R
                                        ranzen @ranzen last edited by

                                        Hier mal eine Ausgabe mit Grafana:

                                        Bildschirmfoto 2024-05-23 um 18.10.57.png

                                        1 Reply Last reply Reply Quote 0
                                        • R
                                          ranzen @mickym last edited by

                                          @mickym Der Fehler mit dem -100 Wert ist bis jetzt noch nicht wieder aufgetreten, somit arbeitet Dein Filter einwandfrei. 👍

                                          Allerdings weiss ich noch nicht genau, wie der Filter

                                          payload.temperature = -100 ? payload~>|$|{},"temperature"| : payload
                                          

                                          genau arbeitet. Kannst Du mir den Code noch mal kurz erklären ?

                                          VG

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

                                            @ranzen Nun das ist JSONATA hier der Link zur Dokumentation!

                                            Als erstes prüfen wir also, ob die Eigenschaft temperature des payload-Objektes -100 ist. In JSONATA kannst Du if/then Abfragen nur über den tenären Operator ? : erstellen. Den ternären Operator ? : gibt es aber auch in Javascript.

                                            Wenn also payload.temperature (also die Eigenschaft temperature des payload Objektes) - 100 ist, dann mach das was hinter dem Fragezeichen steht, wenn nicht mach das was hinter dem Doppelpunkt steht.

                                            https://docs.jsonata.org/programming#conditional-logic

                                            9f5b4676-5333-466a-bedc-d34233b0d3e7-image.png

                                            Also
                                            Wenn payload.temperatur = -100, dann mache

                                            payload~>|$|{},"temperature"|
                                            

                                            sonst lasse das payload Objekt unverändert:

                                            payload
                                            

                                            Nun also zu dem Filter. Die Mächtigkeit von JSONATA ist, dass es alle Objekte auf einer Ebene verändern kann, da selbst wenn das Ergebnis mehrfach existiert automatisch Arrays gebildet werden, ohne dass Du dafür was tun musst. Insofern kann folgendes sowohl auf ein einzelnes Objekt, also auch auf ein Array gleichartiger Objekte verwendet werden.

                                            Der Filter

                                            payload~>|$|{},"temperature"|
                                            

                                            ist ein sogenannter Transform Operator:

                                            https://docs.jsonata.org/other-operators#-------transform
                                            d8c75f26-d47c-4710-ab17-4db21796f575-image.png

                                            Das habe ich also nochmal grün markiert. Der transform Operator kann auf ein einzelnes Objekt oder auf ein Array von Objekten angewandt werden.

                                            Der Kopf oder der Ausgangspunkt des Objektest ist also Dein payload Objekt und da wir keine untergeordneten Objekte selektieren nehmen wir mit dem $-Zeichen das payload Objekt selbst.

                                            https://docs.jsonata.org/programming#built-in-variables

                                            dc0a0f2c-baea-441f-af1f-750983c698e4-image.png

                                            Nun also zum Transform Operator

                                            head ~> | location | update [, delete] |
                                            

                                            head
                                            der head ist also unser payload Objekt

                                            payload ~>  |
                                            

                                            location
                                            ist das payload Objekt selbst, also $

                                            payload ~>|$|
                                            

                                            nun kommt es zum update
                                            update
                                            da wir in dem Objekt nichts updaten wollen, gebe ich ein leeres Objekt mit. Wichtig es wird innerhalb nur die Eigenschaft aktualisiert, aber das ganze Objekt bleibt erhalten. Man kann somit auch neue Eigenschaften in dem Objekt erstellen

                                            payload ~>|$|{}|
                                            

                                            Damit wäre die Syntax schon korrekt, aber das Objekt kommt unverändert raus. Wir wollen aber nun die temperature Eigenschaft aus dem Objekt löschen, deswegen wenden wir hier den optionalen Parameter delete an.

                                            delete
                                            Der delete Parmater enthält die Eigenschaften, die wir aus dem Objekt entfernen wollen, also in unserem Fall "temperature". Wenn wir mehrere Eigenschaften entfernen wollten, dann müssten wir ein Array von Strings mit allen Eigenschaftsnamen mitgeben.
                                            Also schaut mit dem delete Parameter unser transform Operator wir folgt aus:

                                             payload~>|$|{},"temperature"|
                                            

                                            und wir sind fertig.

                                            Ich empfehle Dir so was immer im JSONATA- Übungsfenster nachzuvollziehen.
                                            Hier der Link mit Deinem payload Objekt: https://try.jsonata.org/PuBUXRbdT

                                            Du siehst damit sofort wie der transform Operator sich auswirkt:
                                            e44d3f31-8268-4133-aca2-9c9e75f8505b-image.png

                                            Wenn Du anstelle die temperature Eigenschaft zu löschen, lieber ein "nicht verfügbar" in Deinem Objekt haben wolltest, dann würde das so aussehen:

                                             payload~>|$|{"temperature":"nicht verfügbar"}|
                                            

                                            1a9512aa-cafb-4161-99a8-5c7cb9f7d02b-image.png

                                            Wenn Du aber die Fehler in einer eigenen Eigenschaft erstellen willst und die temperature Eigenschaft trotzdem löschen, willst kannst Du das auch in dem update Objekt machen.

                                             payload~>|$|{"error":true},"temperature"|
                                            

                                            13d63c18-b1de-455c-8a50-734d65e2a8a4-image.png

                                            So löscht Du die Eigenschaft "temperature" aus deinem payload Objekt und aktualisierst es gleichzeitig, in dem Du eine neue Eigenschaft "error" hinzufügst und diese auf true setzt.

                                            Du kannst natürlich auch die Bedingung im CodeFenster links oben setzen:

                                            a2599b0a-a37c-46cc-b959-1d01811e667a-image.png

                                            Dann kannst du den temperature Wert links einfach verändern und siehst, dass wenn die temperature nicht -100 ist, der temperature Wert mitkommt.

                                            6ed52a87-0835-414f-acc3-9529a2f74bf8-image.png

                                            Viel Spaß!!!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            555
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            58
                                            2604
                                            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