Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

node-red-contrib-boolean-logic-ultimate

Supergiovane3.6kMIT1.2.2

A set of Node-RED enhanced boolean logic and utility nodes, flow interruption, blinker, invert, filter, toggle etc.., with persistent values after reboot. Compatible also with Homeassistant values.

node-red, boolean, gate, filter, logic

readme

Logo

NPM version NPM downloads per month NPM downloads total MIT License JavaScript Style Guide Donate via PayPal youtube

A set of Node-RED enhanced boolean logic and utility nodes, with persistent values after reboot. Compatible also with Homeassistant values.



CHANGELOG



TRANSLATOR NODE

Other than true/false, all nodes accepts Homeassistant output strings.

You can even add your own input translation word list, thanks to the translator-config node. The translator node can translate an input payload, to a true/false boolean values.
Each row in the text box, represents a translation command.
There are some default translation's rows, to make the boolean-logic-ultimate nodes compatible with Homeassistant as default.
You can add your own translation row.

| | Description | | --------- | ---------------------------------------------------------------------------------------------------- | | Translate | Add, delete or edit your own translation command. The row's translation command must be input string:true(or false). For example: open:true closed:false. You can also use an expressions to be evaluated, like this {{value>=50}}:true and {{value<50}}:false. In this case, the tranlsator will evaluate (javascript eval) the expression and, if true, returns the choosen value. |

alt text



BOOLEAN LOGIC

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"1a90a718.5c0409","type":"BooleanLogicUltimate","z":"adb2ee5c.0bf6e","name":"","filtertrue":"both","persist":true,"sInitializeWith":"WaitForPayload","triggertopic":"trigger","outputtriggeredby":"all","inputCount":2,"topic":"result","x":380,"y":160,"wires":[["5f9fbfcc.d2c34"],[],[]]},{"id":"81ef6fec.5d413","type":"inject","z":"adb2ee5c.0bf6e","name":"Night","topic":"Dark","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":180,"wires":[["1a90a718.5c0409"]]},{"id":"e0d5d620.966478","type":"inject","z":"adb2ee5c.0bf6e","name":"Daylight","topic":"Dark","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":140,"wires":[["1a90a718.5c0409"]]},{"id":"1c2f8e73.2c22ba","type":"inject","z":"adb2ee5c.0bf6e","name":"Motion detect true","topic":"Motion","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":240,"wires":[["1a90a718.5c0409"]]},{"id":"5f9fbfcc.d2c34","type":"debug","z":"adb2ee5c.0bf6e","name":"Garden Light","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":580,"y":160,"wires":[]},{"id":"201baa3d.7c63ae","type":"inject","z":"adb2ee5c.0bf6e","name":"Motion detect false","topic":"Motion","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":280,"wires":[["1a90a718.5c0409"]]},{"id":"b65f4ff4.bfe2c8","type":"comment","z":"adb2ee5c.0bf6e","name":"Motion sensor turns on lights, when it's dark. The light turns off itself at day","info":"","x":290,"y":100,"wires":[]}]
<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"53a10a7a.cf1894","type":"BooleanLogicUltimate","z":"a76c6a12.37379","name":"","filtertrue":"onlytrue","persist":true,"sInitializeWith":"true","triggertopic":"Pushbutton","outputtriggeredby":"onlyonetopic","inputCount":2,"topic":"result","x":340,"y":220,"wires":[["cd9244ea.471b78"],[],[]]},{"id":"9318320b.670af8","type":"inject","z":"a76c6a12.37379","name":"","topic":"Pushbutton","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":220,"wires":[["53a10a7a.cf1894"]]},{"id":"20a981b9.552b4e","type":"inject","z":"a76c6a12.37379","name":"","topic":"IsNight","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":320,"wires":[["53a10a7a.cf1894"]]},{"id":"da0dff55.d7888","type":"inject","z":"a76c6a12.37379","name":"","topic":"IsNight","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":360,"wires":[["53a10a7a.cf1894"]]},{"id":"7129d101.1fb7d8","type":"comment","z":"a76c6a12.37379","name":"Pushbutton to switch on light stairs, only if it's night.","info":"","x":210,"y":180,"wires":[]},{"id":"cd9244ea.471b78","type":"debug","z":"a76c6a12.37379","name":"Temporized Stairs Lightbulb","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":580,"y":220,"wires":[]},{"id":"ad5a62a1.7ad81","type":"comment","z":"a76c6a12.37379","name":"Brightness sensor","info":"","x":110,"y":280,"wires":[]}]

The node performs Boolean logic on the incoming payloads.

The node expects a fixed number of topics (configured in the settings) on which it will operate. It will only output a value

when it has seen the expected number of topics. If it ever sees more than the configured number of topics it will log a message then reset its state and start over.

The input message is preserved and passed to the output, changing only the topic and the payload.

The node performs some checks on the incoming boolean payloads and outputs all results at the same time, as follow:

  • Output "AND": true or false
  • Output "OR": true or false
  • Output "XOR": true or false

If you need "NAND" or "NOR" gate, just put an InvertUltimate node respectively after the "AND" or "OR" output.

The node can have a persistent input: the input values are retained after a node-red reboot. That means, that if you reboot your node-red, you don't need to wait all inputs to arrive and initialize the node, before the node can output a payload.

You can also set the default values of the topic inputs.

The node can convert arbitrary input values to true/false. It supports Homeassistant string to boolean conversion as well. For enabling auto conversion, please be sure to disable Reject non boolean (true/false) input values

NODE CONFIGURATION

