NEWS
Node-Red Filter
-
@ranzen sagte in Node-Red Filter:
So sieht es jetzt aus:
Na das ist doch nur eine Change NOde mit EINER Regel - beide Regeln.
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
-
@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
-
@ranzen OK - sind jetzt beide Regeln in der Change Node?
-
@mickym Ja, ich habe meinen alten mit Deinen letzten IMPORT Change Node ersetzt. Es arbeitet jetzt nur der neue.
-
@ranzen Und die Einträge in der DB sind auch ok. Alles passt.
-
@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.
-
Hier mal eine Ausgabe mit Grafana:
-
@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
-
@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
Also
Wenn payload.temperatur = -100, dann machepayload~>|$|{},"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
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
Nun also zum Transform Operator
head ~> | location | update [, delete] |
head
der head ist also unser payload Objektpayload ~> |
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 erstellenpayload ~>|$|{}|
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/PuBUXRbdTDu siehst damit sofort wie der transform Operator sich auswirkt:
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"}|
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"|
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:
Dann kannst du den temperature Wert links einfach verändern und siehst, dass wenn die temperature nicht -100 ist, der temperature Wert mitkommt.
Viel Spaß!!!
-
@mickym Vielen Dank für die super Erklärung