[{"id":"31a2dd89.3ba412","type":"tab","label":"Flow 6 slider","disabled":false,"info":""},{"id":"1f3592c8.9719bd","type":"inject","z":"31a2dd89.3ba412","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":300,"y":290,"wires":[["9881b989.c06f78"]]},{"id":"9881b989.c06f78","type":"function","z":"31a2dd89.3ba412","name":"Init","func":"// \"msg.payload\" init slider node\nmsg.payload = 0;\n// msg not propagated by slider so \"topic\" is not useful\nmsg.topic = \"sliderInit\";\nvar UnoStates = {Slider:0,Direction:\"UP\",Quiet:true, Increment:-1, wipeOff:false };\nvar UnoCounters = {Interval:0, IntShort:0, CntLimit:60000}; // 600000 misurato\nflow.set(\"UnoStates\",UnoStates);\nflow.set(\"UnoCounters\",UnoCounters);\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":350,"wires":[["14eb8869.be3868"]]},{"id":"34bc84df.85a25c","type":"rpi-gpio out","z":"31a2dd89.3ba412","name":"","pin":"32","set":true,"level":"1","freq":"","out":"out","x":1240,"y":340,"wires":[],"inputLabels":["Window#1"]},{"id":"55dbb258.8692fc","type":"rpi-gpio out","z":"31a2dd89.3ba412","name":"","pin":"36","set":true,"level":"1","freq":"","out":"out","x":1240,"y":390,"wires":[],"inputLabels":["Window#1"]},{"id":"14eb8869.be3868","type":"ui_slider","z":"31a2dd89.3ba412","name":"","label":"TappaUNO","group":"deb628f5.33b0e8","order":0,"width":"7","height":"1","passthru":false,"topic":"slider","min":0,"max":"60","step":"5","x":530,"y":350,"wires":[["f66a2cc8.84a3b"]]},{"id":"f66a2cc8.84a3b","type":"function","z":"31a2dd89.3ba412","name":"Compute","func":"msg111={};\nmsg112={};\nmsg113={};\nmsg114={};\nvar UnoStates = flow.get(\"UnoStates\");\nvar UnoCounters = flow.get(\"UnoCounters\");\n// input messages topics could be \"slider\" or \"lBackTimerShort\"\nswitch (msg.topic)\n{\n case \"slider\":\n// blind already rolling?\n if (UnoStates.Quiet === true) {\n// blind is quiet - new slider setup will open or close?\n if(UnoStates.Slider < msg.payload){\n UnoCounters.Interval = (msg.payload - UnoStates.Slider) * 1000;\n// just 100ms before time out expiration - check for slider input reached meanwhile \n UnoCounters.IntShort = UnoCounters.Interval - 100 ;\n UnoStates.Slider = msg.payload;\n UnoStates.Direction = \"UP\";\n UnoStates.Quiet = false;\n msg111.delay = UnoCounters.IntShort;\n msg112.delay = UnoCounters.Interval;\n msg113.payload = 0;\n msg114.payload = 1;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ msg111, msg112, msg113, msg114 ];\n// blind will move DOWN/close\n }else if(UnoStates.Slider > msg.payload){\n UnoCounters.Interval = (UnoStates.Slider - msg.payload) * 1000;\n UnoCounters.IntShort = UnoCounters.Interval - 100 ;\n UnoStates.Slider = msg.payload;\n UnoStates.Direction = \"DOWN\";\n UnoStates.Quiet = false;\n msg111.delay = UnoCounters.IntShort;\n msg112.delay = UnoCounters.Interval;\n msg113.payload = 1;\n msg114.payload = 0;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ msg111, msg112, msg113, msg114 ];\n }else{\n// slider moved up+down => setup didn't change - shouldn't happen if blind is quiet \n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ null, null, null, null ];\n }\n }else { \n// new slider setup received while blind's moving => set buffer \"Increment\" \n UnoStates.Increment = msg.payload;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ null, null, null, null ];\n } \n break;\n// case \"lBackTimerShort\" save Increment buffer and behaves as above\n case \"lBackTimerShort\": \n if (UnoStates.Increment !== -1){\n msg.payload = UnoStates.Increment;\n UnoStates.Increment = -1;\n// followng block is identical as above in case \"slider\"\n if(UnoStates.Slider < msg.payload){\n UnoCounters.Interval = (msg.payload - UnoStates.Slider) * 1000;\n UnoCounters.IntShort = UnoCounters.Interval - 100 ;\n UnoStates.Slider = msg.payload;\n UnoStates.Direction = \"UP\";\n UnoStates.Quiet = false;\n msg111.delay = UnoCounters.IntShort;\n msg112.delay = UnoCounters.Interval;\n msg113.payload = 0;\n msg114.payload = 1;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ msg111, msg112, msg113, msg114 ];\n }else if(UnoStates.Slider > msg.payload){\n UnoCounters.Interval = (UnoStates.Slider - msg.payload) * 1000;\n UnoCounters.IntShort = UnoCounters.Interval - 100 ;\n UnoStates.Slider = msg.payload;\n UnoStates.Direction = \"DOWN\";\n UnoStates.Quiet = false;\n msg111.delay = UnoCounters.IntShort;\n msg112.delay = UnoCounters.Interval;\n msg113.payload = 1;\n msg114.payload = 0;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n return [ msg111, msg112, msg113, msg114 ];\n }else{\n// \"triggerGPIO\" function will manage \n UnoStates.wipeOff = true;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n// msg113.payload = 1;\n// msg114.payload = 0;\n return [ null, null, null, null ];\n }\n }else{\n// \"triggerGPIO\" function will manage \n UnoStates.wipeOff = true;\n flow.set(\"UnoStates\",UnoStates);\n flow.set(\"UnoCounters\",UnoCounters);\n } \n break;\n}\n\n// setTimeout(() => resolve(node.Send ??), 100);\n","outputs":4,"noerr":0,"x":696,"y":350,"wires":[["245d15cc.0c945a"],["7f03ac5a.079554"],["34bc84df.85a25c"],["55dbb258.8692fc"]]},{"id":"7f03ac5a.079554","type":"delay","z":"31a2dd89.3ba412","name":"interval","pauseType":"delayv","timeout":"5","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":870,"y":322,"wires":[["e62f1972.182268"]]},{"id":"e62f1972.182268","type":"function","z":"31a2dd89.3ba412","name":"triggerGPIO","func":"msg121={};\nmsg122={};\nvar UnoStates = flow.get(\"UnoStates\");\nvar UnoCounters = flow.get(\"UnoCounters\");\n// check if the message has been issued by the delay node\nif (msg.delay) {\n// if property wipeOff no incremenal (or === 0) have been reached - re-init buffers \n if (UnoStates.wipeOff === true) {\n UnoStates.Concur = false;\n UnoStates.Quiet = true;\n UnoStates.wipeOff = false;\n msg121.payload = 1;\n msg122.payload = 1;\n return [ msg121, msg122];\n// bew command from slider => under control of \"lBackTimerShort\" branch \n }else{\n return [ null, null];\n }\n}else{\n// messages receives without 'delay' property are useless\n return [ null, null];\n}","outputs":2,"noerr":0,"x":1040,"y":320,"wires":[["34bc84df.85a25c"],["55dbb258.8692fc"]]},{"id":"245d15cc.0c945a","type":"delay","z":"31a2dd89.3ba412","name":"intShort","pauseType":"delayv","timeout":"5","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":868,"y":275,"wires":[["cb25ccc5.bf53b"]]},{"id":"cb25ccc5.bf53b","type":"function","z":"31a2dd89.3ba412","name":"CheckConcurr","func":"// var UnoStates = flow.get(\"UnoStates\");\n// var UnoCounters = flow.get(\"UnoCounters\");\n// add topic to allow \"Compute\" node to select different input \nmsg.topic = \"lBackTimerShort\";\n// filter - spurious messages looped back \n// if (msg.delay && UnoStates.Concur === true){\nif (msg.delay){\n// UnoStates.Concur = false;\n// UnoStates.Quiet = true;\n// flow.set(\"UnoStates\",UnoStates);\n// flow.set(\"UnoCounters\",UnoCounters);\n // msg.delay = null;\n//node.status({fill:\"blue\",shape:\"ring\",text:\"slider: \"+UnoStates.Slider});\n return msg;\n}else{\n return null;\n}\n","outputs":1,"noerr":0,"x":750,"y":210,"wires":[["935c4515.4e6478"]]},{"id":"935c4515.4e6478","type":"change","z":"31a2dd89.3ba412","name":"","rules":[{"t":"delete","p":"delay","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":290,"wires":[["f66a2cc8.84a3b"]]},{"id":"deb628f5.33b0e8","type":"ui_group","z":"","name":"Window#11","tab":"7e3910f.9132af","disp":true,"width":"7","collapse":false},{"id":"7e3910f.9132af","type":"ui_tab","z":"","name":"Shutter#1","icon":"dashboard"}]