Property Description
Inputs count Set the number of different topics to be evaluated. The node will output a message to the flow, after this number of different topics arrives. Remember: each input topic must be different. For example, if you set this field to 3, the node expects 3 different topics.
Evaluate It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"
Filter output Output both 'true' and 'false' results: Standard behaviour, the node will output true and false whenever it receives an input and calculate the boolean logics as output. Output only 'true' results: whenever the node receives an input, it outputs a payload true only if the result of the logic is true. False results are filtered out.
Trigger mode All topics: standard behaviour, the node will evaluate each input topic and ouputs the values. At each input change, it will output a msg on the flow. Single topic + eval other inputs: the node evaluates all the input topics, but only whenever it receives a msg input with the specified topic, it outputs a msg to the flow.
If input states are undefined Every time you create a node or modify the node, all inputs are set to undefined. This means that the node will wait the arrive of all topics (for example 3 topics, if you've selected 3 topics in the option), before it can output a payload. This can be a problem if your logic must be operative as soon as you deploy the flow. To overcome this problem, you can "initialize" all the undefined inputs with True or False. Leave undefined: Standard behaviour, the node will wait all the "undefined" topics to arrive, then starts a flow with the result. True or False: The node is immediately operative, by force the initialization of the "undefined" inputs with "true" or "false".
Remember latest input values after reboot If checked, the input values are retained after a node-red reboot. That means, that if you reboot your node-red, you don't need to wait all inputs to arrive and initialize the node, before the node can output a payload. Every time you modify the node's config, the retained values are cleared.
Reject non boolean (true/false) input values If checked, the node will accept only boolean true/false values. Otherwise, it will try to convert the payload value to a logic true/false boolean.
Delay evaluation (ms) Delays the evaluation until this time (in milliseconds) is elapsed. Each time a message or "topic trigger message" (see Trigger mode) arrives, the delay is restarted. This option is useful for debouncing pourposes or simply for adding some delay. For example, you can turn on a light if the room is occupied for a long time, allowing people to fast transit repeatedly, without the need of turning the light on. Another example, if you have many sensors changing state rapidly, you can wait until these sensor reach a quiet state, then evaluate the inputs.

INPUT MSG TO THE NODE

Input msg Description
msg.reset = true Resets all saved input values to undefined
msg.inputcount Changes the inputs count property. For example, msg.inputcount = 3 Whenever you lower the inputcount from a higher number to a lower one, for example from 3 to 2, it's suggested to do a msg.reset=true to reset all stored input values.





INTERRUPT FLOWS ULTIMATE

The interrupt flows is able to stop the input messages to exiting the node.

NODE CONFIGURATION

Property Description
Trigger by topic Whenever the node receives a payload = false from this topic,it stops output messages to the flow. As soon it receives payload = true from this topic, the output messages start to flow out again. The node will output the current stored message plus an added property "isReplay = true", as soon as it receives a msg.play = true from this topic. The node will clear the current stored message, as soon as it receives a msg.reset = true from this topic.
With Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"
Then This property, allow you to auto toggle the selected start state (pass or block) after a timer has elapsed. You can choose from some pre-defined delays. If you have, for example, an Homekit-Bridged nodeset with a thermostat node or security system node in your flow, once node-red restarts, these homekit nodes output a default message to the flow. Just put an InterruptFlow node with a "block at start" behaviour and a toggle delay enabled behind homekit nodes, to temporary stop the chained nodes to receive the unwanted startup message.

INPUT MSG WITH "TRIGGER" TOPIC

Pass msg.payload = true to allow messages to pass through

Pass msg.payload = false to prevent messages from passing through

Pass msg.play = true from a message having the "trigger" topic, to replay the last stored message

Pass msg.reset = true from a message having the "trigger" topic, to clear the last stored message

// Assume you set the "trigger by topic" field to "trigger" // This code replays the last message and adds the property msg.isReplay = true to the output message. msg.topic = "trigger" msg.play = true; // Assume you set the "trigger by topic" field to "trigger" // This code clears the last stored message msg.topic = "trigger" msg.reset = true;

See the example below.

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"1fd91f1f.c1fae9","type":"InterruptFlowUltimate","z":"96f56ceb91657677","name":"Interrupt Flow","triggertopic":"IsNight","initializewith":"1","autoToggle":"0","x":420,"y":200,"wires":[["b9844c7f.0f306"]]},{"id":"eaa32462.398808","type":"comment","z":"96f56ceb91657677","name":"Motion sensor to switch on stairs light, only if it's night, using flow interruption","info":"","x":350,"y":160,"wires":[]},{"id":"10787f38.edfe81","type":"inject","z":"96f56ceb91657677","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"IsNight","payload":"true","payloadType":"bool","x":170,"y":300,"wires":[["1fd91f1f.c1fae9"]]},{"id":"a6092a15.1c592","type":"inject","z":"96f56ceb91657677","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"IsNight","payload":"false","payloadType":"bool","x":170,"y":340,"wires":[["1fd91f1f.c1fae9"]]},{"id":"21ba9c30.02abbc","type":"comment","z":"96f56ceb91657677","name":"Brightness sensor","info":"","x":170,"y":260,"wires":[]},{"id":"af131ae5.a1bfb8","type":"inject","z":"96f56ceb91657677","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"MotionSensor","payload":"true","payloadType":"bool","x":190,"y":200,"wires":[["1fd91f1f.c1fae9"]]},{"id":"b9844c7f.0f306","type":"debug","z":"96f56ceb91657677","name":"Temporized Stairs Lightbulb","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":660,"y":200,"wires":[]},{"id":"a5305f8bef578897","type":"comment","z":"96f56ceb91657677","name":"Temporary stop the flow, with Toggle","info":"","x":220,"y":440,"wires":[]},{"id":"ffc9d3b9d17bc07b","type":"InterruptFlowUltimate","z":"96f56ceb91657677","name":"Interrupt Flow with toggle","triggertopic":"trigger","initializewith":"0","autoToggle":"20","x":400,"y":480,"wires":[["14a72f83f29bb347"]]},{"id":"398548646f66c457","type":"inject","z":"96f56ceb91657677","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":true,"onceDelay":0.1,"topic":"","payloadType":"date","x":170,"y":480,"wires":[["ffc9d3b9d17bc07b"]]},{"id":"14a72f83f29bb347","type":"debug","z":"96f56ceb91657677","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":630,"y":480,"wires":[]}]

In this other example, you can see the property "play" in action. This property allow you to replay the last previously stored message.

This allow to save the state of a node and then replay it back whenever you want.

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"9839dd47.81b2c8","type":"InterruptFlowUltimate","z":"1337569a6adbb2e3","name":"Interrupt Flow","triggertopic":"trigger","initializewith":"1","autoToggle":"0","x":580,"y":300,"wires":[["d371d690.1e2fe8"]]},{"id":"568deb73.394fb4","type":"comment","z":"1337569a6adbb2e3","name":"1) Push buttons to change values","info":"","x":190,"y":140,"wires":[]},{"id":"e1c9f10a.0ba518","type":"inject","z":"1337569a6adbb2e3","name":"ALLOW","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"true","payloadType":"bool","x":130,"y":360,"wires":[["9839dd47.81b2c8"]]},{"id":"82ba24f9.0f0bd8","type":"inject","z":"1337569a6adbb2e3","name":"INTERRUPT","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"false","payloadType":"bool","x":150,"y":320,"wires":[["9839dd47.81b2c8"]]},{"id":"23ba4f9c.86de9","type":"comment","z":"1337569a6adbb2e3","name":"2) Push INTERRUPT, then try again to change value (1)","info":"","x":260,"y":280,"wires":[]},{"id":"24671ef2.4519e2","type":"inject","z":"1337569a6adbb2e3","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":130,"y":180,"wires":[["9839dd47.81b2c8"]]},{"id":"d371d690.1e2fe8","type":"debug","z":"1337569a6adbb2e3","name":"Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":750,"y":300,"wires":[]},{"id":"409ec415.735d74","type":"inject","z":"1337569a6adbb2e3","name":"REPLAY","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"","payloadType":"str","x":140,"y":460,"wires":[["6653ed0.7186014"]]},{"id":"6653ed0.7186014","type":"change","z":"1337569a6adbb2e3","name":"Play","rules":[{"t":"set","p":"play","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":460,"wires":[["9839dd47.81b2c8"]]},{"id":"e957a069.0ac458","type":"inject","z":"1337569a6adbb2e3","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":130,"y":220,"wires":[["9839dd47.81b2c8"]]},{"id":"8f0af608.8fb45","type":"comment","z":"1337569a6adbb2e3","name":"3) Replay last message stored by the node","info":"","x":220,"y":420,"wires":[]},{"id":"46e6f455.0023ac","type":"comment","z":"1337569a6adbb2e3","name":"You can use Interruptflow, to save the state of a node, and then replay the last state as you want.","info":"","x":390,"y":100,"wires":[]}]





