Es gibt wirklich unzählige Nodes als Erweiterung für Node-Red. Was es bisher aber nicht gab, war ein einfacher Zähler für Nachrichten-Pakete. Und genau sowas habe ich für mein Projekt benötigt. Also was blieb mir anderes über, als kurzer Hand eine solche Node selber zu schreiben?! ;)
Die Node ist mittlerweile öffentlich auf GitHub, npm und über die offizielle Node-Sammlung verfügbar und kann somit wie jede andere Node installiert werden.
npm install node-red-contrib-counter
Die Nutzung ist denkbar einfach. Setzt man die Node in einen beliebigen Flow zwischen zwei Nodes ein, so zählt diese die Nachrichtenmenge und fügt msg.count
zur ausgehenden Nachricht hinzu. Neben diesem Standardverhalten gibt es viele Einstell- und Steuerungsmöglichkeiten für die Node.
Initial Count
: Der Zählerstand der Node beim Start.Default Step
: Der Wert, um welchen der Zähler bei jeder Nachricht erhöht werden soll.Lower Limit
: Ein optionales oberes Limit für den Wert des Zählers.Upper Limit
: Ein optionales unteres Limit für den Wert des Zählers.Mode
: Gibt an, ob der Zähler standardmäßig erhöht oder verringert werden soll bei eingehenden Nachrichten.Outputs
: Steuert die Weitergabe der Nachrichten, mehr Informationen unterhalb.Es gibt zwei verschiedene Möglichkeiten zur Aus- und Weitergabe der Nachrichten:
single
: Der aktuelle Zählerstand wird als msg.count
an das eingehende Nachrichtenobjekt gehangen.split
: Die Node hat nun zwei ausgehende Punkte. Der erste gibt nur den Zählerstand als msg.payload
und ggf. Informationen zur Limitierung aus. Der zweite Ausgang enthält das unberührte, originale msg
Objekt.Es ist möglich, den Zähler mittels eingehenden Nachrichten im Verhalten zu kontrollieren. Dies geschieht mit Eigenschaften des eigehenden msg
Objektes:
msg.increment
: Der Zähler wird um den übergebenen Wert erhöht.msg.decrement
: Der Zähler wird um den übergebenen Wert verringert.msg.reset
: Wenn kein Wert übergeben wurde, wird der Zähler auf den initial count
zurückgesetzt. Wird hingegen ein Wert übergeben, so wird der Wert des Zählers auf diesen gesetzt.Zwei einfache Beispiel-Flows welche die Bedienung und Ausgabe der Node zeigen.
[{
"id":"25b6280d.1ecf6",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"decrement",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":380,
"y":160,
"wires":[["8a41c1.6006b64"]]
},{
"id":"285e0e19.b9680a",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"increment",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":380,
"y":120,
"wires":[["ce8d952f.18666"]]
},{
"id":"fda0a334.bc9588",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"reset",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":370,
"y":200,
"wires":[["17cce981.975686"]]
},{
"id":"ce8d952f.18666",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.increment = 2;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":120,
"wires":[["ac65bf94.6e609"]]
},{
"id":"17cce981.975686",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.reset = true;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":200,
"wires":[["ac65bf94.6e609"]]
},{
"id":"8a41c1.6006b64",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.decrement = 1;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":160,
"wires":[["ac65bf94.6e609"]]
},{
"id":"ac65bf94.6e609",
"type":"counter",
"z":"327d23e5.bb5924",
"name":"",
"init":"0",
"step":1,
"lower":null,
"upper":null,
"mode":"increment",
"outputs":"1",
"x":740,
"y":140,
"wires":[["988afc3c.a08f98"]]
},{
"id":"370626a8.22216a",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"normal msg without control parameter",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":470,
"y":80,
"wires":[["ac65bf94.6e609"]]
},{
"id":"988afc3c.a08f98",
"type":"debug",
"z":"327d23e5.bb5924",
"name":"message",
"active":true,
"console":"false",
"complete":"true",
"x":900,
"y":140,
"wires":[]
}]
[{
"id":"4f41c5a1.85426c",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"decrement",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":380,
"y":380,
"wires":[["e9085587.2d19c"]]
},{
"id":"afb267a8.63739",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"increment",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":380,
"y":340,
"wires":[["4a35e3c7.3dbd0c"]]
},{
"id":"f066adf1.21ba",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"reset",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":370,
"y":420,
"wires":[["523f8e05.d5537"]]
},{
"id":"4a35e3c7.3dbd0c",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.increment = 3;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":340,
"wires":[["f33ad4bd.777a5"]]
},{
"id":"523f8e05.d5537",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.reset = 10;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":420,
"wires":[["f33ad4bd.777a5"]]
},{
"id":"e9085587.2d19c",
"type":"function",
"z":"327d23e5.bb5924",
"name":"msg object",
"func":"msg.decrement = 1;\nreturn msg;",
"outputs":1,
"noerr":0,
"x":550,
"y":380,
"wires":[["f33ad4bd.777a5"]]
},{
"id":"9b40b088.73732",
"type":"debug",
"z":"327d23e5.bb5924",
"name":"count",
"active":true,
"console":"false",
"complete":"payload",
"x":890,
"y":340,
"wires":[]
},{
"id":"f33ad4bd.777a5",
"type":"counter",
"z":"327d23e5.bb5924",
"name":"",
"init":"100",
"step":"1",
"lower":null,
"upper":null,
"mode":"increment",
"outputs":"2",
"x":740,
"y":360,
"wires":[
["9b40b088.73732"],
["876cc69d.d4b438"]
]
},{
"id":"99b73d63.9fdb",
"type":"inject",
"z":"327d23e5.bb5924",
"name":"normal msg without control parameter",
"topic":"",
"payload":"",
"payloadType":"date",
"repeat":"",
"crontab":"",
"once":false,
"x":470,
"y":300,
"wires":[["f33ad4bd.777a5"]]
},{
"id":"876cc69d.d4b438",
"type":"debug",
"z":"327d23e5.bb5924",
"name":"message",
"active":false,
"console":"false",
"complete":"true",
"x":900,
"y":380,
"wires":[]
}]
Kommentare 4
1wire
Hallo,
die Node funktioniert soweit prima. Allerdings kann ich per msg.reset die Node nur auf 1 oder andere Zahl setzen. das zurücksetzen auf 0 funktioniert nicht, wird ignoriert.
Markus Scharff
Ich möchte über msg.increment Stromwerte addieren, diese können aber auch mal 0 werden. Leider wird bei msg.increment mit Wert 0 der default Wert aus den Parametern addiert.... diesen mit 0 vorgeben funktioniert nicht. Es wird immer min. 1 addiert. Gibt es hierfür eine Lösung? Für Folge Berechnungen brauche ich den Nachrichtenfluss mit einer Addition 0. Die Addition bei 0 aussetzen hilft mir nicht, weil dann Folge Berechnungen nicht ausgeführt werden.
Manfred
den counter find ich klasse!
Mir fehlt nur eine Einstellung wo ich eine loop, die sowohl auf lower bzw. upper limit springt, einstellen kann.
Danke für den tollen node.
Manfred
Daniel Dz
Hallo,
Wie muss ich das Programm anpassen, wenn ich möchte, dass der Zähler bei Zählerstand 10 zurückgesetzt wird?
Danke sehr.