INVERT ULTIMATE

Outputs the inverted input. For example true -> false

The input message is preserved and passed to the output, changing only the topic and the payload. If the input message has it's own topic, it'll be preserved as well.

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"






FILTER ULTIMATE

This node has 2 outputs.

If the input payload is true, the node will send true on output 1 and nothing on output 2

If the input payload is false, the node will send nothing on output 1 and false on output 2

The input message is preserved and passed to the output, changing only the topic and the payload. If the input message has it's own topic, it'll be preserved as well.

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"






BLINKER ULTIMATE

The pourpose of this node is to blink a led or something.

output1 : outputs the value true/false

output2 : outputs the inverted value false/true


NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"

Pass msg.payload = true to start blinking

Pass msg.payload = false to stop blinking

Pass msg.interval = 2000 to change the blinking interval

  • output1 stop behavior : when the blinker receives the stop message, you can select the behavior of the output1
  • output2 stop behavior : when the blinker receives the stop message, you can select the behavior of the output2
<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"33d76f42.58e088","type":"BlinkerUltimate","z":"c3456bd7.8ee9d8","name":"Blinker","blinkfrequency":"500","x":260,"y":340,"wires":[["ad7488b.2a1d9f8"]]},{"id":"ac0d404f.70cc","type":"inject","z":"c3456bd7.8ee9d8","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":90,"y":320,"wires":[["33d76f42.58e088"]]},{"id":"bfdc64c6.06e2d","type":"inject","z":"c3456bd7.8ee9d8","name":"","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":90,"y":360,"wires":[["33d76f42.58e088"]]},{"id":"ad7488b.2a1d9f8","type":"debug","z":"c3456bd7.8ee9d8","name":"Led","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":410,"y":340,"wires":[]},{"id":"865e29f9.4d1e98","type":"comment","z":"c3456bd7.8ee9d8","name":"Blink a signalling led","info":"","x":110,"y":280,"wires":[]}]





SIMPLE OUTPUT ULTIMATE

The pourpose of this node is to send a message with payload TRUE on the first output and FALSE on second output, independently from the msg input.

This is useful if you need to simply send a true or false payload.

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"e1149e22.c9b298","type":"inject","z":"81a64dae.012c18","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":820,"wires":[["6a419c72.5a4e7c"]]},{"id":"6a419c72.5a4e7c","type":"SimpleOutputUltimate","z":"81a64dae.012c18","name":"T/F","x":290,"y":820,"wires":[["8ba3f611.26beb8"],["b469193b.950598"]]},{"id":"8ba3f611.26beb8","type":"debug","z":"81a64dae.012c18","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":530,"y":800,"wires":[]},{"id":"b469193b.950598","type":"debug","z":"81a64dae.012c18","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":530,"y":840,"wires":[]},{"id":"2451f593.04e62a","type":"comment","z":"81a64dae.012c18","name":"Whatever the input is, output msg with payload TRUE on first and FALSE on second output.","info":"","x":330,"y":760,"wires":[]}]





INJECT ULTIMATE

The pourpose of this node is to send a message with payload TRUE on the first output, FALSE on second output and a TOGGLE (true/false) on the third output, by pressing the pushbutton.

This is useful if you need to simply test your flow.

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"13faaec9.cd80b9","type":"InjectUltimate","z":"81a64dae.012c18","name":"True","x":110,"y":1000,"wires":[["6557d19.c71abb"],[],[]]},{"id":"6557d19.c71abb","type":"debug","z":"81a64dae.012c18","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":370,"y":1080,"wires":[]},{"id":"569b3820.b056e8","type":"InjectUltimate","z":"81a64dae.012c18","name":"False","x":110,"y":1080,"wires":[[],["6557d19.c71abb"],[]]},{"id":"189399f.c384f66","type":"InjectUltimate","z":"81a64dae.012c18","name":"Toggle","x":110,"y":1160,"wires":[[],[],["6557d19.c71abb"]]},{"id":"56119644.8c4bf8","type":"comment","z":"81a64dae.012c18","name":"Inject Ultimate. Simple and efficient.","info":"","x":180,"y":940,"wires":[]}]





STATUS ULTIMATE

The pourpose of this node is to show a status of the passingthrough message.

Show msg.

  • Write here the property you want to get the status from. For example, "payload", "mycar.color", etc.
<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"8c1648bf.58e6","type":"StatusUltimate","z":"5c2de561.6a0de4","name":"Status","property":"testobject.color","x":90,"y":180,"wires":[["b96cd259.3f8398"]]},{"id":"3beb9c6.90d1e64","type":"function","z":"5c2de561.6a0de4","name":"Dummy msg","func":"msg.payload = \"The payload is \" + msg.payload;\nmsg.myproperty = \"This is my custom property\";\nmsg.testobject = {len : 100, color : \"blue\"};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":230,"y":100,"wires":[["8c1648bf.58e6"]]},{"id":"84080b79.df3f38","type":"debug","z":"5c2de561.6a0de4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":710,"y":180,"wires":[]},{"id":"b534d2ec.635398","type":"InjectUltimate","z":"5c2de561.6a0de4","name":"Inject","topic":"1","curVal":true,"x":90,"y":100,"wires":[[],[],["3beb9c6.90d1e64"]]},{"id":"9745c77a.0361b","type":"comment","z":"5c2de561.6a0de4","name":"View the status of a message passing through the StatusUltimate node","info":"","x":270,"y":40,"wires":[]},{"id":"b96cd259.3f8398","type":"StatusUltimate","z":"5c2de561.6a0de4","name":"Status","property":"payload","x":230,"y":180,"wires":[["ac2b784b.b44a48"]]},{"id":"ac2b784b.b44a48","type":"StatusUltimate","z":"5c2de561.6a0de4","name":"Status","property":"myproperty","x":450,"y":180,"wires":[["84080b79.df3f38"]]}]





IMPULSE ULTIMATE

The pourpose of this node is to send a sequence of pulsed commands to for example, open a garage door or to command an appliance requiring a set of timed commands.

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"6fc25e59990d5955","type":"ImpulseUltimate","z":"5ed79f4a958a1f20","name":"Turn on the fan at level 1","commandText":"// Turn on the fan (must be sent as first command ever\n// even if the fan is already off)\nsend:true\nwait:300\nsend:false\nwait:3000\n// Reset the fan\nsend:true\nwait:2000\nsend:false\nwait:3000\n// Speed 1\nsend:true\nwait:300\nsend:false","x":410,"y":140,"wires":[["7a2ea180e17e513c"]]},{"id":"0d7de5c606ecaf92","type":"InjectUltimate","z":"5ed79f4a958a1f20","name":"START THE FAN","topic":"1","curVal":true,"x":130,"y":120,"wires":[["6fc25e59990d5955"],[],[]]},{"id":"7a2ea180e17e513c","type":"debug","z":"5ed79f4a958a1f20","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":620,"y":140,"wires":[]},{"id":"333733dffda4dc56","type":"InjectUltimate","z":"5ed79f4a958a1f20","name":"BLOCK SCRIPT","topic":"1","curVal":true,"x":130,"y":200,"wires":[[],["6fc25e59990d5955"],[]]},{"id":"cdae7e4bc0835e4f","type":"comment","z":"5ed79f4a958a1f20","name":"This example turns on a \"LucePlan Blow\" fan and set it's speed to 1","info":"","x":260,"y":60,"wires":[]}]

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"

Avaiable Commands

Commands are to be wrote in the format: command:value. For example send:200, wait:2000. Each row represents a command.


send
sends a value. For example: send:true or send:100 or send:Hello

wait
wait for specified time (in milliseconds). For example wait:500 waits for 500 milliseconds

restart
Restart the sequence from the beginning. Use restart alone, without :** and extra value. For example *restart*

//
comment. For example: *
// This opens the garage***. The comment are ignored, so you can write what you want.

Pass msg.payload = true to the node to start the sequence

Pass msg.payload = false to the node to stop the running sequence


  • Output: the node outputs a message you specified in the command textbox





MATH ULTIMATE

The pourpose of this node is to do maths on the incoming values. Each incoming message MUST HAVE OWN TOPIC.

<summary>CLICK HERE, copy and paste it into your flow</summary> [{"id":"05b6ce0cb476abd5","type":"SumUltimate","z":"2bf641f4b8742755","name":"Multiply","property":"payload","math":"multiply","x":400,"y":180,"wires":[["567aa6a9719e463e"]]},{"id":"6744e01b88d820b9","type":"inject","z":"2bf641f4b8742755","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"Wh Washing machine","payload":"10","payloadType":"num","x":190,"y":180,"wires":[["05b6ce0cb476abd5"]]},{"id":"75823dbc7db78c3c","type":"inject","z":"2bf641f4b8742755","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"Cost per KWh","payload":"20","payloadType":"num","x":160,"y":220,"wires":[["05b6ce0cb476abd5"]]},{"id":"567aa6a9719e463e","type":"debug","z":"2bf641f4b8742755","name":"Result","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":530,"y":180,"wires":[]},{"id":"1793931ba218bc1d","type":"inject","z":"2bf641f4b8742755","name":"Reset","props":[{"p":"reset","v":"","vt":"date"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":130,"y":260,"wires":[["05b6ce0cb476abd5"]]},{"id":"0b3277af03f546d4","type":"comment","z":"2bf641f4b8742755","name":"Getting results, (Sum, Multiply etc...) from the MATH node.","info":"","x":270,"y":140,"wires":[]}]

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"

INPUT


msg.reset
resets the values to zero.


  • Output: the node outputs a message as follows:
{
  "payload": 30, // This is the math result
  "topic": "MyMath", // Node  Topic
  "average": 15, // This is the AVERAGE, in case of SUM
  "measurements": 2 // This is the number of topics that have been evaluated
}

br/>





TOGGLE ULTIMATE

The pourpose of this node is to toggle between true/false, everytime an inboud message arrives.

NODE CONFIGURATION

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"

INPUT

Any message that arrives on input, will be passwd through to the output with the payload toggled between true and false.






RAILWAY SWITCH ULTIMATE

The railway switcher, redirect the incoming messages to one ot the avaiable output pins, just like a railway jinction switch.

NODE CONFIGURATION

Property Description
Switcher topic Whenever the node receives a payload from this topic, it redirects the input messages to a choosen output PIN.
With Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"
Translator Translates the incoming payload value. This allows the compatibility with, for example, HomeAssistant nodes.

Inputs

The Switcher topic controls where the railway switch must be switched, between the output PINs.

Once an output PIN has been choosen, all messages passing through the node will be deviated to te choosen output PIN.

: topic (string|number) : this is the topic of the switcher message.

: payload (number|boolean) : this is the ouput PIN selector, base 0 (0 is the first output PIN).

JSON switcher message

Take the example where you choosen such properties:

Switcher topic: "switcher"

With Input: "payload"

this JSON input message redirects all input messages to the first PIN

{
    topic:"switcher",
    payload:0
}

this JSON input message redirects all input messages to the second PIN

{
    topic:"switcher",
    payload:1
}

this JSON input message redirects all input messages to the third PIN, and so on...

{
    topic:"switcher",
    payload:2
}

See the example below.

Copy and paste it into your flow

[{"id":"8243309f7c926112","type":"RailwaySwitchUltimate","z":"aa3efc585a6c7b9b","name":"Railway Switch","triggertopic":"switcher","initializewith":"3","payloadPropName":"payload","translatorConfig":"","x":350,"y":260,"wires":[["7f5a2c19a9ef64c8"],["5a35a650b225d910"],[],[],[]]},{"id":"d7bbc077bc20f4ea","type":"InjectUltimate","z":"aa3efc585a6c7b9b","name":"Junction switcher to Rail 0","topic":"","curVal":true,"outputJSON":"{ \n\t\"payload\":0,\n\t\"topic\":\"switcher\"\n}","x":350,"y":80,"wires":[[],[],[],["8243309f7c926112"]]},{"id":"5656d0c2ba66ed5e","type":"InjectUltimate","z":"aa3efc585a6c7b9b","name":"Junction switcher to Rail 1","topic":"","curVal":true,"outputJSON":"{ \n\t\"payload\":\"1\",\n\t\"topic\":\"switcher\"\n}","x":350,"y":160,"wires":[[],[],[],["8243309f7c926112"]]},{"id":"2253336fa8374c78","type":"InjectUltimate","z":"aa3efc585a6c7b9b","name":"Train","topic":"","curVal":true,"outputJSON":"{ \n\t\"payload\":\"hello\",\n\t\"topic\":\"I'm a train!\"\n}","x":110,"y":280,"wires":[["8243309f7c926112"],[],[],[]]},{"id":"7f5a2c19a9ef64c8","type":"debug","z":"aa3efc585a6c7b9b","name":"Rail 0","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":590,"y":260,"wires":[]},{"id":"5a35a650b225d910","type":"debug","z":"aa3efc585a6c7b9b","name":"Rail 1","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":590,"y":300,"wires":[]}]




KALMAN FILTER ULTIMATE

Outputs the Kalman filtered input.

Please refer to this link, on how it works.

image.png

Property Description
Input It's the msg property to be evaluated. By default, it is "payload", but you can also specify other properties, for example "payload.value"
Measurement noise Kalman's R parameter.
Process noise Kalman's Q parameter.
Translator Input Translates the incoming payload value, to true/false. This allows the compatibility with, for example, HomeAssistant nodes.

Inputs

: reset (any) : by passing msg.reset, the Kalman filter will be reset. : payload (number) : the payload containing the number. If you've changed the incoming evaluation property in the Input field, the number to be evaluated must be put in such message's property, instead of the payload property.


RATE LIMITER ULTIMATE

Gateway per sensori e dispositivi troppo “chiacchieroni”: limita burst e rimbalzi con modalità Debounce, Throttle e Window. Lo stato del nodo riporta sempre modalità corrente, contatori di messaggi inoltrati e bloccati.

NODE CONFIGURATION

Property Description
Mode Seleziona la logica: Debounce (attende quiete), Throttle (impone un intervallo minimo), Window (massimo N messaggi per finestra temporale).
Wait (ms) Ritardo di quiete per la modalità debounce.
Emit Per debounce: scegli tra Leading (subito), Trailing (ultimo), Both.
Interval (ms) Intervallo minimo tra messaggi in modalità throttle.
Emit trailing In throttle, inoltra l’ultimo messaggio ricevuto allo scadere dell’intervallo.
Window size (ms) Larghezza della finestra mobile in modalità window.
Max messages Numero di messaggi ammessi nella finestra.
On limit Drop scarta i messaggi extra, Queue last accoda l’ultimo e lo riproduce appena possibile.
Control topic Topic dei messaggi di controllo (default rate).
With Input Proprietà del messaggio da monitorare (default msg.payload).
Stats every (s) Ogni quanti secondi emettere un riepilogo statistico (0 = disattivato).
Translator Nodo translator-config opzionale per adattare le stringhe d’ingresso a true/false.

OUTPUTS

  • Output 1: messaggi inoltrati, invariati.
  • Output 2: diagnostica ({mode, reason, passed, dropped, msg, propertyValue}) e statistiche periodiche su controlTopic/stats.

CONTROL MESSAGES (msg.topic === controlTopic)

  • msg.reset = true → azzera contatori, accoda azzerata e timer cancellati.
  • msg.flush = true → forza l’emissione immediata del messaggio in attesa.
  • msg.mode = 'debounce'|'throttle'|'window' → cambia modalità runtime e resetta lo stato.
  • msg.interval, msg.wait, msg.windowSize, msg.maxInWindow → aggiorna i parametri corrispondenti.

PRESENCE SIMULATOR ULTIMATE

The purpose of this node is to replay a programmable sequence of messages in order to simulate occupancy when you are away.

NODE CONFIGURATION

Property Description
Control topic Topic used for runtime commands such as start/stop/reset.
Auto start Starts the sequence automatically after deploy or restart.
Loop sequence Repeats the sequence when it reaches the end.
Random delays Enables a random variation of the programmed delays.
Jitter (%) Maximum percentage of variation applied when random delays are enabled.
With Input Message property to inspect for inline events (default payload).
Translator Optional translator-config to convert incoming values.
Sequence One JSON object per line, each containing at least delay (ms) plus the properties to output.

CONTROL MESSAGES (msg.topic === controlTopic)

  • msg.command = 'start' / msg.start = true → begin playback.
  • msg.command = 'stop' / msg.stop = true → halt playback.
  • msg.reset = true → reset counters and start position.
  • msg.sequence = [...] → load a new sequence at runtime.
  • msg.loop, msg.randomize, msg.jitter → update the corresponding options.

Each event in the sequence outputs a message configured in the JSON line. When random delays are enabled, the effective delay is varied within the configured jitter.


STAIRCASE LIGHT ULTIMATE

The purpose of this node is to control staircase lighting with a timer, pre-off warning and optional extension on every trigger.

NODE CONFIGURATION

Property Description
Control topic Topic that receives manual commands such as on, off, extend.
Duration (s) Lighting duration for each trigger.
Warning before off Enables emission of a pre-off warning on output 2.
Warning offset (s) Seconds before switch-off when the warning is sent.
Restart on trigger Restarts the timer when a new trigger arrives while active.
Allow off input Allows a false from the main input to switch off immediately.
With Input Message property evaluated as trigger (default payload).
Translator Optional translator-config for true/false conversion.
On/Off payload Values emitted on output 1 to turn the light on/off.
Warning payload Value emitted on output 2 when the warning fires.

CONTROL MESSAGES (msg.topic === controlTopic)

  • msg.command = 'on' / msg.start = true → start the timer and turn on the light.
  • msg.command = 'off' / msg.stop = true → switch off immediately.
  • msg.command = 'extend' / msg.extend = true → refresh the timer while keeping the light on.
  • msg.duration, msg.warningEnabled, msg.warningOffset → adjust runtime settings.

Output 1 delivers the ON/OFF command. Output 2 delivers the warning and includes msg.remaining with the seconds left.


DEVELOPMENT

Per eseguire i test automatici:

  1. npm install
  2. npm test

changelog

node-red-contrib-boolean-logic-ultimate

Donate via PayPal

CHANGELOG

Version 1.2.2 September 2025
- KalmanFilterUltimate: renamed configuration fields for R/Q parameters to measurement/process noise to avoid reserved-property conflicts.

Version 1.2.1 September 2025
- NEW: PresenceSimulatorUltimate to replay configurable message sequences and simulate occupancy.
- NEW: StaircaseLightUltimate to manage staircase lighting timers with pre-off warnings.
- NEW: RateLimiterUltimate node with debounce, throttle and window modes.
- Added shared helper for consistent status/timer handling across ultimate nodes.

Version 1.1.27 July 2025
- Status node: UI correction.

Version 1.1.26 July 2025
- Interruptflow node: fixed non functional msg.play.

Version 1.1.25 January 2025
- BREAKING CHANGE
- BREAKING CHANGE
- BREAKING CHANGE
- Numerical values are now evaluated as string values and translated like any other word in translation table. That means, 1 and numbers major than 1 are not equal to true anymore, and 0 is not equal to false anymore. If you input numerical values as boolean (bad attitude), please fix your flows by change it to boolean.
- BREAKING CHANGE
- BREAKING CHANGE
- BREAKING CHANGE

Version 1.1.24 January 2025
- Translator node. added js evaluation of the values. For example "{{value>=50}}:true".

Version 1.1.23 December 2024
- Math node. fixed multiply by zero issue.

Version 1.1.22 November 2024
- Kalman Filter node: added filter's reset by issuing meg.reset=true.

Version 1.1.21 November 2024
- Kalman Filter node: rounded the output paylad to three decimals.

Version 1.1.20 November 2024
- NEW: Kalman Filter node.

Version 1.1.19 October 2024
- Maintenance release.

Version 1.1.18 September 2024
- Impulse node: changed the STOP procedure.

Version 1.1.17 September 2024
- Railway Switcher: fixed an issue caused by fixing an issue for backward compatibility of true/false input msg. The node was emitting 0 and 1 instead of true and false

Version 1.1.16 August 2024
- Railway Switcher: fixed an issue for backward compatibility of true/false input msg.

Version 1.1.15 August 2024
- Railway Switcher: now you can choose between 5 different output instead of 2.

Version 1.1.14 Mai 2024
- FIX: inject node: fixed an error in JSON.parse.

Version 1.1.12 Mai 2024
- FIX: inject node: fixed the empty JSON for old injectUltimate nodes.

Version 1.1.11 Mai 2024
- NEW: inject node now can inject a JSON as well.

Version 1.1.9 Mai 2024
- Added samples and better description of the Math's node (in particular, to the subract function).

Version 1.1.8 Mai 2024
- FIX Comparator node: fixed wrong results using minor and major comparator.

Version 1.1.7 April 2024
- Math node: BREAKING CHANGE: in SUBTRACT mode, now you must set a msg.topic to start subtracting from.

Version 1.1.5 April 2024
- Math node: fixed an issue with the "subtract" operator. See contestual help in the node-red help tab.

Version 1.1.3 March 2024
- Comparator node: NEW: you can now reset both input values to *undefined*, by sending **msg.reset = true**.

Version 1.1.2 January 2024
- NEW: added "normal" and "violated" as default accepted inputs, for compatibility with Home Assistant.

Version 1.1.1 October 2023
- Math node: FIX: fixed "measurement" and "average" not showing correct results when using the "subtract" option. Thanks to @VanillaFord

Version 1.1.0 September 2023
- NEW: Translator config node. Each boolean logic node can now translate the input payload to a boolean value. For example, you can add "done:true" to the translation table, to convert the input payload "done", to a boolean TRUE</> value.

Version 1.0.63 September 2023
- NEW: Comparator node. Compare the values from 2 input messages.

Version 1.0.62 August 2023
- Math node: added "subtract option".

Version 1.0.61 Juli 2023
- Standardization of the help, based on Node-Red directives.
- Updated the README

Version 1.0.60 March 2023
- FIX: Fixed some little issues to the Railways Node and fixed the youtube video not having audio https://youtu.be/iPVyiwDIUMg.

Version 1.0.59 January 2023
- NEW: added msg.gatecount property, to dinamically change the gate input count.
- Updated the README

Version 1.0.58 December 2022
- NEW: added string conversion from "home", "not_home" to boolean.
- Updated the README

Version 1.0.57 September 2022
- Added node help in the node-red help tab.

Version 1.0.56 August 2022
- NEW: added string conversion from "true", "false", "0", "1", "close" to boolean.
- Updated the README

Version 1.0.55 July 2022
- NEW: you can now specify the input property name from witch the node picks up the payload.
- NEW: added more Homeassistant string compatibility values.
- Updated the README

Version 1.0.53 June 2022
- NEW: Math Ultimate. The old "Sum" node, now has become a math node, you can peform multipication other than sum.
- Updated README with samples of Math node.

Version 1.0.52 Mai 2022
- NEW: Railway Switcher Ultimate: new node to switch the input message to an output pin (https://youtu.be/iPVyiwDIUMg).
- Updated README with samples of Railway Switch node.

Version 1.0.51 February 2022
- Blinker Ultimate: fixed minor problem with an orphan timer.
- Better scoping of some vars, to leave the memory garbace collector to get rid of unused references.

Version 1.0.50 February 2022
- NEW: Added Youtube example for each node. You can find the link in the config window of each one and hede the playlist https://youtube.com/playlist?list=PL9Yh1bjbLAYoRH4IyQB7EL5srHAihiKpy.

Version 1.0.48 February 2022
- NEW: TOGGLE node: Simple toggle node.

Version 1.0.48 February 2022
- NEW: SUM node: this new node makes sum, average and measurement count.

Version 1.0.47 February 2022
- NEW: Interrupt Flow: the node now stores the last message, even if in the "stop" state.

Version 1.0.46 February 2022
- NEW: Interrupt Flow: msg.reset will delete the stored message.
- Updated the README file with samples.

Version 1.0.45 February 2022
- NEW: Interrupt Flow: Now you can auto-toggle the startup behavior selection (to stop or to pass telegrams) after some pre-defined delays.
- Updated the README file with samples.

Version 1.0.44 February 2022
- Boolean Logic Ultimate: Added the "d" indication, in the node's name, when the delay option is enabled.
- Boolean Logic Ultimate: Refined the UI.

Version 1.0.41 January 2022
- Boolean Logic Ultimate: UI optimization and remove warning triangle if the delay is not set.

Version 1.0.40 January 2022
- NEW: Boolean Logic Ultimate: Delay option added. See the readme on gitHub.

Version 1.0.39 November 2021
- FIX a possible issue when msg.payload is numeric.

Version 1.0.38 November 2021
- All nodes does accept "on" and "off" as input, converting it in "true" and "false" values (Homeassistant friendly).

Version 1.0.36 November 2021
- ImpulseUltimate: NEW: added restart command, to restart the sequence from scratch.

Version 1.0.35 November 2021
- Filterultimate and Invertultimate: added others checks to avoid processing invalid/non boolean convertible payloads and notify it in the node status.

Version 1.0.34 August 2021
- NEW: Impulse node: you run issue a sequence of commands to, for example, open a garage door with a timed impulse, or switch speed of a fan requiring pulsed commands. Check the gitHub home for sample and explanation.

Version 1.0.32 August 2021
- Interruptflow ultimate: fixed an issue involving messages without topic.

Version 1.0.31 August 2021
- NEW: Boolean-Logic-Ulimate can now strict filter for input payload, by accepting only boolean true/false values. If the option is not enabled, the node will continue to try to transform the input payload to a suitable boolean value.

Version 1.0.29 May 2021
- NEW: StatusUltimate node: show the status of the passing-through message.

Version 1.0.28 May 2021
- Fixed some hiccups in checking if a msg.payload is boolean.

Version 1.0.27 April 2021
- Boolean Logic Ultimate: msg.reset = true now resets all inputs.
- Update the help in the README to reflect the changes.

Version 1.0.26 April 2021
- NEW: Interrupt Flow: now you can choose the default state at start, between true (allow telegrams flow) and false (block telegrams flow).
- Blinker: fixed bug in default dropdownbox selection whenever the node was dropped on the flow.
- NEW: Blinker: added autostart option.

Version 1.0.25 February 2021
- BlinkerUltimate: added second output pin that emits an inverted payload.
- BlinkerUltimate: Now you can select to send true or false on both pins once the blinker has been stopped.

Version 1.0.24 January 2021
- Maintenance release: added help links in the property windows and renamed the first property to be more clear.

Version 1.0.23 November 2020
- BUGFIX: Inject Node was not retaining the topic value you set. Fixed.
- Inject Node: clearer status indication.

Version 1.0.22 October 2020
- Changed the way to handle the presistent states. This allow the node to correctly save the states in non standard node-red installations (docker, home-assistant plugin etc). Thanks @Botched1 for raising the issue.
- Automatic migration of persistens states from the old to the new path.
- Moved the inject node in the "common" node-red group.

Version 1.0.20 August 2020
- NEW: Inject Node. The pourpose of this node is to speed up the testing of you flow, by issuing true/false command by pushbutton on the node itself. This node is simpler as the default node-red inject node.

Version 1.0.19 August 2020
- NEW: Simple Output node. The pourpose of this node is to send a message with payload TRUE on the first pin and FALSE on second pin, independently from the msg input.

Version 1.0.18 August 2020
- Boolean Logic: warn user if either topic or payload are not set. You must always set a topic and payload.

Version 1.0.17 June 2020
- Interruptflowultimete: State save/replay. Msg.play = true sends the current payload See the README on github for an example.

Version 1.0.16 May 2020
- BlinkerUltimate: if you set the interval while the blinker is running, yet the new interval is applied immediately.

Version 1.0.15 May 2020
- Adjusted status of Boolean Logic Ultimate. Replaced the text "null", with --- for better understanding.

Version 1.0.14
- NEW: added blinker node. Thanks to @Marco for the suggestion.

Version 1.0.12
- Boolean Logic, FilterUltimate and InvertUltimate now output the entire message input, replacing only topic and payload.

Version 1.0.11
- Enhanced help.

Version 1.0.10
- Fix a possible issue in the "Interrupt Flow", if the trigger topic contains special characters.

Version 1.0.9
- Added "Interrupt Flow" node. Whenever the node receives a payload = false from a specific topic, it stops output messages to the flow. As soon it receives payload = true from this topic, the output messages start to flow out again.

Version 1.0.8
- Updated Help

Version 1.0.7
- Node node shows "f" when "filter true" is selected and "t" (triggername) when "trigger only by single topic" is selected.

Version 1.0.6
- Stripped out the date/time in node status

Version 1.0.5
- Added the Last value change date/time in the status.
- Correction in the in-line help
- Better format of the README.md

Version 1.0.4
- Added the option to initialize the undefined inputs with true or false. Thanks to this, the node is immediately operative (will not wait until all topis arrives).

Version 1.0.3
- Node status: cosmetic adjustments

Version 1.0.2
- Added "trigger mode" option (fixed UI glitch)

Version 1.0.1
- Added "trigger mode" option

Version 1.0.0
- Added Filter node

Version 0.0.8
- Delete persistent states when a new unexpected topic arrrives
- Better status representation
- Better and clearer configuration UI

Version 0.0.7
- Fixed decimal error in the "Invert" node.

Version 0.0.6
- Fixed crappy "Invert" node.

Version 0.0.5
- Bypass persistency if node-red user hasn't permissions to write to the filesystem.

Version 0.0.4
- Fixed conflict issue if you have the old boolean logic installed

Version 0.0.3
- Fixed status display

Version 0.0.2
- Fixed persistent state deletion upon node update/delete

Version 0.0.1
- Initial release