[{"id":"84346781cb2816e5","type":"tab","label":"Relay_Controller userflow","disabled":false,"info":"","env":[]},{"id":"ae488ea62e553960","type":"group","z":"84346781cb2816e5","name":"Relay Section","style":{"fill":"#bfdbef","label":true},"nodes":["9f1f8d353153f780","9c0064f3806332f8","7447678a550b81c3","7a1f93e78de55ff1","e5af649dc2938b65","be9aba42e6efb69f","902e90a8299c2e8a","bbf21d6eaa852848","5a041b63b5c0d30f","df10fa9ecf3ec0aa","64eacbb456d2201e","84ce67fa630d200c","180a5ea76678872a","351adbc7c933216d","07ed93814a5c1c6a","79b668124b9ac6be","7cf8504911e95428","bd934fc9e8ea1445","dc23d85df5bc2768","1fcde6525d82df5b","45421a90327e87a6","88887269a5a942dd","8eefd1258fed92c8","a252c0d04b617f42","717ef195c6277465","facb0afb1d71e001","4fd9ba70c9db50de","f5ff25f151c1ab24","11e5924beae245a0","616aa6cc6e9c1f0e","0b54e0e7debefbc1","dbd32260d5fce0f3","6996d2702d39a3bf","9e1f74dd34730a09","7db2696c62f34870","2313dfda60e4d450","a128a8abd8957660","b362089f3ddfa488","ec32f0771fefda20","4e7640c4c7770284","a240a79ab4048edb","5652d120c406faa8","f77d9f130185af8e","2d7f561f7326325f","f2ce6ba53146b997","bfac849dc2bb675a","cce88ae9a15b8ee6","675408b7064ace53","3037eb8a98b1ee0e","3ecf96f8b556f552","83483da95e1edfd6","cd6952fbf1d61f35","51c6837990b03ae8","4585f4d28152f8ba","920a943cf307bfd2","08eca385885d8e68","dc36a1b4cfe92543","0c8c73251fd4cb38","4fe072f853a9cae3","c3e2bcee633bfd4e","45c038e4b5eedcb4","b69ffe2ca14477df","bfeb7edb4cb355ff","dc67b7efb7a72c45","6f1d48c13165671a","91e1536009119dfe","1f9a617964a60a34","2a53cec5aeeaf03b","fc754911c028c4eb","35026af72c6a11fb","80ed4ca14e3a718b","6d3a3d9f5cc832c2","eac4821008d241d3","3a6b0f0a21e13d1f","964663388db38965","677635a4a6bfe491","d6e88da822840e93","badef3b31fd6af1d","73c123315b8dcc7b","b4f3a7323186b131","2f5e285a6741025f","986a30df68f999f3","602266351705a94c","d9f676499da4943e","c0a8748de36818f3","e99787c3a1b197d5","a815306605109b07","2710765190f41b5d","5151dde1cee78829","2c8a2c5a6afbcb58","f0dd0ab99f66dddc","219eee06bbbd5ab3","b0070f0863a4fb56","c203cab9a39912fc","11e47e84f371d891","a29799d87f05aef3","fbc55b59fa40d07c","9939dc223a07f057","16e40e82e2b8b5f6","72cebabff4afbf0f","1bbe06d96710442a","bb57615cf44961a2","cb7a6e7501779882","452554162c654244","4d23c28aa5d14f17","0b83a036f0de925c","a154127ef785eb7d","12ae04822026b296","fed585228281f87d","f2cf33c3826085ca","c63df942d646a806"],"x":14,"y":19,"w":2638,"h":762},{"id":"f2cf33c3826085ca","type":"group","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"blue Relayboard","style":{"fill":"#ffbfbf","fill-opacity":"0.43","label":true},"nodes":["c4b9be45e50f9aa7","714f6848b6f088c4","671d35999467026a","45dddca328d95b36","8cac4d9ad95550cc","3784970c90e1d2f6","29f9c67084d20bc1","7b73b53ef0935c0b","2730fc727c2f7d9c"],"x":2294,"y":179,"w":332,"h":522},{"id":"ca5d47c769691720","type":"group","z":"84346781cb2816e5","name":"Digital Inputs","style":{"fill":"#bfdbef","label":true},"nodes":["c517c2888afa2829","f7dd407a509e511e","f4762f980e1237f9","50ad422e961a13d2","725dd2108d540951","2f9099878fa9e84d","801eaeed136fbdcc","858788a354aacc0b","a94f475b3583b0ab","9bd27cb6873f3606","2c632d533e896270","bf686d9046b0b925","78c32ee3a96d0106","b5b4e4373c642c5a","826288e4849163b2","ee29488d22ca91b8","92530df3ad730f7f","a2af4dfb96fa9301","53335f49f37860d0","c29919c4c78b6a23","aa9eb15bc97c8124","dddd64a368ee8e21","1d3bcbf75cf1992b","5beb02bc6a5ebcdc","ad7822879dd844b3","8dce7af9708983b3","b18f1edd25133455","4efb14cdb13cffe9","d04e83b9748a38b8","05537519800aba2b","44e9a2b4b4f3b48d","6fcbb3694aae57d6","be4a34d586d5577f","98f0159157ec7287","49d01c2725449987","c9e78973de3e87f5","4012e75a38c30505","ab80dc27dad13db2","85c915420d06edc9","777b3d91d52ef8d7","1d9d22af32be3691","e519d500400c71dd","0e976f82d4741d35","01a047ae9189bf98","fa8a1cca7e9008c8","ec0e7b5c0c6b4fac","220bdf4b37e3be5b","c543a42cb47c4651","8f9601069e71540a","cf03ba0129534817","6037d3a877684b80","8908f40dfa5f3b71","d11a1108f7d8939f","b11127492273781c","686ca021072be8b4","5e3d676a08b47ff1","15b8cd776864ac26","2c4a9b10a4546586","40f8eb90aa2f105f","0f0c44a86aca31e8","87f2fe3e3bb7d291","b4b27cbb0d43c0d9","aca7f7342e540585","55c2b0760b6a01be","9e9a1bfef5f63dc2","af5c3ee0ce733774","f567567229e2a00f","6a7712d485c6daa2","ea2b119faf20137b","990b2b14768d2f11","8260fd8aaa0deeb7","7b3acf3acbc815a6","335cd5343fcb2602","c6c13f53cd45e8a3","d78cfd86e58c05e2","c3697a458ff00225","976c01eef91f611d","b4fe8ea99f7fc5c6","47d6745760d0d4bd","f2330d98d41fea5b","b5f89f81d362e13d","e94fd44272944f99","679838963842b85e","19a89a750269e1b2","ec4ad0ef5673c9dc","b762077d6b6ab30a","8e4f9e1e6c63c651","4c1885f550bee737","5b9604cdecc2bca1","41bd78e3eb272b76","a2bb3a121073adef","095ac4e46abd9997","b531e249105f27ad","b08ae036f7235c2c","6bba2afbe52c8eef","03520f7d85bc6f26","55c3471cedb97714","a577f1ad13c5d2b8","a2b49dac08b474f9","644246daf9e07ec9","2333fb908d888aeb","ade482047954b9e9","0f61c908f4bbe19d","abc33c231ac76001","f734bee7748a4ec0","77900564e22f6234","43a7115fc1dc3dba","66033249890c4fbf","5fd737b1c7953ac2","aeb0a247fd8e8e86","9ad5f03cd170cc43","59270446b9f06abc","ec897936deebd3bb","6828f3617636a4f9","27365ee1346bfefd","52de7b2f5881d3f8","3de7cf1988d5c188","58d0234d1785ac0e","ad269d5338fe9647","b291eaea9fa69efd","4b71420c4b4aeed0","f57ed4ff7b6c9c51","97930382c043cef3","ddd91e5b1ce149d2","096c660b76493c23","07c9827012a4e329","4a517f892462acb3","022ff08f7dd42734","30312d6f7df0d37e","8df47864d21604b4","80f7e5e0bf1c65e0","e656ddf9db5adfa2","99d3e4b895339afe","2415e6ea336762e4","c4ea110c864d2c11","596af3500b823e2f","bb65cc713310411d","9732efaf1724e8ed","3bb8a4225088deaf","d893f72a2d942554","634f3ef702570545","842d47c5dda6a3d0","8037b147377497c2","2499185fbe83fe7b","04b414ede568fbb0","8ff15fdad20b5b0a","e90cf9973420e78a","40b2a51c98aa24c6","348b543bdc72ac09","e9643e96bc48fd0d","40c17f257f2456f5","4dcfa9607483d7ed","017de9f60b436dd0","bf3fd494d079e573","ec8ab9d3804ae276","18adb0370ce119a1","7f1694279e764c3c","d8fe0e7ded779db5","d02432a4354d9c29","9ae524a2e9953696","f28fb89465ba2be6","cb0d4e98aa0da8c7","d5773e90ec619c03","94e610ae35b59216","9fa84fa17f63e6a4","708003efb47af8e5","7ed7c68c5706793b","e4918dfd2381b1b4","33d867420d499f30","bff2cfcd9716bd3a","79117a323996a03c","e33afe929afcadd5","1063b0a44dc75564","0119f5b51a60c32f","a555ea8e98383642","c5a1f37642773c1d","aecd2c098d4f5116","2a1058fce144e846","a523760172dfa169","e1c51c94b2da8e6c","0baaf254c4d51210","c20ecb912fc78867","02315abc9aa7b19a"],"x":-12,"y":1699,"w":3016,"h":2722},{"id":"47d6745760d0d4bd","type":"group","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"In-Out-X","style":{"label":true},"nodes":["067fcc36a3f7c53e","67bd05973906225b","13639892e920483a","b9c7f6f7209f7298","1f3bbb50a4fd72c9","41e148dedaaeec0a","1fb9e594f55fa341","fdc2d544e29f7e8b","9ffe9a29aa7737dc","f3eb02a9cc0c30e7","e7ec84457b710405","2656f9833dc80bb5","0a53020ca73fa97a","c8168de67ce0357c","a68945439e9fccb6","bf2dd021ea135856"],"x":14,"y":3899,"w":1132,"h":362},{"id":"4c1885f550bee737","type":"group","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmy Pro","style":{"label":true},"nodes":["810cd46156b60646","5794b54fe9a8353c","022661147c157704","0b037fd7da7f4632","37bb8f157e3eb332","4c09f46a383125d3","e990eaa14f966a98","973074e9c20b34b1","cb2b8b5378ca7cc7","f340e68aa0926a8f","0a2f403d0fa6cda2","23500b4b501f5291","1e522cfcce5f17f9","ebf781a811c206dd","12a6085e3923c20a","e7db811f92408077","524b1373cc6fec14","4b7b5087ecece785","cec0fa777ac7184d","a679a031ba727f47","80542c0719acd88a","b910aec4acf64aca","9d96b3ea7fc14c3e","d4232f93c6503278","b9f172caf0185e91","128f4fba212721b6","6fe6b0f4ae57d184","5e7ae380b7149028","927c9316d77c504a","7c01016e9776f8b9","83aee79950157301","599611c0a12474f7","ca7179846f52c3bd","22c12a2b9c014420","32f3e10378016aca","884ba6e62940d3b8","2f6fb8269bd199d1","44de4d62e256bbd0","cbf10ebb85f14f8b","be0fedefaddec707","c64420fc3fc73c4b","4c845ea25804c7ce","6821a82d8aedbd58","8c262757bed47416","4db3360605356a9b","6bc58db95c0d3690","53c2e217c3bf45a7","edbdcec9160022d1","3542fd55564dec52","06d24517a9ebf167","8e7c74809730435b","49c5f20cb1414dc9","dfb6f566fe1e67f0","b3ac4d3ff8ab2bd3","7c33264a85b8655c","cd8a31d9162386b5"],"x":1915,"y":2821,"w":1063,"h":678},{"id":"586dd069119ca734","type":"group","z":"84346781cb2816e5","name":"Relay Section In-Out-X","style":{"fill":"#bfdbef","label":true},"nodes":["1c6a1764970b8f2a","8134caa6faef2354","9d5212f74626d4ce","95638b368db1ebce","0380244897e0b0d5","5ba6dd5d7938a39f","42e9eff9969bf76e","0ce55a8753ebff2c","37c290e92f575def","314b1f2b85150bed","35b30f7ffe7f290b","07bf03d5b56346c1","c35306a5a083fb89","e25b5f417350eaa5","f2b83f3e1ad9e8e0","83787709b73a0888","42eed0c8369331c5","ec3f7ac641192e75","319f25b487ca5de2","e08bda4a4a3bb274","49ae539fe1f42dcd","09cdeb411ffd093e","3747078794f4446b","3dc264c4c99f3cb5","43aa681ac8ec96ab","d63a0e90955d0104","c6dd5077256960b3","13494441dbb96974","78c4614a72600c92","0ff9d86b7dbfc739","6bfdadcb7794e99b","4c229350274c73f6","bdc2913dd55449a6","8331a34b55ee19d2","ccaac7314bfdbe67","2d9d047447e5f3d5","1360528b7efc916f","69542bc29ab546ce","630dc342f5969a73","9971ebbce3c30be3","5dc6543ecf2af052","5191452f1877f234","716caf38aadb454d","4f1ddde57124abde","70eaebf7748976ce","dc3f64e3709a98ef","f01699fcbfd532c0","18014668dd66aa3d","c9db75a15baa7e9f","f03f6af08a07bb28","0c2b5667ae7a1d62","80dd3dfd18c32e4f","e14dff2d0c396791","30ba851059a04c2b","eb13980db2ba8889","3839d7afeff78f14","af6162b45ebbd995","6e77fdd3fbb6e16f","1c06b266dfc86ac0","b81a602635024d2e","2c5078773b3d1bf1","7f62a873571c5c7f","83ef71057e360893","dcb389f0dc225260","a920137042f7c937","2c389910440e48d5","918014e7bfe8c32d","dbdabad00f6f8e8a","b1fefafd079f249e","4891bee85b2398a7","1b9f71086dca60a2","169c2ba66b6b2ab5","6909873bb7ec310f","034286da67d0d067","992b732eb1b95985","2e2bdfbe224620e9","27e641c09457b704","a1a19864fb41ab2f","b5dbe2dadfecb8a0","c170bcc8f98a0cfc","73d04f063f0ac277","63d716b649946401","b0bb3475a8a57739","9267cbced2c5eeed","b9201d489545e15e","014af2b452edcf4f","e2502cf704cd6f5e","3ec93790d8eb79fa","7d1545f2e1593034","dd38949006e2602c","4d52349d05730ba0","1ba99cde3a8f083c","d76432a53b52c0e6","bf1bde0ef596e4ac","70efa7ba45f8eeb4","f459dcb22b3b6491","b57f215b70958027","45941e83ed05523f","c652e5765f8f5431","9023f2447ce36355","bed9a70551917d33","f4a80613f490dddd","c823209bf9561262","b256ab2c4043eb51","380384990d277aaa","c8bffc9761012aec","a9ccba6b44c415b3","01a437065c680b65"],"x":14,"y":799,"w":2272,"h":762},{"id":"3e9393511262cdb1","type":"group","z":"84346781cb2816e5","name":"Testbereich nach dem Spielen Löschen wirkt nur auf eingang 1 oder Doppelklick Eingang 2","style":{"label":true,"fill":"#dbcbe7","color":"#000000"},"nodes":["33c436c9f138d1e3","1756bcf5b61e0c7d","5744b0333cbe3963","0b2fe537cddb626d","75e0e808bf65fad9","e55a876857d545f7","10fbb4f63b685217","442b510741e5e1c7","52bbf25fce646f53","4e246ff95c2d1662","b52e7f7fb997ea86","c2279977038f983e","a15cbe3c82277c41"],"x":14,"y":1539,"w":632,"h":362},{"id":"9f1f8d353153f780","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":140,"wires":[["2f5e285a6741025f"]]},{"id":"9c0064f3806332f8","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":220,"wires":[["986a30df68f999f3"]]},{"id":"7447678a550b81c3","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":3,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":300,"wires":[["602266351705a94c"]]},{"id":"7a1f93e78de55ff1","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":380,"wires":[["d9f676499da4943e"]]},{"id":"e5af649dc2938b65","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":1230,"y":460,"wires":[["c0a8748de36818f3"]]},{"id":"be9aba42e6efb69f","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":7,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":1230,"y":540,"wires":[["e99787c3a1b197d5"]]},{"id":"902e90a8299c2e8a","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":8,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":1230,"y":620,"wires":[["a815306605109b07"]]},{"id":"bbf21d6eaa852848","type":"ui_switch","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","label":"{{relayname}}","tooltip":"","group":"d9229161.b8548","order":9,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":700,"wires":[["2710765190f41b5d"]]},{"id":"5a041b63b5c0d30f","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set one","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_1\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay1\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"one\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"one\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":140,"wires":[["7cf8504911e95428"],["c63df942d646a806"]]},{"id":"df10fa9ecf3ec0aa","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set two","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_2\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay2\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"two\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"two\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":220,"wires":[["11e5924beae245a0"],["c63df942d646a806"]]},{"id":"64eacbb456d2201e","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set three","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_3\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay3\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"three\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"three\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":300,"wires":[["0b54e0e7debefbc1"],["c63df942d646a806"]]},{"id":"84ce67fa630d200c","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set four","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_4\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay4\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"four\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"four\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":380,"wires":[["dc23d85df5bc2768"],["c63df942d646a806"]]},{"id":"180a5ea76678872a","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set five","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_5\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay5\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"five\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"five\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":460,"wires":[["45421a90327e87a6"],["c63df942d646a806"]]},{"id":"351adbc7c933216d","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set six","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_6\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay6\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"six\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"six\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":540,"wires":[["8eefd1258fed92c8"],["c63df942d646a806"]]},{"id":"07ed93814a5c1c6a","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set seven","func":"var check2 = flow.get(\"Rupdate\");\nif (check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_7\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay7\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) {\n        global.set(\"seven\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"seven\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":620,"wires":[["717ef195c6277465"],["c63df942d646a806"]]},{"id":"79b668124b9ac6be","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"globalVariable set eight","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\n\nlet softwareRelay = !!global.get(\"softwareRelay_8\") ? true : false\n\nif (softwareRelay) {\n    msg.topic = \"pkw/tele/soft/relay8\"\n    return [null, msg];\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"eight\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"eight\", true);\n    }\n    return [msg, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":700,"wires":[["4fd9ba70c9db50de"],["c63df942d646a806"]]},{"id":"7cf8504911e95428","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 1","mode":"link","links":["5f7ef225e802d331","9348abf8c276270a","80ed4ca14e3a718b"],"x":1815,"y":120,"wires":[]},{"id":"bd934fc9e8ea1445","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 1","links":["1a76dcedc9d4fa5b","f4762f980e1237f9","3fe38c2d6edc0c84","72a1d2dced5a7e61","2c8a2c5a6afbcb58","a04b3614573af150","c2735bd1ac5c4ea6","f1b2da140f70c6ec","690a84e0284a21fb"],"x":1055,"y":140,"wires":[["9f1f8d353153f780"]]},{"id":"dc23d85df5bc2768","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 4","mode":"link","links":["5053b040708d4007","b597242323e2a770","3a6b0f0a21e13d1f"],"x":1815,"y":360,"wires":[]},{"id":"1fcde6525d82df5b","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 4","links":["3fe38c2d6edc0c84","5ae71968fc50af7f","2f9099878fa9e84d","9e725df77107f87e","bee832ef9e0bbec5","ca13b9d3773c45d8","b0070f0863a4fb56","cfc4634bb3ce625f","e6231ac91462cc3e"],"x":1055,"y":380,"wires":[["7a1f93e78de55ff1"]]},{"id":"45421a90327e87a6","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 5","mode":"link","links":["73311fc8d6eb600e","8151aed611eaa8e7","964663388db38965"],"x":1815,"y":440,"wires":[]},{"id":"88887269a5a942dd","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 5","links":["030e0d53716d95a4","12a3e2a3c679d38b","1443705e5ac99da3","801eaeed136fbdcc","27e4acfea3f8598a","3fe38c2d6edc0c84","6aab650ddc6b11ea","c203cab9a39912fc","27d4c9148b70a2c6"],"x":1055,"y":460,"wires":[["e5af649dc2938b65"]]},{"id":"8eefd1258fed92c8","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 6","mode":"link","links":["47027916b2d62ebe","52e43a6771948438","677635a4a6bfe491"],"x":1815,"y":520,"wires":[]},{"id":"a252c0d04b617f42","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 6","links":["1c6a8198ae953dda","2cf77f5b731d0a42","3fe38c2d6edc0c84","11e47e84f371d891","858788a354aacc0b","c2dd512ba1fb2a38","c81ea70522140670","e0771acc5d3182c3","c1f3d6d8c0fd07c6"],"x":1055,"y":540,"wires":[["be9aba42e6efb69f"]]},{"id":"717ef195c6277465","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 7","mode":"link","links":["d6e88da822840e93","7aa42e41ebc575e6","d680dc96a13fab05"],"x":1815,"y":600,"wires":[]},{"id":"facb0afb1d71e001","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 7","links":["111743f4760bc3f1","a29799d87f05aef3","299ab89584395772","3fe38c2d6edc0c84","5011de5da2fad287","a94f475b3583b0ab","cf7080d88a760efb","e15a48fdb55669fa","9b727bc3bd698ac1"],"x":1055,"y":620,"wires":[["902e90a8299c2e8a"]]},{"id":"4fd9ba70c9db50de","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 8","mode":"link","links":["55747310bf7b4629","98f97f53934b5d8c","badef3b31fd6af1d"],"x":1815,"y":660,"wires":[]},{"id":"f5ff25f151c1ab24","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 8","links":["3eae3506ca194e43","3fe38c2d6edc0c84","fbc55b59fa40d07c","5bd75b59cbebea5d","72352dc2eb449f47","b088e028c4eaf576","c51c399bbe263fb6","9bd27cb6873f3606"],"x":1055,"y":700,"wires":[["bbf21d6eaa852848"]]},{"id":"11e5924beae245a0","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 2","mode":"link","links":["2b6c67a08a38b33c","6d3a3d9f5cc832c2","ca12122251924b01"],"x":1815,"y":200,"wires":[]},{"id":"616aa6cc6e9c1f0e","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 2","links":["11075381c9dd3e27","3fe38c2d6edc0c84","44f1ac73f6b1508c","50ad422e961a13d2","c084f41458d81a9b","cf4bdfa50135098b","f0dd0ab99f66dddc","fca214dfed07cf6a","7e9154bc66c7acf6"],"x":1055,"y":220,"wires":[["9c0064f3806332f8"]]},{"id":"0b54e0e7debefbc1","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 3","mode":"link","links":["eac4821008d241d3","79abbf32fb06c334","ec54228c4db0212d"],"x":1815,"y":300,"wires":[]},{"id":"dbd32260d5fce0f3","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch connect 3","links":["0612feecdf6b9fca","725dd2108d540951","219eee06bbbd5ab3","3fe38c2d6edc0c84","4e22062602e704a0","9a2c296bd2939689","d1c38a7c4b408418","fecf8235a3bc93f8","6641d25f98df3fe3"],"x":1055,"y":300,"wires":[["7447678a550b81c3"]]},{"id":"6996d2702d39a3bf","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"save relay status","func":"var check2 = flow.get(\"Rupdate\");\n\nif (check2 != true) {\n    msg.payload = {\n        \"one\":global.get(\"one\"),\n        \"two\":global.get(\"two\"),\n        \"three\":global.get(\"three\"),\n        \"four\":global.get(\"four\"),\n        \"five\":global.get(\"five\"),\n        \"six\":global.get(\"six\"),\n        \"seven\":global.get(\"seven\"),\n        \"eight\":global.get(\"eight\"),\n    }\n\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1590,"y":740,"wires":[["9e1f74dd34730a09"]]},{"id":"9e1f74dd34730a09","type":"file","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","filename":"pekaway/relaystatusload","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1830,"y":740,"wires":[[]]},{"id":"7db2696c62f34870","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"8","invert":true,"x":2170,"y":180,"wires":[[]]},{"id":"2313dfda60e4d450","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"9","invert":true,"x":2170,"y":240,"wires":[[]]},{"id":"a128a8abd8957660","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"10","invert":true,"x":2170,"y":300,"wires":[[]]},{"id":"b362089f3ddfa488","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"11","invert":true,"x":2170,"y":360,"wires":[[]]},{"id":"ec32f0771fefda20","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"13","invert":true,"x":2170,"y":480,"wires":[[]]},{"id":"4e7640c4c7770284","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"14","invert":true,"x":2170,"y":540,"wires":[[]]},{"id":"a240a79ab4048edb","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"15","invert":true,"x":2170,"y":620,"wires":[[]]},{"id":"5652d120c406faa8","type":"ui_ui_control","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","events":"change","x":100,"y":460,"wires":[["0b83a036f0de925c"]]},{"id":"f77d9f130185af8e","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"change to relay tab","mode":"link","links":["7e47707c.5fe7b"],"x":535,"y":540,"wires":[]},{"id":"2d7f561f7326325f","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","pauseType":"delayv","timeout":"200","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":380,"y":460,"wires":[["f77d9f130185af8e","5151dde1cee78829"]]},{"id":"f2ce6ba53146b997","type":"comment","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"update relay & wifirelay labels when changing to switches tab","info":"","x":260,"y":420,"wires":[]},{"id":"bfac849dc2bb675a","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"oneoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime1\", null)\n    global.set(\"offtime1\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"None\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime1\", offTimeString);\n        global.set(\"offtime1\", offTimeString)\n        return [msg, msg]\n    }\n}\n\n/*\nlet offauto = 600;  // Integer representing minutes\nlet d = new Date();  // Current date and time\nlet newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\nlet newDate = new Date(newTime);  // Create a new Date object with the new time\n\nmsg.payload = newDate.getTime;  // Set the new date as the payload\nreturn msg;\n*/","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":100,"wires":[["35026af72c6a11fb"],["cce88ae9a15b8ee6"]]},{"id":"cce88ae9a15b8ee6","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay1","pauseType":"delayv","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":100,"wires":[["675408b7064ace53"]]},{"id":"675408b7064ace53","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"oneoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":100,"wires":[["9f1f8d353153f780"]]},{"id":"3037eb8a98b1ee0e","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"twooffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime2\", null)\n    global.set(\"offtime2\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Ntwo\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime2\", offTimeString);\n        global.set(\"offtime2\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":180,"wires":[["35026af72c6a11fb"],["3ecf96f8b556f552"]]},{"id":"3ecf96f8b556f552","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay2","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":180,"wires":[["83483da95e1edfd6"]]},{"id":"83483da95e1edfd6","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"twooffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":180,"wires":[["9c0064f3806332f8"]]},{"id":"cd6952fbf1d61f35","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"threeoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime3\", null)\n    global.set(\"offtime3\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nthree\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime3\", offTimeString);\n        global.set(\"offtime3\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":260,"wires":[["35026af72c6a11fb"],["51c6837990b03ae8"]]},{"id":"51c6837990b03ae8","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay3","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":260,"wires":[["4585f4d28152f8ba"]]},{"id":"4585f4d28152f8ba","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"threeoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":260,"wires":[["7447678a550b81c3"]]},{"id":"920a943cf307bfd2","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"fouroffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime4\", null)\n    global.set(\"offtime4\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nfour\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime4\", offTimeString);\n        global.set(\"offtime4\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":340,"wires":[["35026af72c6a11fb"],["08eca385885d8e68"]]},{"id":"08eca385885d8e68","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay4","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":340,"wires":[["dc36a1b4cfe92543"]]},{"id":"dc36a1b4cfe92543","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"fouroffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":340,"wires":[["7a1f93e78de55ff1"]]},{"id":"0c8c73251fd4cb38","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"fiveoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime5\", null)\n    global.set(\"offtime5\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nfive\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime5\", offTimeString);\n        global.set(\"offtime5\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":420,"wires":[["35026af72c6a11fb"],["4fe072f853a9cae3"]]},{"id":"4fe072f853a9cae3","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay5","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":420,"wires":[["c3e2bcee633bfd4e"]]},{"id":"c3e2bcee633bfd4e","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"fiveoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":420,"wires":[["e5af649dc2938b65"]]},{"id":"45c038e4b5eedcb4","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"sixoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime6\", null)\n    global.set(\"offtime6\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nsix\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime6\", offTimeString);\n        global.set(\"offtime6\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":500,"wires":[["35026af72c6a11fb"],["b69ffe2ca14477df"]]},{"id":"b69ffe2ca14477df","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay6","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":500,"wires":[["bfeb7edb4cb355ff"]]},{"id":"bfeb7edb4cb355ff","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"sixoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":500,"wires":[["be9aba42e6efb69f"]]},{"id":"dc67b7efb7a72c45","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"sevenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime7\", null)\n    global.set(\"offtime7\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nseven\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime7\", offTimeString);\n        global.set(\"offtime7\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":580,"wires":[["35026af72c6a11fb"],["6f1d48c13165671a"]]},{"id":"6f1d48c13165671a","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay7","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":580,"wires":[["91e1536009119dfe"]]},{"id":"91e1536009119dfe","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"sevenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":580,"wires":[["902e90a8299c2e8a"]]},{"id":"1f9a617964a60a34","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"auto off","func":"var offauto = global.get(\"eightoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime8\", null)\n    global.set(\"offtime8\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Neight\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime8\", offTimeString);\n        global.set(\"offtime8\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":660,"wires":[["35026af72c6a11fb"],["2a53cec5aeeaf03b"]]},{"id":"2a53cec5aeeaf03b","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"delay8","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":660,"wires":[["fc754911c028c4eb"]]},{"id":"fc754911c028c4eb","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"turn off","func":"if (global.get(\"eightoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":660,"wires":[["bbf21d6eaa852848"]]},{"id":"35026af72c6a11fb","type":"ui_toast","z":"84346781cb2816e5","g":"ae488ea62e553960","position":"top right","displayTime":"3","highlight":"","sendall":false,"outputs":0,"ok":"OK","cancel":"","raw":false,"className":"","topic":"","name":"","x":1590,"y":60,"wires":[]},{"id":"80ed4ca14e3a718b","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 1","links":["7cf8504911e95428"],"x":2015,"y":180,"wires":[["c4b9be45e50f9aa7","7db2696c62f34870"]]},{"id":"6d3a3d9f5cc832c2","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 2","links":["11e5924beae245a0"],"x":2015,"y":240,"wires":[["2313dfda60e4d450","714f6848b6f088c4"]]},{"id":"eac4821008d241d3","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 3","links":["0b54e0e7debefbc1"],"x":2015,"y":300,"wires":[["671d35999467026a","a128a8abd8957660"]]},{"id":"3a6b0f0a21e13d1f","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 4","links":["dc23d85df5bc2768"],"x":2015,"y":360,"wires":[["b362089f3ddfa488","45dddca328d95b36"]]},{"id":"964663388db38965","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 5","links":["45421a90327e87a6"],"x":2015,"y":420,"wires":[["8cac4d9ad95550cc","fed585228281f87d"]]},{"id":"677635a4a6bfe491","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 6","links":["8eefd1258fed92c8"],"x":2015,"y":480,"wires":[["ec32f0771fefda20","3784970c90e1d2f6"]]},{"id":"d6e88da822840e93","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 7","links":["717ef195c6277465"],"x":2015,"y":540,"wires":[["4e7640c4c7770284","7b73b53ef0935c0b"]]},{"id":"badef3b31fd6af1d","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"switch relay 8","links":["4fd9ba70c9db50de"],"x":2015,"y":620,"wires":[["a240a79ab4048edb","29f9c67084d20bc1"]]},{"id":"73c123315b8dcc7b","type":"status","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","scope":["cce88ae9a15b8ee6","3ecf96f8b556f552","51c6837990b03ae8","08eca385885d8e68","4fe072f853a9cae3","b69ffe2ca14477df","6f1d48c13165671a","2a53cec5aeeaf03b"],"x":100,"y":340,"wires":[["b4f3a7323186b131"]]},{"id":"b4f3a7323186b131","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"match relays w/ labels","func":"function numberToWord(num) {\n    const words = [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\"];\n    return words[num];\n}\n\n// Check if this is a \"relay turned ON\" or \"relay turned OFF\" event\nif (msg.status.shape === \"dot\" && msg.status.fill === \"blue\" && (msg.status.text === \"1\" || msg.status.text === \"0\")) {\n    \n    let relayNumber = parseInt(msg.status.source.name.charAt(msg.status.source.name.length - 1)); // Ensure number type\n    let relayNumberWord = numberToWord(relayNumber);\n    let defaultName = global.get(\"N\" + relayNumberWord);\n    let offtime = flow.get(\"offtime\" + relayNumber);\n    \n    msg.relayNumber = relayNumber;\n    msg.offtime = offtime;\n\n    // Default label\n    let relayLabel = defaultName;\n\n    // Boiler override logic\n    let boilerRelay = flow.get(\"boilerRelay\");\n    let boilertemp_control = flow.get(\"boilertemp_control\");\n\n    if (boilertemp_control && boilerRelay == relayNumberWord  && global.get(\"boiler_visibility\")) {\n        let targetTemp = flow.get(\"boilerTargetTemp\");\n        let currentTemp = flow.get(\"boilerCurrentTemp\");\n\n        relayLabel = defaultName + `<br><font size='-1.2'> Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`;\n        global.set(relayNumberWord+\"offauto\", flow.get(\"boilerRuntime\")),\n        global.set(\"offtime\"+relayNumber, `Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`)\n        node.warn(`Relay ${relayNumber}: Label overridden due to active boiler control.`);\n    } else if (msg.status.text === \"1\" && offtime != null) {\n        relayLabel += `<br><font size='-1'>(turn off at: ${offtime})`;\n        //global.set(relayNumberWord+\"offauto\", 0),\n        //global.set(\"offtime\"+relayNumber, \"\")\n    }\n\n    msg.relayname = relayLabel;\n\n    // Initialize output array (8 relays, all null)\n    let outputs = Array(8).fill(null);\n\n    // Assign the msg to the corresponding relay output\n    outputs[relayNumber - 1] = msg;\n\n    return outputs;\n}\n","outputs":8,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":340,"wires":[["2c8a2c5a6afbcb58"],["f0dd0ab99f66dddc"],["219eee06bbbd5ab3"],["b0070f0863a4fb56"],["c203cab9a39912fc"],["11e47e84f371d891"],["a29799d87f05aef3"],["fbc55b59fa40d07c"]]},{"id":"2f5e285a6741025f","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":1370,"y":140,"wires":[["5a041b63b5c0d30f","6996d2702d39a3bf","bfac849dc2bb675a"]]},{"id":"986a30df68f999f3","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":220,"wires":[["df10fa9ecf3ec0aa","3037eb8a98b1ee0e","6996d2702d39a3bf"]]},{"id":"602266351705a94c","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":300,"wires":[["64eacbb456d2201e","6996d2702d39a3bf","cd6952fbf1d61f35"]]},{"id":"d9f676499da4943e","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":380,"wires":[["84ce67fa630d200c","6996d2702d39a3bf","920a943cf307bfd2"]]},{"id":"c0a8748de36818f3","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":460,"wires":[["180a5ea76678872a","6996d2702d39a3bf","0c8c73251fd4cb38"]]},{"id":"e99787c3a1b197d5","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":540,"wires":[["351adbc7c933216d","6996d2702d39a3bf","45c038e4b5eedcb4"]]},{"id":"a815306605109b07","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":620,"wires":[["07ed93814a5c1c6a","6996d2702d39a3bf","dc67b7efb7a72c45"]]},{"id":"2710765190f41b5d","type":"rbe","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":700,"wires":[["79b668124b9ac6be","6996d2702d39a3bf","1f9a617964a60a34"]]},{"id":"5151dde1cee78829","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"match relays w/ labels","func":"function numberToWord(num) {\n    const words = [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\"];\n    return words[num];\n}\n\n// Save context to local flow vars if present\nif (msg.hasOwnProperty(\"context\")) {\n    let context = msg.context;\n\n    flow.set(\"boilerRelay\", context.boilerRelay);\n    flow.set(\"boilertemp_control\", context.boilertemp_control);\n    flow.set(\"boilerRuntime\", context.boilerRuntime);\n    flow.set(\"boilerTargetTemp\", context.boilerTargetTemp);\n    flow.set(\"boilerCurrentTemp\", context.boilerCurrentTemp);\n\n    //node.warn(\"Boiler context received and saved to flow:\");\n    //node.warn(` - boilerRelay: ${context.boilerRelay}`);\n    //node.warn(` - boilertemp_control: ${context.boilertemp_control}`);\n    //node.warn(` - boilerTargetTemp: ${context.boilerTargetTemp}°C`);\n    //node.warn(` - boilerCurrentTemp: ${context.boilerCurrentTemp}°C`);\n\n    delete msg.fromTimer\n}\n\nlet outputs = [];\n\nfor (let i = 1; i < 9; i++) {\n    let relayNumberWord = numberToWord(i);\n    let defaultName = global.get(\"N\" + relayNumberWord);\n    let offtime = global.get(\"offtime\" + i);\n    let relayLabel = defaultName;\n    let useOfftimePrefix = !!(global.get(\"useOfftimePrefix_relay\" + i) ?? true);\n\n    // Try to apply boiler label if relay matches and boiler control is on\n    let boilerRelay = flow.get(\"boilerRelay\");\n    let boilertemp_control = flow.get(\"boilertemp_control\");\n\n    if (boilertemp_control && boilerRelay == relayNumberWord && global.get(\"boiler_visibility\")) {\n        let targetTemp = flow.get(\"boilerTargetTemp\");\n        let currentTemp = flow.get(\"boilerCurrentTemp\");\n\n        relayLabel = defaultName + `<br><font size='-1.2'> Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`;\n        //node.warn(`Relay ${i}: Replaced label with boiler control info.`);\n        global.set(relayNumberWord+\"offauto\", flow.get(\"boilerRuntime\")),\n        global.set(\"offtime\"+i, `Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`)\n    } else {\n        //global.set(relayNumberWord+\"offauto\", 0),\n        //global.set(\"offtime\"+i, \"\")\n        if (offtime != null && offtime != \"\") {\n            if (useOfftimePrefix) {\n                relayLabel += `<br><font size='-1'>(turn off at: ${offtime})`;\n            }\n            else {\n                relayLabel += `<br><font size='-1'>${offtime}`;\n            }\n        }\n    }\n\n    let msg = {\n        relayname: relayLabel,\n        payload: global.get(relayNumberWord),\n        word: relayNumberWord\n    };\n\n    outputs[i - 1] = msg;\n}\n\n//node.warn(\"All relay outputs prepared.\");\nnode.send(outputs);","outputs":8,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":460,"wires":[["2c8a2c5a6afbcb58"],["f0dd0ab99f66dddc"],["219eee06bbbd5ab3"],["b0070f0863a4fb56"],["c203cab9a39912fc"],["11e47e84f371d891"],["a29799d87f05aef3"],["fbc55b59fa40d07c"]]},{"id":"2c8a2c5a6afbcb58","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 1","mode":"link","links":["bd934fc9e8ea1445"],"x":835,"y":260,"wires":[]},{"id":"f0dd0ab99f66dddc","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 1","mode":"link","links":["616aa6cc6e9c1f0e"],"x":835,"y":300,"wires":[]},{"id":"219eee06bbbd5ab3","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 3","mode":"link","links":["dbd32260d5fce0f3"],"x":835,"y":340,"wires":[]},{"id":"b0070f0863a4fb56","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 4","mode":"link","links":["1fcde6525d82df5b"],"x":835,"y":380,"wires":[]},{"id":"c203cab9a39912fc","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 5","mode":"link","links":["88887269a5a942dd"],"x":835,"y":420,"wires":[]},{"id":"11e47e84f371d891","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 6","mode":"link","links":["a252c0d04b617f42"],"x":835,"y":460,"wires":[]},{"id":"a29799d87f05aef3","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 7","mode":"link","links":["facb0afb1d71e001"],"x":835,"y":500,"wires":[]},{"id":"fbc55b59fa40d07c","type":"link out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"PCB pins out 8","mode":"link","links":["f5ff25f151c1ab24"],"x":835,"y":540,"wires":[]},{"id":"9939dc223a07f057","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"relayname","links":["00679106493db8ac","961a8b6d41509271","d19d99a6e5a537b7","e13fe753f236267e","f3b81ce4.96da8"],"x":425,"y":380,"wires":[["5151dde1cee78829"]]},{"id":"16e40e82e2b8b5f6","type":"comment","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"update relay & wifirelay labels using switches (when on tab Switches)","info":"","x":280,"y":300,"wires":[]},{"id":"72cebabff4afbf0f","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"set update false","func":"\nflow.set(\"Rupdate\",false);","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":620,"wires":[[]]},{"id":"1bbe06d96710442a","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"600ms","pauseType":"delay","timeout":"600","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":350,"y":620,"wires":[["72cebabff4afbf0f"]]},{"id":"bb57615cf44961a2","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"set update true","func":"flow.set(\"Rupdate\",true);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":200,"y":620,"wires":[["1bbe06d96710442a"]]},{"id":"cb7a6e7501779882","type":"ui_button","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"","group":"d9229161.b8548","order":10,"width":0,"height":0,"passthru":false,"label":"sync","tooltip":"check status again and resync it. ","color":"","bgcolor":"","className":"","icon":"","payload":"Relay states synchronized","payloadType":"str","topic":"topic","topicType":"msg","x":390,"y":580,"wires":[["bb57615cf44961a2","5151dde1cee78829","f77d9f130185af8e","12ae04822026b296"]]},{"id":"452554162c654244","type":"link in","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"relay state init","links":["ea056e6598b5f8c6"],"x":285,"y":500,"wires":[["4d23c28aa5d14f17"]]},{"id":"4d23c28aa5d14f17","type":"delay","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"1.5s","pauseType":"delay","timeout":"1.5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":500,"wires":[["f77d9f130185af8e","5151dde1cee78829"]]},{"id":"0b83a036f0de925c","type":"function","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"check tab","func":"if (msg.payload == \"change\" && msg.name == \"Switches\") {\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":460,"wires":[["2d7f561f7326325f"]]},{"id":"a154127ef785eb7d","type":"comment","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"↑ link in on boot","info":"","x":360,"y":540,"wires":[]},{"id":"12ae04822026b296","type":"ui_toast","z":"84346781cb2816e5","g":"ae488ea62e553960","position":"top right","displayTime":"3","highlight":"","sendall":false,"outputs":0,"ok":"OK","cancel":"","raw":false,"className":"","topic":"","name":"","x":590,"y":580,"wires":[]},{"id":"fed585228281f87d","type":"mcp23017output","z":"84346781cb2816e5","d":true,"g":"ae488ea62e553960","name":"","chip":"4e9949f3b6e19991","bitNum":"12","invert":true,"x":2170,"y":420,"wires":[[]]},{"id":"c4b9be45e50f9aa7","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"17","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":220,"wires":[]},{"id":"714f6848b6f088c4","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"27","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":280,"wires":[]},{"id":"671d35999467026a","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"22","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":340,"wires":[]},{"id":"45dddca328d95b36","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"10","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":400,"wires":[]},{"id":"8cac4d9ad95550cc","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"9","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":460,"wires":[]},{"id":"3784970c90e1d2f6","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"11","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":520,"wires":[]},{"id":"29f9c67084d20bc1","type":"rpi-gpio out","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"","pin":"5","set":true,"level":"0","freq":"","out":"out","bcm":true,"x":2400,"y":660,"wires":[]},{"id":"7b73b53ef0935c0b","type":"function","z":"84346781cb2816e5","g":"f2cf33c3826085ca","name":"relay 7","func":"if (msg.payload == true) { msg.payload = \"sudo python3 pekaway/gpio/gpio27.py\"}\nelse if (msg.payload == false) { msg.payload = \"sudo python3 pekaway/gpio/gpio27off.py\" }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2370,"y":600,"wires":[["2730fc727c2f7d9c"]]},{"id":"2730fc727c2f7d9c","type":"exec","z":"84346781cb2816e5","g":"f2cf33c3826085ca","command":"","addpay":"payload","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"switch gpio27","x":2520,"y":600,"wires":[[],[],[]]},{"id":"c63df942d646a806","type":"mqtt out","z":"84346781cb2816e5","g":"ae488ea62e553960","name":"dynamic topic","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"0ddb07c65cbb68bc","x":1880,"y":700,"wires":[]},{"id":"c517c2888afa2829","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput1","chip":"4e9949f3b6e19991","bitNum":"0","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":1960,"wires":[["a2bb3a121073adef"]]},{"id":"f7dd407a509e511e","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput2","chip":"4e9949f3b6e19991","bitNum":"1","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":2380,"wires":[["6828f3617636a4f9"]]},{"id":"f4762f980e1237f9","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 1","mode":"link","links":["bd934fc9e8ea1445"],"x":1935,"y":1898,"wires":[]},{"id":"50ad422e961a13d2","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 2","mode":"link","links":["616aa6cc6e9c1f0e"],"x":1936,"y":1920,"wires":[]},{"id":"725dd2108d540951","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 3","mode":"link","links":["dbd32260d5fce0f3"],"x":1936,"y":1940,"wires":[]},{"id":"2f9099878fa9e84d","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 4","mode":"link","links":["1fcde6525d82df5b"],"x":1936,"y":1960,"wires":[]},{"id":"801eaeed136fbdcc","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 5","mode":"link","links":["88887269a5a942dd"],"x":1936,"y":1980,"wires":[]},{"id":"858788a354aacc0b","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 6","mode":"link","links":["a252c0d04b617f42"],"x":1936,"y":2000,"wires":[]},{"id":"a94f475b3583b0ab","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 7","mode":"link","links":["facb0afb1d71e001"],"x":1936,"y":2020,"wires":[]},{"id":"9bd27cb6873f3606","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 8","mode":"link","links":["f5ff25f151c1ab24"],"x":1936,"y":2040,"wires":[]},{"id":"2c632d533e896270","type":"file in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","filename":"filename","filenameType":"msg","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":1280,"y":2120,"wires":[["bf686d9046b0b925"]]},{"id":"bf686d9046b0b925","type":"json","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","property":"payload","action":"","pretty":false,"x":1281,"y":2160,"wires":[["7b3acf3acbc815a6"]]},{"id":"78c32ee3a96d0106","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"check relays to set","func":"// Relay key names\nconst relayKeys = [\n    \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\",\n    \"nine\", \"ten\", \"eleven\", \"twelve\", \"thirteen\", \"fourteen\", \"fifteen\", \"sixteen\"\n];\n\nconst type =\n    msg.inputType ??\n    msg.keypad?.mode ??\n    flow.get(\"mcpinput\" + msg.mcpinput + \"_type\") ??\n    \"switch\";\nconst outputCount = global.get(\"i2c_io-x\") === true ? 16 : 8;\nconst relays = msg.payload?.relays || {};\nconst relayStates = [];\n\n// Build output array: relay[i] = msg if true, else null\nfor (let i = 0; i < 16; i++) {\n    const key = relayKeys[i];\n    relayStates.push(relays?.[key] === true ? msg : null);\n}\n\n// Handle SWITCH mode\nif (type === \"switch\") {\n    msg.payload = msg.mcpinput_status;\n    return relayStates.slice(0, outputCount);  // Return only used outputs\n}\n\n// Handle BUTTON mode\nif (type === \"button\") {\n    if (msg.mcpinput_status === false) {\n        return null; // Do nothing on button release\n    }\n\n    for (let i = 0; i < outputCount; i++) {\n        if (relayStates[i]) {\n            const cloned = RED.util.cloneMessage(msg);\n            cloned.payload = !global.get(relayKeys[i]); // Toggle logic\n            const singleOutput = new Array(outputCount).fill(null);\n            singleOutput[i] = cloned;\n            node.send(singleOutput);\n        }\n    }\n    return null;\n}\n","outputs":16,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1701,"y":2060,"wires":[["f4762f980e1237f9","66033249890c4fbf"],["50ad422e961a13d2"],["725dd2108d540951"],["2f9099878fa9e84d"],["801eaeed136fbdcc"],["858788a354aacc0b"],["a94f475b3583b0ab"],["9bd27cb6873f3606"],["f2330d98d41fea5b"],["b5f89f81d362e13d"],["e94fd44272944f99"],["679838963842b85e"],["19a89a750269e1b2"],["ec4ad0ef5673c9dc"],["b762077d6b6ab30a"],["8e4f9e1e6c63c651"]]},{"id":"b5b4e4373c642c5a","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 1\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":2020,"wires":[["2c632d533e896270","b4fe8ea99f7fc5c6"]]},{"id":"826288e4849163b2","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 2\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":2400,"wires":[["2c632d533e896270","b4fe8ea99f7fc5c6"]]},{"id":"ee29488d22ca91b8","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"MCP inputs","info":"","x":1461,"y":2100,"wires":[]},{"id":"92530df3ad730f7f","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"check dimmers to set","func":"const outputs = [];\n\nfor (let i = 1; i <= 15; i++) {\n    const key = \"d\" + i;\n    const isOn = msg.payload?.dimmers?.[key] === true;\n    outputs.push(isOn ? msg : null);\n}\n\nconst type =\n    msg.inputType ??\n    msg.keypad?.mode ??\n    flow.get(\"mcpinput\" + msg.mcpinput + \"_type\") ??\n    \"switch\";\n\nif (type === \"switch\" || type === \"button\") {\n    msg.payload = msg.mcpinput_status;\n    msg.type = type;\n    return outputs;\n}\n","outputs":15,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1711,"y":2820,"wires":[["c29919c4c78b6a23"],["b18f1edd25133455"],["98f0159157ec7287"],["1d9d22af32be3691"],["c543a42cb47c4651"],["686ca021072be8b4"],["b4b27cbb0d43c0d9"],["022661147c157704"],["f340e68aa0926a8f"],["524b1373cc6fec14"],["d4232f93c6503278"],["83aee79950157301"],["44de4d62e256bbd0"],["4db3360605356a9b"],["49c5f20cb1414dc9"]]},{"id":"a2af4dfb96fa9301","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2318,"wires":[["53335f49f37860d0"]]},{"id":"53335f49f37860d0","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer0\")\nif (flow.get(\"timer0\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection0\") == \"down\" && flow.get(\"dimmer0_state\") > 5) {\n    global.set(\"dimmer0\", global.get(\"dimmer0\") -1 <= 5 ? 5 : global.get(\"dimmer0\") -1)\n    msg.payload = global.get(\"dimmer0\")\n    return msg\n}\n\nif (flow.get(\"dimDirection0\") == \"up\" && flow.get(\"dimmer0_state\") < 100) {\n    global.set(\"dimmer0\", global.get(\"dimmer0\") +1 >= 100 ? 100 : global.get(\"dimmer0\") +1)\n    msg.payload = global.get(\"dimmer0\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer0_state\") >= 100) {\n    if (global.get(\"dimmer0\") <= 0) {\n        //global.set(\"dimmer0\", 0)\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else { \n        //global.set(\"dimmer0\", global.get(\"dimmer0\") -1) \n        msg.payload = global.get(\"dimmer0\") -1\n    }\n    flow.set(\"dimDirection0\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer0_state\") <= 5 || flow.get(\"dimDirection0\" == undefined)) {\n    if (global.get(\"dimmer0\") >= 100) {\n        //global.set(\"dimmer0\", 100)\n        msg.payload = 100\n    }\n    else {\n        //global.set(\"dimmer0\", global.get(\"dimmer0\") +1) \n        msg.payload = global.get(\"dimmer0\") +1\n    }\n    flow.set(\"dimDirection0\", \"up\")\n}\nmsg.payload = global.get(\"dimmer0\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2318,"wires":[["5beb02bc6a5ebcdc"]]},{"id":"c29919c4c78b6a23","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer0_state\", Number(global.get(\"dimmer0\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer0_state\", Number(global.get(\"dimmer0\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer0\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer0\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2300,"wires":[["1d3bcbf75cf1992b"],["aa9eb15bc97c8124"]]},{"id":"aa9eb15bc97c8124","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","useparts":true,"accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2318,"wires":[["dddd64a368ee8e21"]]},{"id":"dddd64a368ee8e21","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2318,"wires":[["1d3bcbf75cf1992b"],["a2af4dfb96fa9301"]]},{"id":"1d3bcbf75cf1992b","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer0\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer0before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer0before\", Number(flow.get(\"dimmer0_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer0_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer0_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection0\", \"down\")\n    flow.set(\"dimmer0before\", Number(flow.get(\"dimmer0_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection0\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2581,"y":2280,"wires":[["5beb02bc6a5ebcdc"]]},{"id":"5beb02bc6a5ebcdc","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp0","mode":"link","links":["a4c0fd66546e7864"],"x":2936,"y":2280,"wires":[]},{"id":"ad7822879dd844b3","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2398,"wires":[["8dce7af9708983b3"]]},{"id":"8dce7af9708983b3","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer1\")\nif (flow.get(\"timer1\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection1\") == \"down\" && flow.get(\"dimmer1_state\") > 5) {\n    global.set(\"dimmer1\", global.get(\"dimmer1\") - 1 <= 5 ? 5 : global.get(\"dimmer1\") - 1)\n    msg.payload = global.get(\"dimmer1\")\n    return msg\n}\n\nif (flow.get(\"dimDirection1\") == \"up\" && flow.get(\"dimmer1_state\") < 100) {\n    global.set(\"dimmer1\", global.get(\"dimmer1\") + 1 >= 100 ? 100 : global.get(\"dimmer1\") + 1)\n    msg.payload = global.get(\"dimmer1\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer1_state\") >= 100) {\n    if (global.get(\"dimmer1\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer1\") - 1\n    }\n    flow.set(\"dimDirection1\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer1_state\") <= 5 || flow.get(\"dimDirection1\" == undefined)) {\n    if (global.get(\"dimmer1\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer1\") + 1\n    }\n    flow.set(\"dimDirection1\", \"up\")\n}\nmsg.payload = global.get(\"dimmer1\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2398,"wires":[["44e9a2b4b4f3b48d"]]},{"id":"b18f1edd25133455","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer1_state\", Number(global.get(\"dimmer1\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer1_state\", Number(global.get(\"dimmer1\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer1\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer1\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2380,"wires":[["05537519800aba2b"],["4efb14cdb13cffe9"]]},{"id":"4efb14cdb13cffe9","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2398,"wires":[["d04e83b9748a38b8"]]},{"id":"d04e83b9748a38b8","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2398,"wires":[["05537519800aba2b"],["ad7822879dd844b3"]]},{"id":"05537519800aba2b","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer1\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer1before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer1before\", Number(flow.get(\"dimmer1_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer1_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer1_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection1\", \"down\")\n    flow.set(\"dimmer1before\", Number(flow.get(\"dimmer1_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection1\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":2358,"wires":[["44e9a2b4b4f3b48d"]]},{"id":"44e9a2b4b4f3b48d","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp1","mode":"link","links":["1db51e9f7fe5ebea"],"x":2936,"y":2360,"wires":[]},{"id":"6fcbb3694aae57d6","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2478,"wires":[["be4a34d586d5577f"]]},{"id":"be4a34d586d5577f","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer2\")\nif (flow.get(\"timer2\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection2\") == \"down\" && flow.get(\"dimmer2_state\") > 5) {\n    global.set(\"dimmer2\", global.get(\"dimmer2\") - 1 <= 5 ? 5 : global.get(\"dimmer2\") - 1)\n    msg.payload = global.get(\"dimmer2\")\n    return msg\n}\n\nif (flow.get(\"dimDirection2\") == \"up\" && flow.get(\"dimmer2_state\") < 100) {\n    global.set(\"dimmer2\", global.get(\"dimmer2\") + 1 >= 100 ? 100 : global.get(\"dimmer2\") + 1)\n    msg.payload = global.get(\"dimmer2\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer2_state\") >= 100) {\n    if (global.get(\"dimmer2\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer2\") - 1\n    }\n    flow.set(\"dimDirection2\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer2_state\") <= 5 || flow.get(\"dimDirection2\" == undefined)) {\n    if (global.get(\"dimmer2\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer2\") + 1\n    }\n    flow.set(\"dimDirection2\", \"up\")\n}\nmsg.payload = global.get(\"dimmer2\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2478,"wires":[["ab80dc27dad13db2"]]},{"id":"98f0159157ec7287","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer2_state\", Number(global.get(\"dimmer2\")))\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer2_state\", Number(global.get(\"dimmer2\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer2\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer2\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2460,"wires":[["4012e75a38c30505"],["49d01c2725449987"]]},{"id":"49d01c2725449987","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2478,"wires":[["c9e78973de3e87f5"]]},{"id":"c9e78973de3e87f5","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2478,"wires":[["4012e75a38c30505"],["6fcbb3694aae57d6"]]},{"id":"4012e75a38c30505","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer2\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer2before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer2before\", Number(flow.get(\"dimmer2_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer2_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer2_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection2\", \"down\")\n    flow.set(\"dimmer2before\", Number(flow.get(\"dimmer2_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection2\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":2438,"wires":[["ab80dc27dad13db2"]]},{"id":"ab80dc27dad13db2","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp2","mode":"link","links":["09bf8b5862924eed"],"x":2936,"y":2440,"wires":[]},{"id":"85c915420d06edc9","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2558,"wires":[["777b3d91d52ef8d7"]]},{"id":"777b3d91d52ef8d7","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer3\")\nif (flow.get(\"timer3\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection3\") == \"down\" && flow.get(\"dimmer3_state\") > 5) {\n    global.set(\"dimmer3\", global.get(\"dimmer3\") - 1 <= 5 ? 5 : global.get(\"dimmer3\") - 1)\n    msg.payload = global.get(\"dimmer3\")\n    return msg\n}\n\nif (flow.get(\"dimDirection3\") == \"up\" && flow.get(\"dimmer3_state\") < 100) {\n    global.set(\"dimmer3\", global.get(\"dimmer3\") + 1 >= 100 ? 100 : global.get(\"dimmer3\") + 1)\n    msg.payload = global.get(\"dimmer3\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer3_state\") >= 100) {\n    if (global.get(\"dimmer3\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer3\") - 1\n    }\n    flow.set(\"dimDirection3\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer3_state\") <= 5 || flow.get(\"dimDirection3\" == undefined)) {\n    if (global.get(\"dimmer3\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer3\") + 1\n    }\n    flow.set(\"dimDirection3\", \"up\")\n}\nmsg.payload = global.get(\"dimmer3\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2558,"wires":[["fa8a1cca7e9008c8"]]},{"id":"1d9d22af32be3691","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer3_state\", Number(global.get(\"dimmer3\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer3_state\", Number(global.get(\"dimmer3\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer3\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer3\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2540,"wires":[["01a047ae9189bf98"],["e519d500400c71dd"]]},{"id":"e519d500400c71dd","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2558,"wires":[["0e976f82d4741d35"]]},{"id":"0e976f82d4741d35","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2558,"wires":[["01a047ae9189bf98"],["85c915420d06edc9"]]},{"id":"01a047ae9189bf98","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer3\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer3before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer3before\", Number(flow.get(\"dimmer3_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer3_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer3_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection3\", \"down\")\n    flow.set(\"dimmer3before\", Number(flow.get(\"dimmer3_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection3\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":2518,"wires":[["fa8a1cca7e9008c8"]]},{"id":"fa8a1cca7e9008c8","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp3","mode":"link","links":["4896e98db77c2f91"],"x":2936,"y":2520,"wires":[]},{"id":"ec0e7b5c0c6b4fac","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2638,"wires":[["220bdf4b37e3be5b"]]},{"id":"220bdf4b37e3be5b","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer4\")\nif (flow.get(\"timer4\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection4\") == \"down\" && flow.get(\"dimmer4_state\") > 5) {\n    global.set(\"dimmer4\", global.get(\"dimmer4\") - 1 <= 5 ? 5 : global.get(\"dimmer4\") - 1)\n    msg.payload = global.get(\"dimmer4\")\n    return msg\n}\n\nif (flow.get(\"dimDirection4\") == \"up\" && flow.get(\"dimmer4_state\") < 100) {\n    global.set(\"dimmer4\", global.get(\"dimmer4\") + 1 >= 100 ? 100 : global.get(\"dimmer4\") + 1)\n    msg.payload = global.get(\"dimmer4\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer4_state\") >= 100) {\n    if (global.get(\"dimmer4\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer4\") - 1\n    }\n    flow.set(\"dimDirection4\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer4_state\") <= 5 || flow.get(\"dimDirection4\" == undefined)) {\n    if (global.get(\"dimmer4\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer4\") + 1\n    }\n    flow.set(\"dimDirection4\", \"up\")\n}\nmsg.payload = global.get(\"dimmer4\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2638,"wires":[["8908f40dfa5f3b71"]]},{"id":"c543a42cb47c4651","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer4_state\", Number(global.get(\"dimmer4\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer4_state\", Number(global.get(\"dimmer4\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer4\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer4\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2620,"wires":[["6037d3a877684b80"],["8f9601069e71540a"]]},{"id":"8f9601069e71540a","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2638,"wires":[["cf03ba0129534817"]]},{"id":"cf03ba0129534817","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2638,"wires":[["6037d3a877684b80"],["ec0e7b5c0c6b4fac"]]},{"id":"6037d3a877684b80","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer4\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer4before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer4before\", Number(flow.get(\"dimmer4_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer4_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer4_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection4\", \"down\")\n    flow.set(\"dimmer4before\", Number(flow.get(\"dimmer4_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection4\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":2598,"wires":[["8908f40dfa5f3b71"]]},{"id":"8908f40dfa5f3b71","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp4","mode":"link","links":["77683cc8a2a2dd71"],"x":2936,"y":2600,"wires":[]},{"id":"d11a1108f7d8939f","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2718,"wires":[["b11127492273781c"]]},{"id":"b11127492273781c","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer5\")\nif (flow.get(\"timer5\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection5\") == \"down\" && flow.get(\"dimmer5_state\") > 5) {\n    global.set(\"dimmer5\", global.get(\"dimmer5\") - 1 <= 5 ? 5 : global.get(\"dimmer5\") - 1)\n    msg.payload = global.get(\"dimmer5\")\n    return msg\n}\n\nif (flow.get(\"dimDirection5\") == \"up\" && flow.get(\"dimmer5_state\") < 100) {\n    global.set(\"dimmer5\", global.get(\"dimmer5\") + 1 >= 100 ? 100 : global.get(\"dimmer5\") + 1)\n    msg.payload = global.get(\"dimmer5\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer5_state\") >= 100) {\n    if (global.get(\"dimmer5\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer5\") - 1\n    }\n    flow.set(\"dimDirection5\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer5_state\") <= 5 || flow.get(\"dimDirection5\" == undefined)) {\n    if (global.get(\"dimmer5\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer5\") + 1\n    }\n    flow.set(\"dimDirection5\", \"up\")\n}\nmsg.payload = global.get(\"dimmer5\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2718,"wires":[["40f8eb90aa2f105f"]]},{"id":"686ca021072be8b4","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer5_state\", Number(global.get(\"dimmer5\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer5_state\", Number(global.get(\"dimmer5\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer5\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer5\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2700,"wires":[["2c4a9b10a4546586"],["5e3d676a08b47ff1"]]},{"id":"5e3d676a08b47ff1","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2210,"y":2718,"wires":[["15b8cd776864ac26"]]},{"id":"15b8cd776864ac26","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2718,"wires":[["2c4a9b10a4546586"],["d11a1108f7d8939f"]]},{"id":"2c4a9b10a4546586","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer5\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer5before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer5before\", Number(flow.get(\"dimmer5_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer5_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer5_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection5\", \"down\")\n    flow.set(\"dimmer5before\", Number(flow.get(\"dimmer5_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection5\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2581,"y":2680,"wires":[["40f8eb90aa2f105f"]]},{"id":"40f8eb90aa2f105f","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp5","mode":"link","links":["2530d817d07d6ef2"],"x":2936,"y":2680,"wires":[]},{"id":"0f0c44a86aca31e8","type":"trigger","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-50","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2620,"y":2798,"wires":[["87f2fe3e3bb7d291"]]},{"id":"87f2fe3e3bb7d291","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long push","func":"msg.label = global.get(\"Ndimmer6\")\nif (flow.get(\"timer6\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection6\") == \"down\" && flow.get(\"dimmer6_state\") > 5) {\n    global.set(\"dimmer6\", global.get(\"dimmer6\") - 1 <= 5 ? 5 : global.get(\"dimmer6\") - 1)\n    msg.payload = global.get(\"dimmer6\")\n    return msg\n}\n\nif (flow.get(\"dimDirection6\") == \"up\" && flow.get(\"dimmer6_state\") < 100) {\n    global.set(\"dimmer6\", global.get(\"dimmer6\") + 1 >= 100 ? 100 : global.get(\"dimmer6\") + 1)\n    msg.payload = global.get(\"dimmer6\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer6_state\") >= 100) {\n    if (global.get(\"dimmer6\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer6\") - 1\n    }\n    flow.set(\"dimDirection6\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer6_state\") <= 5 || flow.get(\"dimDirection6\" == undefined)) {\n    if (global.get(\"dimmer6\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer6\") + 1\n    }\n    flow.set(\"dimDirection6\", \"up\")\n}\nmsg.payload = global.get(\"dimmer6\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2820,"y":2798,"wires":[["af5c3ee0ce733774"]]},{"id":"b4b27cbb0d43c0d9","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer6_state\", Number(global.get(\"dimmer6\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer6_state\", Number(global.get(\"dimmer6\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer6\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer6\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2021,"y":2760,"wires":[["9e9a1bfef5f63dc2"],["aca7f7342e540585"]]},{"id":"aca7f7342e540585","type":"join","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","useparts":true,"accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2201,"y":2800,"wires":[["55c2b0760b6a01be"]]},{"id":"55c2b0760b6a01be","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2400,"y":2798,"wires":[["9e9a1bfef5f63dc2"],["0f0c44a86aca31e8"]]},{"id":"9e9a1bfef5f63dc2","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"short push","func":"msg.label = global.get(\"Ndimmer6\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer6before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer6before\", Number(flow.get(\"dimmer6_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer6_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer6_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection6\", \"down\")\n    flow.set(\"dimmer6before\", Number(flow.get(\"dimmer6_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection6\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":2758,"wires":[["af5c3ee0ce733774"]]},{"id":"af5c3ee0ce733774","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"dimmer test mcp6","mode":"link","links":["d4e73c36b453526a"],"x":2936,"y":2760,"wires":[]},{"id":"f567567229e2a00f","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Relays","info":"","x":1681,"y":1920,"wires":[]},{"id":"6a7712d485c6daa2","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmers","info":"","x":1731,"y":2680,"wires":[]},{"id":"ea2b119faf20137b","type":"status","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinputs","scope":["c517c2888afa2829","f7dd407a509e511e","58d0234d1785ac0e","153a8a3b63022c66","34ecd80c1424333a","ca0dd4001f9cf28a","dbb2c17a6d1706d6","ac77850ce6bb0d95","067fcc36a3f7c53e","67bd05973906225b","13639892e920483a","b9c7f6f7209f7298","1f3bbb50a4fd72c9","41e148dedaaeec0a","0a53020ca73fa97a","c8168de67ce0357c"],"x":120,"y":4380,"wires":[["990b2b14768d2f11"]]},{"id":"990b2b14768d2f11","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"status mcpinputs out","mode":"link","links":["0329745da23bc4e1"],"x":305,"y":4380,"wires":[]},{"id":"8260fd8aaa0deeb7","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"↓ show input signal as notification while in inputs config menu","info":"","x":280,"y":4340,"wires":[]},{"id":"7b3acf3acbc815a6","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"save current values","func":"const baseURL = \"http://127.0.0.1:1880\";\nconst inputCommand = msg.inputCommand || msg.keypad?.command || null;\nconst active = msg.mcpinput_status === true;\n\nif (\n    msg.inputType === \"switch\" ||\n    msg.keypad?.mode === \"switch\"\n) {\n    const totalTargets = countTargets(msg);\n    const activeTargets = countActiveTargets(msg);\n\n    if (totalTargets > 0) {\n        msg.mcpinput_status = activeTargets === 0;\n    }\n}\n\nfunction selectedVariablesFromPayload(msg) {\n    const vars = [];\n\n    const relayMap = {\n        one: \"one\", two: \"two\", three: \"three\", four: \"four\",\n        five: \"five\", six: \"six\", seven: \"seven\", eight: \"eight\",\n        nine: \"nine\", ten: \"ten\", eleven: \"eleven\", twelve: \"twelve\",\n        thirteen: \"thirteen\", fourteen: \"fourteen\", fifteen: \"fifteen\", sixteen: \"sixteen\"\n    };\n\n    for (const [key, selected] of Object.entries(msg.payload?.relays || {})) {\n        if (selected === true && relayMap[key]) vars.push(relayMap[key]);\n    }\n\n    for (const [key, selected] of Object.entries(msg.payload?.dimmers || {})) {\n        if (selected === true) {\n            const n = Number(String(key).replace(\"d\", \"\"));\n            if (Number.isInteger(n) && n >= 1 && n <= 15) {\n                vars.push(\"dimmer\" + (n - 1));\n            }\n        }\n    }\n\n    return vars;\n}\n\nfunction hasPayloadTargets(msg) {\n    return (\n        Object.values(msg.payload?.relays || {}).some(v => v === true) ||\n        Object.values(msg.payload?.dimmers || {}).some(v => v === true)\n    );\n}\n\nfunction relayIsOn(key) {\n    return global.get(key) === true;\n}\n\nfunction dimmerIsOn(key) {\n    const n = Number(String(key).replace(\"d\", \"\"));\n    if (!Number.isInteger(n)) return false;\n\n    return Number(global.get(\"dimmer\" + (n - 1))) > 0;\n}\n\nfunction selectedRelays(target = {}) {\n    return Object.entries(target.relays || {})\n        .filter(([_, selected]) => selected === true)\n        .map(([key]) => key);\n}\n\nfunction selectedDimmers(target = {}) {\n    return Object.entries(target.dimmers || {})\n        .filter(([_, selected]) => selected === true)\n        .map(([key]) => key);\n}\n\nfunction countActiveTargets(msg) {\n    let active = 0;\n\n    for (const key of selectedRelays(msg.payload || {})) {\n        if (relayIsOn(key)) active++;\n    }\n\n    for (const key of selectedDimmers(msg.payload || {})) {\n        if (dimmerIsOn(key)) active++;\n    }\n\n    return active;\n}\n\nfunction countTargets(msg) {\n    return (\n        selectedRelays(msg.payload || {}).length +\n        selectedDimmers(msg.payload || {}).length\n    );\n}\n\n// selectedOnlyOff\nif (\n    active &&\n    (\n        inputCommand === \"selectedOnlyOff\" ||\n        global.get(\"mcpinput_selectedOnlyOff\") === msg.mcpinput\n    )\n) {\n    const delayBetweenRequests = 100;\n\n    let requests = [];\n    let counter = 0;\n\n    for (let [key, value] of Object.entries(msg.payload?.relays || {})) {\n        if (value === true) {\n            let relayNumber = Object.keys(msg.payload.relays).indexOf(key) + 1;\n            requests.push({\n                url: `${baseURL}/relay/${relayNumber}/false`,\n                type: \"relay\"\n            });\n        }\n    }\n\n    for (let [key, value] of Object.entries(msg.payload?.dimmers || {})) {\n        if (value === true) {\n            let dimmerNumber = Object.keys(msg.payload.dimmers).indexOf(key) + 1;\n            requests.push({\n                url: `${baseURL}/dimmer/${dimmerNumber}/0`,\n                type: \"dimmer\"\n            });\n        }\n    }\n\n    function sendRequest() {\n        if (counter < requests.length) {\n            let req = requests[counter];\n\n            let requestMsg = {\n                payload: { state: false },\n                headers: { \"Content-Type\": \"application/json\" },\n                url: req.url\n            };\n\n            node.send([null, null, requestMsg]);\n\n            counter++;\n            setTimeout(sendRequest, delayBetweenRequests);\n        } else {\n            node.done();\n        }\n    }\n\n    sendRequest();\n    return [null, null, null];\n}\n\n// alloff\nelse if (\n    active &&\n    (\n        inputCommand === \"alloff\" ||\n        global.get(\"mcpinput_alloff\") === msg.mcpinput\n    )\n) {\n    let variables = [\n        \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\",\n        \"Wone\", \"Wtwo\", \"Wthree\", \"Wfour\", \"Wfive\", \"Wsix\", \"Wseven\", \"Weight\",\n        \"dimmer0\", \"dimmer1\", \"dimmer2\", \"dimmer3\", \"dimmer4\", \"dimmer5\", \"dimmer6\", \"dimmer7\"\n    ];\n\n    if (global.get(\"i2c_io-x\") === true) {\n        variables = variables.concat([\n            \"nine\", \"ten\", \"eleven\", \"twelve\",\n            \"thirteen\", \"fourteen\", \"fifteen\", \"sixteen\"\n        ]);\n    }\n\n    if (global.get(\"i2c_dimmyPro\") === true) {\n        for (let i = 8; i <= 15; i++) {\n            variables.push(`dimmer${i}`);\n        }\n    }\n\n    let anyNotFalseOrZero = false;\n\n    for (let i = 0; i < variables.length; i++) {\n        let value = global.get(variables[i]);\n\n        if (typeof value === \"boolean\" && value === true) {\n            anyNotFalseOrZero = true;\n            break;\n        }\n\n        if (typeof value === \"number\" && value !== 0) {\n            anyNotFalseOrZero = true;\n            break;\n        }\n    }\n\n    if (\n        global.get(\"alloff\") === false ||\n        global.get(\"alloff\") === undefined ||\n        anyNotFalseOrZero === true\n    ) {\n        msg.url = `${baseURL}/switchall/false`;\n    } else {\n        msg.url = `${baseURL}/switchall/true`;\n    }\n\n    return [null, msg, null];\n}\n\n// selectedOff\nelse if (\n    active &&\n    (\n        inputCommand === \"selectedOff\" ||\n        global.get(\"mcpinput_selectedOff\") === msg.mcpinput\n    )\n) {\n    let variablesSelected;\n\n    if (hasPayloadTargets(msg)) {\n        variablesSelected = selectedVariablesFromPayload(msg);\n    } else {\n        const switchallSelected = global.get(\"switchallSelected\");\n\n        if (\n            typeof switchallSelected === \"object\" &&\n            switchallSelected !== null &&\n            !Array.isArray(switchallSelected)\n        ) {\n            variablesSelected = Object.keys(switchallSelected).map(key => String(key));\n        }\n    }\n\n    let anyNotFalseOrZeroSelected = false;\n\n    if (variablesSelected !== undefined) {\n        for (let i = 0; i < variablesSelected.length; i++) {\n            let value = global.get(variablesSelected[i]);\n\n            if (typeof value === \"boolean\" && value === true) {\n                anyNotFalseOrZeroSelected = true;\n                break;\n            }\n\n            if (!isNaN(Number(value)) && Number(value) !== 0) {\n                anyNotFalseOrZeroSelected = true;\n                break;\n            }\n        }\n    }\n\n    if (\n        global.get(\"alloffSelected\") === false ||\n        global.get(\"alloffSelected\") === undefined ||\n        anyNotFalseOrZeroSelected === true ||\n        (!hasPayloadTargets(msg) && global.get(\"switchallSelected\") === undefined)\n    ) {\n        msg.url = `${baseURL}/switchallSelected/false`;\n    } else {\n        msg.url = `${baseURL}/switchallSelected/true`;\n    }\n\n    return [null, msg, null];\n}\n\nelse {\n    return [msg, null, null];\n}","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1461,"y":2160,"wires":[["78c32ee3a96d0106","92530df3ad730f7f"],["d78cfd86e58c05e2"],["c3697a458ff00225"]]},{"id":"335cd5343fcb2602","type":"http request","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"switch all","method":"PUT","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1811,"y":2340,"wires":[[]]},{"id":"c6c13f53cd45e8a3","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"all off/on","info":"","x":1691,"y":2300,"wires":[]},{"id":"d78cfd86e58c05e2","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"1msg/s","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1671,"y":2340,"wires":[["335cd5343fcb2602"]]},{"id":"c3697a458ff00225","type":"http request","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"only off","method":"PUT","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1671,"y":2380,"wires":[[]]},{"id":"976c01eef91f611d","type":"mqtt out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","topic":"pkw/tele/input","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"0ddb07c65cbb68bc","x":1451,"y":2040,"wires":[]},{"id":"b4fe8ea99f7fc5c6","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"push mqtt","func":"msg.payload = {\n    \"input\": msg.mcpinput,\n    \"status\": msg.mcpinput_status\n}\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1280,"y":2040,"wires":[["976c01eef91f611d"]]},{"id":"067fcc36a3f7c53e","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput9","chip":"882646509be98fec","bitNum":"0","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":100,"y":3940,"wires":[["1fb9e594f55fa341"]]},{"id":"67bd05973906225b","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput10","chip":"882646509be98fec","bitNum":"1","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":3980,"wires":[["fdc2d544e29f7e8b"]]},{"id":"13639892e920483a","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput11","chip":"882646509be98fec","bitNum":"2","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4020,"wires":[["9ffe9a29aa7737dc"]]},{"id":"b9c7f6f7209f7298","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput12","chip":"882646509be98fec","bitNum":"3","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4060,"wires":[["f3eb02a9cc0c30e7"]]},{"id":"1f3bbb50a4fd72c9","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput13","chip":"882646509be98fec","bitNum":"4","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4100,"wires":[["e7ec84457b710405"]]},{"id":"41e148dedaaeec0a","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput14","chip":"882646509be98fec","bitNum":"5","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4140,"wires":[["2656f9833dc80bb5"]]},{"id":"1fb9e594f55fa341","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 9\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":3940,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"fdc2d544e29f7e8b","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 10\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":3980,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"9ffe9a29aa7737dc","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 11\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4020,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"f3eb02a9cc0c30e7","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 12\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4060,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"e7ec84457b710405","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 13\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4100,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"2656f9833dc80bb5","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 14\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4140,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"0a53020ca73fa97a","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput15","chip":"882646509be98fec","bitNum":"6","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4180,"wires":[["a68945439e9fccb6"]]},{"id":"c8168de67ce0357c","type":"mcp23017input","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"mcpinput16","chip":"882646509be98fec","bitNum":"7","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":110,"y":4220,"wires":[["bf2dd021ea135856"]]},{"id":"a68945439e9fccb6","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 15\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4180,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"bf2dd021ea135856","type":"function","z":"84346781cb2816e5","g":"47d6745760d0d4bd","name":"set status true/false","func":"msg.mcpinput = 16\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1021,"y":4220,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"f2330d98d41fea5b","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 9","mode":"link","links":["ec3f7ac641192e75"],"x":1935,"y":2078,"wires":[]},{"id":"b5f89f81d362e13d","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 10","mode":"link","links":["f4a80613f490dddd"],"x":1936,"y":2100,"wires":[]},{"id":"e94fd44272944f99","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 11","mode":"link","links":["c823209bf9561262"],"x":1936,"y":2120,"wires":[]},{"id":"679838963842b85e","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 12","mode":"link","links":["b256ab2c4043eb51"],"x":1936,"y":2140,"wires":[]},{"id":"19a89a750269e1b2","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 13","mode":"link","links":["380384990d277aaa"],"x":1936,"y":2160,"wires":[]},{"id":"ec4ad0ef5673c9dc","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 14","mode":"link","links":["c8bffc9761012aec"],"x":1936,"y":2180,"wires":[]},{"id":"b762077d6b6ab30a","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 15","mode":"link","links":["a9ccba6b44c415b3"],"x":1936,"y":2200,"wires":[]},{"id":"8e4f9e1e6c63c651","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"PCB pins out 16","mode":"link","links":["01a437065c680b65"],"x":1936,"y":2220,"wires":[]},{"id":"810cd46156b60646","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":2900,"wires":[["5794b54fe9a8353c"]]},{"id":"5794b54fe9a8353c","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer7\")\nif (flow.get(\"timer7\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection7\") == \"down\" && flow.get(\"dimmer7_state\") > 5) {\n    global.set(\"dimmer7\", global.get(\"dimmer7\") -1 <= 5 ? 5 : global.get(\"dimmer7\") -1)\n    msg.payload = global.get(\"dimmer7\")\n    return msg\n}\n\nif (flow.get(\"dimDirection7\") == \"up\" && flow.get(\"dimmer7_state\") < 100) {\n    global.set(\"dimmer7\", global.get(\"dimmer7\") +1 >= 100 ? 100 : global.get(\"dimmer7\") +1)\n    msg.payload = global.get(\"dimmer7\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer7_state\") >= 100) {\n    if (global.get(\"dimmer7\") <= 0) {\n        //global.set(\"dimmer0\", 0)\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else { \n        //global.set(\"dimmer0\", global.get(\"dimmer0\") -1) \n        msg.payload = global.get(\"dimmer7\") -1\n    }\n    flow.set(\"dimDirection7\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer7_state\") <= 5 || flow.get(\"dimDirection7\" == undefined)) {\n    if (global.get(\"dimmer7\") >= 100) {\n        //global.set(\"dimmer0\", 100)\n        msg.payload = 100\n    }\n    else {\n        //global.set(\"dimmer0\", global.get(\"dimmer0\") +1) \n        msg.payload = global.get(\"dimmer7\") +1\n    }\n    flow.set(\"dimDirection7\", \"up\")\n}\nmsg.payload = global.get(\"dimmer7\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":2900,"wires":[["e990eaa14f966a98"]]},{"id":"022661147c157704","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer7_state\", Number(global.get(\"dimmer7\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer7_state\", Number(global.get(\"dimmer7\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer7\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer7\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":2882,"wires":[["4c09f46a383125d3"],["0b037fd7da7f4632"]]},{"id":"0b037fd7da7f4632","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","useparts":true,"accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":2900,"wires":[["37bb8f157e3eb332"]]},{"id":"37bb8f157e3eb332","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":2900,"wires":[["4c09f46a383125d3"],["810cd46156b60646"]]},{"id":"4c09f46a383125d3","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer7\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer7before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer7before\", Number(flow.get(\"dimmer7_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer7_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer7_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection7\", \"down\")\n    flow.set(\"dimmer7before\", Number(flow.get(\"dimmer7_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection7\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2582,"y":2862,"wires":[["e990eaa14f966a98"]]},{"id":"e990eaa14f966a98","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp7","mode":"link","links":["4644e57c1705d5cf"],"x":2937,"y":2862,"wires":[]},{"id":"973074e9c20b34b1","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":2980,"wires":[["cb2b8b5378ca7cc7"]]},{"id":"cb2b8b5378ca7cc7","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer8\")\nif (flow.get(\"timer8\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection8\") == \"down\" && flow.get(\"dimmer8_state\") > 5) {\n    global.set(\"dimmer8\", global.get(\"dimmer8\") - 1 <= 5 ? 5 : global.get(\"dimmer8\") - 1)\n    msg.payload = global.get(\"dimmer8\")\n    return msg\n}\n\nif (flow.get(\"dimDirection8\") == \"up\" && flow.get(\"dimmer8_state\") < 100) {\n    global.set(\"dimmer8\", global.get(\"dimmer8\") + 1 >= 100 ? 100 : global.get(\"dimmer8\") + 1)\n    msg.payload = global.get(\"dimmer8\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer8_state\") >= 100) {\n    if (global.get(\"dimmer8\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer8\") - 1\n    }\n    flow.set(\"dimDirection8\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer8_state\") <= 5 || flow.get(\"dimDirection8\" == undefined)) {\n    if (global.get(\"dimmer8\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer8\") + 1\n    }\n    flow.set(\"dimDirection8\", \"up\")\n}\nmsg.payload = global.get(\"dimmer8\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":2980,"wires":[["ebf781a811c206dd"]]},{"id":"f340e68aa0926a8f","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer8_state\", Number(global.get(\"dimmer8\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer8_state\", Number(global.get(\"dimmer8\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer8\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer8\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":2962,"wires":[["1e522cfcce5f17f9"],["0a2f403d0fa6cda2"]]},{"id":"0a2f403d0fa6cda2","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":2980,"wires":[["23500b4b501f5291"]]},{"id":"23500b4b501f5291","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":2980,"wires":[["1e522cfcce5f17f9"],["973074e9c20b34b1"]]},{"id":"1e522cfcce5f17f9","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer8\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer8before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer8before\", Number(flow.get(\"dimmer8_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer8_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer8_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection8\", \"down\")\n    flow.set(\"dimmer8before\", Number(flow.get(\"dimmer8_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection8\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":2940,"wires":[["ebf781a811c206dd"]]},{"id":"ebf781a811c206dd","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp8","mode":"link","links":["e087d6825c289e2b"],"x":2937,"y":2942,"wires":[]},{"id":"12a6085e3923c20a","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":3060,"wires":[["e7db811f92408077"]]},{"id":"e7db811f92408077","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer9\")\nif (flow.get(\"timer9\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection9\") == \"down\" && flow.get(\"dimmer9_state\") > 5) {\n    global.set(\"dimmer9\", global.get(\"dimmer9\") - 1 <= 5 ? 5 : global.get(\"dimmer9\") - 1)\n    msg.payload = global.get(\"dimmer9\")\n    return msg\n}\n\nif (flow.get(\"dimDirection9\") == \"up\" && flow.get(\"dimmer9_state\") < 100) {\n    global.set(\"dimmer9\", global.get(\"dimmer9\") + 1 >= 100 ? 100 : global.get(\"dimmer9\") + 1)\n    msg.payload = global.get(\"dimmer9\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer9_state\") >= 100) {\n    if (global.get(\"dimmer9\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer9\") - 1\n    }\n    flow.set(\"dimDirection9\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer9_state\") <= 5 || flow.get(\"dimDirection9\" == undefined)) {\n    if (global.get(\"dimmer9\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer9\") + 1\n    }\n    flow.set(\"dimDirection9\", \"up\")\n}\nmsg.payload = global.get(\"dimmer9\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":3060,"wires":[["80542c0719acd88a"]]},{"id":"524b1373cc6fec14","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer9_state\", Number(global.get(\"dimmer9\")))\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer9_state\", Number(global.get(\"dimmer9\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer9\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer9\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":3042,"wires":[["a679a031ba727f47"],["4b7b5087ecece785"]]},{"id":"4b7b5087ecece785","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":3060,"wires":[["cec0fa777ac7184d"]]},{"id":"cec0fa777ac7184d","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":3060,"wires":[["a679a031ba727f47"],["12a6085e3923c20a"]]},{"id":"a679a031ba727f47","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer9\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer9before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer9before\", Number(flow.get(\"dimmer9_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer9_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer9_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection9\", \"down\")\n    flow.set(\"dimmer9before\", Number(flow.get(\"dimmer9_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection9\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":3020,"wires":[["80542c0719acd88a"]]},{"id":"80542c0719acd88a","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp9","mode":"link","links":["e19e083430f85a9f"],"x":2937,"y":3022,"wires":[]},{"id":"b910aec4acf64aca","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":3140,"wires":[["9d96b3ea7fc14c3e"]]},{"id":"9d96b3ea7fc14c3e","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer10\")\nif (flow.get(\"timer10\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection10\") == \"down\" && flow.get(\"dimmer10_state\") > 5) {\n    global.set(\"dimmer10\", global.get(\"dimmer10\") - 1 <= 5 ? 5 : global.get(\"dimmer10\") - 1)\n    msg.payload = global.get(\"dimmer10\")\n    return msg\n}\n\nif (flow.get(\"dimDirection10\") == \"up\" && flow.get(\"dimmer10_state\") < 100) {\n    global.set(\"dimmer10\", global.get(\"dimmer10\") + 1 >= 100 ? 100 : global.get(\"dimmer10\") + 1)\n    msg.payload = global.get(\"dimmer10\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer10_state\") >= 100) {\n    if (global.get(\"dimmer10\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer10\") - 1\n    }\n    flow.set(\"dimDirection10\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer10_state\") <= 5 || flow.get(\"dimDirection10\" == undefined)) {\n    if (global.get(\"dimmer10\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer10\") + 1\n    }\n    flow.set(\"dimDirection10\", \"up\")\n}\nmsg.payload = global.get(\"dimmer10\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":3140,"wires":[["5e7ae380b7149028"]]},{"id":"d4232f93c6503278","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer10_state\", Number(global.get(\"dimmer10\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer10_state\", Number(global.get(\"dimmer10\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer10\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer10\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":3122,"wires":[["6fe6b0f4ae57d184"],["b9f172caf0185e91"]]},{"id":"b9f172caf0185e91","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":3140,"wires":[["128f4fba212721b6"]]},{"id":"128f4fba212721b6","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":3140,"wires":[["6fe6b0f4ae57d184"],["b910aec4acf64aca"]]},{"id":"6fe6b0f4ae57d184","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer10\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer10before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer10before\", Number(flow.get(\"dimmer10_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer10_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer10_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection10\", \"down\")\n    flow.set(\"dimmer10before\", Number(flow.get(\"dimmer10_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection10\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":3100,"wires":[["5e7ae380b7149028"]]},{"id":"5e7ae380b7149028","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp10","mode":"link","links":["80cad585daad7c91"],"x":2937,"y":3102,"wires":[]},{"id":"927c9316d77c504a","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":3220,"wires":[["7c01016e9776f8b9"]]},{"id":"7c01016e9776f8b9","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer11\")\nif (flow.get(\"timer11\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection11\") == \"down\" && flow.get(\"dimmer11_state\") > 5) {\n    global.set(\"dimmer11\", global.get(\"dimmer11\") - 1 <= 5 ? 5 : global.get(\"dimmer11\") - 1)\n    msg.payload = global.get(\"dimmer11\")\n    return msg\n}\n\nif (flow.get(\"dimDirection11\") == \"up\" && flow.get(\"dimmer11_state\") < 100) {\n    global.set(\"dimmer11\", global.get(\"dimmer11\") + 1 >= 100 ? 100 : global.get(\"dimmer11\") + 1)\n    msg.payload = global.get(\"dimmer11\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer11_state\") >= 100) {\n    if (global.get(\"dimmer11\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer11\") - 1\n    }\n    flow.set(\"dimDirection11\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer11_state\") <= 5 || flow.get(\"dimDirection11\" == undefined)) {\n    if (global.get(\"dimmer11\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer11\") + 1\n    }\n    flow.set(\"dimDirection11\", \"up\")\n}\nmsg.payload = global.get(\"dimmer11\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":3220,"wires":[["32f3e10378016aca"]]},{"id":"83aee79950157301","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer11_state\", Number(global.get(\"dimmer11\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer11_state\", Number(global.get(\"dimmer11\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer11\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer11\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":3202,"wires":[["22c12a2b9c014420"],["599611c0a12474f7"]]},{"id":"599611c0a12474f7","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":3220,"wires":[["ca7179846f52c3bd"]]},{"id":"ca7179846f52c3bd","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":3220,"wires":[["22c12a2b9c014420"],["927c9316d77c504a"]]},{"id":"22c12a2b9c014420","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer11\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer11before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer11before\", Number(flow.get(\"dimmer11_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer11_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer11_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection11\", \"down\")\n    flow.set(\"dimmer11before\", Number(flow.get(\"dimmer11_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection11\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":3180,"wires":[["32f3e10378016aca"]]},{"id":"32f3e10378016aca","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp11","mode":"link","links":["7f6e759ecc8eb4b9"],"x":2937,"y":3182,"wires":[]},{"id":"884ba6e62940d3b8","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":3300,"wires":[["2f6fb8269bd199d1"]]},{"id":"2f6fb8269bd199d1","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer12\")\nif (flow.get(\"timer12\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection12\") == \"down\" && flow.get(\"dimmer12_state\") > 5) {\n    global.set(\"dimmer12\", global.get(\"dimmer12\") - 1 <= 5 ? 5 : global.get(\"dimmer12\") - 1)\n    msg.payload = global.get(\"dimmer12\")\n    return msg\n}\n\nif (flow.get(\"dimDirection12\") == \"up\" && flow.get(\"dimmer12_state\") < 100) {\n    global.set(\"dimmer12\", global.get(\"dimmer12\") + 1 >= 100 ? 100 : global.get(\"dimmer12\") + 1)\n    msg.payload = global.get(\"dimmer12\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer12_state\") >= 100) {\n    if (global.get(\"dimmer12\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer12\") - 1\n    }\n    flow.set(\"dimDirection12\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer12_state\") <= 5 || flow.get(\"dimDirection12\" == undefined)) {\n    if (global.get(\"dimmer12\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer12\") + 1\n    }\n    flow.set(\"dimDirection12\", \"up\")\n}\nmsg.payload = global.get(\"dimmer12\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":3300,"wires":[["4c845ea25804c7ce"]]},{"id":"44de4d62e256bbd0","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer12_state\", Number(global.get(\"dimmer12\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer12_state\", Number(global.get(\"dimmer12\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer12\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer12\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":3282,"wires":[["c64420fc3fc73c4b"],["cbf10ebb85f14f8b"]]},{"id":"cbf10ebb85f14f8b","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2211,"y":3300,"wires":[["be0fedefaddec707"]]},{"id":"be0fedefaddec707","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":3300,"wires":[["c64420fc3fc73c4b"],["884ba6e62940d3b8"]]},{"id":"c64420fc3fc73c4b","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer12\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer12before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer12before\", Number(flow.get(\"dimmer12_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer12_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer12_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection12\", \"down\")\n    flow.set(\"dimmer12before\", Number(flow.get(\"dimmer12_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection12\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2582,"y":3262,"wires":[["4c845ea25804c7ce"]]},{"id":"4c845ea25804c7ce","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp12","mode":"link","links":["8a9ea6cc9e8bbcb1"],"x":2937,"y":3262,"wires":[]},{"id":"6821a82d8aedbd58","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2621,"y":3380,"wires":[["8c262757bed47416"]]},{"id":"8c262757bed47416","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer13\")\nif (flow.get(\"timer13\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection13\") == \"down\" && flow.get(\"dimmer13_state\") > 5) {\n    global.set(\"dimmer13\", global.get(\"dimmer13\") - 1 <= 5 ? 5 : global.get(\"dimmer13\") - 1)\n    msg.payload = global.get(\"dimmer13\")\n    return msg\n}\n\nif (flow.get(\"dimDirection13\") == \"up\" && flow.get(\"dimmer13_state\") < 100) {\n    global.set(\"dimmer13\", global.get(\"dimmer13\") + 1 >= 100 ? 100 : global.get(\"dimmer13\") + 1)\n    msg.payload = global.get(\"dimmer13\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer13_state\") >= 100) {\n    if (global.get(\"dimmer13\") <= 0) {\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else {\n        msg.payload = global.get(\"dimmer13\") - 1\n    }\n    flow.set(\"dimDirection13\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer13_state\") <= 5 || flow.get(\"dimDirection13\" == undefined)) {\n    if (global.get(\"dimmer13\") >= 100) {\n        msg.payload = 100\n    }\n    else {\n        msg.payload = global.get(\"dimmer13\") + 1\n    }\n    flow.set(\"dimDirection13\", \"up\")\n}\nmsg.payload = global.get(\"dimmer13\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2821,"y":3380,"wires":[["3542fd55564dec52"]]},{"id":"4db3360605356a9b","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer13_state\", Number(global.get(\"dimmer13\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer13_state\", Number(global.get(\"dimmer13\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer13\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer13\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2022,"y":3342,"wires":[["edbdcec9160022d1"],["6bc58db95c0d3690"]]},{"id":"6bc58db95c0d3690","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2202,"y":3382,"wires":[["53c2e217c3bf45a7"]]},{"id":"53c2e217c3bf45a7","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2401,"y":3380,"wires":[["edbdcec9160022d1"],["6821a82d8aedbd58"]]},{"id":"edbdcec9160022d1","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer13\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer13before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer13before\", Number(flow.get(\"dimmer13_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer13_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer13_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection13\", \"down\")\n    flow.set(\"dimmer13before\", Number(flow.get(\"dimmer13_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection13\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":3340,"wires":[["3542fd55564dec52"]]},{"id":"3542fd55564dec52","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp13","mode":"link","links":["5a18a21e19d10933"],"x":2937,"y":3342,"wires":[]},{"id":"06d24517a9ebf167","type":"trigger","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-30","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":2610,"y":3458,"wires":[["8e7c74809730435b"]]},{"id":"8e7c74809730435b","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long push","func":"msg.label = global.get(\"Ndimmer14\")\nif (flow.get(\"timer14\") == \"stop\") {\n    return null\n}\n\nif (flow.get(\"dimDirection14\") == \"down\" && flow.get(\"dimmer14_state\") > 5) {\n    global.set(\"dimmer14\", global.get(\"dimmer14\") -1 <= 5 ? 5 : global.get(\"dimmer14\") -1)\n    msg.payload = global.get(\"dimmer14\")\n    return msg\n}\n\nif (flow.get(\"dimDirection14\") == \"up\" && flow.get(\"dimmer14_state\") < 100) {\n    global.set(\"dimmer14\", global.get(\"dimmer14\") +1 >= 100 ? 100 : global.get(\"dimmer14\") +1)\n    msg.payload = global.get(\"dimmer14\")\n    return msg\n}\n\n\n//if dimmer = 100 then dim down\nif (flow.get(\"dimmer14_state\") >= 100) {\n    if (global.get(\"dimmer14\") <= 0) {\n        //global.set(\"dimmer0\", 0)\n        msg.payload = 5 // do not dim to under 5%\n    }\n    else { \n        //global.set(\"dimmer0\", global.get(\"dimmer0\") -1) \n        msg.payload = global.get(\"dimmer14\") -1\n    }\n    flow.set(\"dimDirection14\", \"down\")\n}\n//if dimmer = 0 then dim up\nelse if (flow.get(\"dimmer14_state\") <= 5 || flow.get(\"dimDirection14\" == undefined)) {\n    if (global.get(\"dimmer14\") >= 100) {\n        //global.set(\"dimmer0\", 100)\n        msg.payload = 100\n    }\n    else {\n        //global.set(\"dimmer0\", global.get(\"dimmer0\") +1) \n        msg.payload = global.get(\"dimmer14\") +1\n    }\n    flow.set(\"dimDirection14\", \"up\")\n}\nmsg.payload = global.get(\"dimmer14\")\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2810,"y":3458,"wires":[["cd8a31d9162386b5"]]},{"id":"49c5f20cb1414dc9","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"get true/false","func":"if (msg.type == \"switch\") {\n    flow.set(\"dimmer14_state\", Number(global.get(\"dimmer14\")) || 0)\n    return [msg, null]\n}\nelse if (msg.type == \"button\") {\n\n    if (msg.payload == true) {\n        flow.set(\"dimmer14_state\", Number(global.get(\"dimmer14\")) || 0)\n        msg.time = Date.now()\n        msg.topic = \"start\"\n        flow.set(\"timer14\", \"start\")\n    }\n    if (msg.payload == false) {\n        msg.time = Date.now()\n        msg.topic = \"stop\"\n        flow.set(\"timer14\", \"stop\")\n    }\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2011,"y":3420,"wires":[["7c33264a85b8655c"],["dfb6f566fe1e67f0"]]},{"id":"dfb6f566fe1e67f0","type":"join","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.7","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2200,"y":3458,"wires":[["b3ac4d3ff8ab2bd3"]]},{"id":"b3ac4d3ff8ab2bd3","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2390,"y":3458,"wires":[["7c33264a85b8655c"],["06d24517a9ebf167"]]},{"id":"7c33264a85b8655c","type":"function","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"short push","func":"msg.label = global.get(\"Ndimmer14\")\nlet target\nlet dimmerbefore = flow.get(\"dimmer14before\");\n\nif (msg.type == \"switch\") {\n    if (msg.mcpinput_status == true) {\n        target = (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore < 1) ? 50 : dimmerbefore;\n    }\n    else if (msg.mcpinput_status == false) {\n        flow.set(\"dimmer14before\", Number(flow.get(\"dimmer14_state\")))\n        target = 0\n    }\n}\nelse if (msg.type == \"button\") {\n    target = (Number(flow.get(\"dimmer14_state\")) > 0 ? 0 : (dimmerbefore === null || dimmerbefore === undefined || dimmerbefore === 0) ? 50 : dimmerbefore)\n}\nmsg.payload = Number(flow.get(\"dimmer14_state\"))\n\nif (target == 0) {\n    flow.set(\"dimDirection14\", \"down\")\n    flow.set(\"dimmer14before\", Number(flow.get(\"dimmer14_state\")))\n    while (msg.payload > 0) {\n        node.send(msg)\n        msg.payload = msg.payload - 2.5\n        msg.payload = msg.payload < 0 ? 0 : msg.payload\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n    msg.payload = 0\n    return msg\n}\nelse {\n    flow.set(\"dimDirection14\", \"up\")\n    target = target <= 10 ? 20 : target\n    while (msg.payload < target) {\n        msg.payload = msg.payload + 2.5\n        msg.payload = msg.payload > target ? target : msg.payload\n        node.send(msg)\n        await new Promise(resolve => setTimeout(resolve, 25));\n    }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2571,"y":3420,"wires":[["cd8a31d9162386b5"]]},{"id":"cd8a31d9162386b5","type":"link out","z":"84346781cb2816e5","g":"4c1885f550bee737","name":"dimmer test mcp14","mode":"link","links":["a7e7b0d40c1f1ce0"],"x":2936,"y":3420,"wires":[]},{"id":"5b9604cdecc2bca1","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"keypad in","links":["53377c48822a637f"],"x":1317,"y":2200,"wires":[["7b3acf3acbc815a6"]]},{"id":"1c6a1764970b8f2a","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"nine","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":920,"wires":[["6909873bb7ec310f"]]},{"id":"8134caa6faef2354","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"ten","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":1000,"wires":[["034286da67d0d067"]]},{"id":"9d5212f74626d4ce","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"eleven","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":3,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":1080,"wires":[["992b732eb1b95985"]]},{"id":"95638b368db1ebce","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"twelve","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":1160,"wires":[["2e2bdfbe224620e9"]]},{"id":"0380244897e0b0d5","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"thirteen","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1240,"y":1240,"wires":[["27e641c09457b704"]]},{"id":"5ba6dd5d7938a39f","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"fourteen","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":6,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1240,"y":1320,"wires":[["a1a19864fb41ab2f"]]},{"id":"42e9eff9969bf76e","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"fifteen","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":7,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1230,"y":1400,"wires":[["b5dbe2dadfecb8a0"]]},{"id":"0ce55a8753ebff2c","type":"ui_switch","z":"84346781cb2816e5","g":"586dd069119ca734","name":"sixteen","label":"{{relayname}}","tooltip":"","group":"2b459fefb0dfc1df","order":8,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":true,"className":"","x":1240,"y":1480,"wires":[["c170bcc8f98a0cfc"]]},{"id":"37c290e92f575def","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set nine","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"nine\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"nine\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":920,"wires":[["42eed0c8369331c5"]]},{"id":"314b1f2b85150bed","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set ten","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"ten\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"ten\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":1000,"wires":[["3dc264c4c99f3cb5"]]},{"id":"35b30f7ffe7f290b","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set eleven","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 == true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"eleven\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"eleven\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":1080,"wires":[["43aa681ac8ec96ab"]]},{"id":"07bf03d5b56346c1","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set twelve","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"twelve\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"twelve\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":1160,"wires":[["319f25b487ca5de2"]]},{"id":"c35306a5a083fb89","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set thirteen","func":"var check1 = flow.get(\"boot\");\nvar check2 = flow.get(\"Rupdate\");\nif (check1 === true || check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"thirteen\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"thirteen\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":1240,"wires":[["e08bda4a4a3bb274"]]},{"id":"e25b5f417350eaa5","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set fourteen","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"fourteen\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"fourteen\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1640,"y":1320,"wires":[["49ae539fe1f42dcd"]]},{"id":"f2b83f3e1ad9e8e0","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set fifteen","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"fifteen\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"fifteen\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":1400,"wires":[["09cdeb411ffd093e"]]},{"id":"83787709b73a0888","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"globalVariable set sixteen","func":"var check2 = flow.get(\"Rupdate\");\nif(check2 === true) {\n    return null\n}\nelse {\n    if (msg.payload == false) { \n        global.set(\"sixteen\", false);\n    }\n    else if (msg.payload == true) {\n        global.set(\"sixteen\", true);\n    }\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1630,"y":1480,"wires":[["3747078794f4446b"]]},{"id":"42eed0c8369331c5","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 9","mode":"link","links":["5f7ef225e802d331","83ef71057e360893","96e247f4ce6043ff"],"x":1825,"y":920,"wires":[]},{"id":"ec3f7ac641192e75","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 9","links":["63d716b649946401","8605f373eaac686f","8149cb2c7c0f30a7","71e9296a7b3f89fd","f2330d98d41fea5b","3fe38c2d6edc0c84","2a51980677611d4d"],"x":1055,"y":920,"wires":[["1c6a1764970b8f2a"]]},{"id":"319f25b487ca5de2","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 12","mode":"link","links":["2c389910440e48d5","b597242323e2a770","542e1a38edb5b98a"],"x":1825,"y":1160,"wires":[]},{"id":"e08bda4a4a3bb274","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 13","mode":"link","links":["73311fc8d6eb600e","918014e7bfe8c32d","9dcdd5e7213946d8"],"x":1825,"y":1240,"wires":[]},{"id":"49ae539fe1f42dcd","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 14","mode":"link","links":["52e43a6771948438","dbdabad00f6f8e8a","9f68421874a8d03f"],"x":1825,"y":1320,"wires":[]},{"id":"09cdeb411ffd093e","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 15","mode":"link","links":["b1fefafd079f249e","7aa42e41ebc575e6","121d5bf274ecaaf2"],"x":1825,"y":1400,"wires":[]},{"id":"3747078794f4446b","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 16","mode":"link","links":["4891bee85b2398a7","98f97f53934b5d8c","8c77aae9dca78c80"],"x":1825,"y":1480,"wires":[]},{"id":"3dc264c4c99f3cb5","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 10","mode":"link","links":["dcb389f0dc225260","ca12122251924b01","3a7b92781df7312e"],"x":1825,"y":1000,"wires":[]},{"id":"43aa681ac8ec96ab","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 11","mode":"link","links":["a920137042f7c937","ec54228c4db0212d","9aa7270446fc9780"],"x":1825,"y":1080,"wires":[]},{"id":"d63a0e90955d0104","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"save relay status","func":"var check2 = flow.get(\"Rupdate\");\n\nif (check2 != true) {\n    msg.payload = {\n        \"nine\":global.get(\"nine\"),\n        \"ten\":global.get(\"ten\"),\n        \"eleven\":global.get(\"eleven\"),\n        \"twelve\":global.get(\"twelve\"),\n        \"thirteen\":global.get(\"thirteen\"),\n        \"fourteen\":global.get(\"fourteen\"),\n        \"fifteen\":global.get(\"fifteen\"),\n        \"sixteen\":global.get(\"sixteen\"),\n    }\n\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1590,"y":1520,"wires":[["c6dd5077256960b3"]]},{"id":"c6dd5077256960b3","type":"file","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","filename":"pekaway/relaystatusload_iox","filenameType":"str","appendNewline":true,"createDir":true,"overwriteFile":"true","encoding":"none","x":1840,"y":1520,"wires":[[]]},{"id":"13494441dbb96974","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"10","invert":true,"x":2170,"y":960,"wires":[[]]},{"id":"78c4614a72600c92","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"11","invert":true,"x":2170,"y":1020,"wires":[[]]},{"id":"0ff9d86b7dbfc739","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"12","invert":true,"x":2170,"y":1080,"wires":[[]]},{"id":"6bfdadcb7794e99b","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"13","invert":true,"x":2170,"y":1140,"wires":[[]]},{"id":"4c229350274c73f6","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"15","invert":true,"x":2170,"y":1260,"wires":[[]]},{"id":"bdc2913dd55449a6","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"8","invert":true,"x":2170,"y":1320,"wires":[[]]},{"id":"8331a34b55ee19d2","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"9","invert":true,"x":2170,"y":1400,"wires":[[]]},{"id":"ccaac7314bfdbe67","type":"ui_ui_control","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","events":"change","x":100,"y":1240,"wires":[["45941e83ed05523f"]]},{"id":"2d9d047447e5f3d5","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","pauseType":"delayv","timeout":"200","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":380,"y":1240,"wires":[["73d04f063f0ac277"]]},{"id":"1360528b7efc916f","type":"comment","z":"84346781cb2816e5","g":"586dd069119ca734","name":"update relay & wifirelay labels when changing to switches tab","info":"","x":260,"y":1200,"wires":[]},{"id":"69542bc29ab546ce","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"nineoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime9\", null)\n    global.set(\"offtime9\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nnine\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime9\", offTimeString);\n        global.set(\"offtime9\", offTimeString)\n        return [msg, msg]\n    }\n}\n\n/*\nlet offauto = 600;  // Integer representing minutes\nlet d = new Date();  // Current date and time\nlet newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\nlet newDate = new Date(newTime);  // Create a new Date object with the new time\n\nmsg.payload = newDate.getTime;  // Set the new date as the payload\nreturn msg;\n*/","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":880,"wires":[["7f62a873571c5c7f"],["630dc342f5969a73"]]},{"id":"630dc342f5969a73","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay9","pauseType":"delayv","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1410,"y":880,"wires":[["9971ebbce3c30be3"]]},{"id":"9971ebbce3c30be3","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"nineoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":880,"wires":[["1c6a1764970b8f2a"]]},{"id":"5dc6543ecf2af052","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"tenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime10\", null)\n    global.set(\"offtime10\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nten\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime10\", offTimeString);\n        global.set(\"offtime10\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":960,"wires":[["7f62a873571c5c7f"],["5191452f1877f234"]]},{"id":"5191452f1877f234","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay10","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":960,"wires":[["716caf38aadb454d"]]},{"id":"716caf38aadb454d","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"tenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":960,"wires":[["8134caa6faef2354"]]},{"id":"4f1ddde57124abde","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"elvenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime11\", null)\n    global.set(\"offtime11\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Neleven\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime11\", offTimeString);\n        global.set(\"offtime11\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1040,"wires":[["7f62a873571c5c7f"],["70eaebf7748976ce"]]},{"id":"70eaebf7748976ce","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay11","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1040,"wires":[["dc3f64e3709a98ef"]]},{"id":"dc3f64e3709a98ef","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"elvenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1040,"wires":[["9d5212f74626d4ce"]]},{"id":"f01699fcbfd532c0","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"twelveoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime12\", null)\n    global.set(\"offtime12\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Ntwelve\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime12\", offTimeString);\n        global.set(\"offtime12\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1120,"wires":[["7f62a873571c5c7f"],["18014668dd66aa3d"]]},{"id":"18014668dd66aa3d","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay12","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1120,"wires":[["c9db75a15baa7e9f"]]},{"id":"c9db75a15baa7e9f","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"twelveoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1120,"wires":[["95638b368db1ebce"]]},{"id":"f03f6af08a07bb28","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"thirteenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime13\", null)\n    global.set(\"offtime13\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nthirteen\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime13\", offTimeString);\n        global.set(\"offtime13\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1200,"wires":[["7f62a873571c5c7f"],["0c2b5667ae7a1d62"]]},{"id":"0c2b5667ae7a1d62","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay13","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1200,"wires":[["80dd3dfd18c32e4f"]]},{"id":"80dd3dfd18c32e4f","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"thirteenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1200,"wires":[["0380244897e0b0d5"]]},{"id":"e14dff2d0c396791","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"fourteenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime14\", null)\n    global.set(\"offtime14\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nfourteen\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime14\", offTimeString);\n        global.set(\"offtime14\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1280,"wires":[["7f62a873571c5c7f"],["30ba851059a04c2b"]]},{"id":"30ba851059a04c2b","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay14","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1280,"wires":[["eb13980db2ba8889"]]},{"id":"eb13980db2ba8889","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"fourteenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1280,"wires":[["5ba6dd5d7938a39f"]]},{"id":"3839d7afeff78f14","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"fifteenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime15\", null)\n    global.set(\"offtime15\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nfifteen\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime15\", offTimeString);\n        global.set(\"offtime15\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1360,"wires":[["7f62a873571c5c7f"],["af6162b45ebbd995"]]},{"id":"af6162b45ebbd995","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay15","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1360,"wires":[["6e77fdd3fbb6e16f"]]},{"id":"6e77fdd3fbb6e16f","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"fifteenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1360,"wires":[["42e9eff9969bf76e"]]},{"id":"1c06b266dfc86ac0","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"auto off","func":"var offauto = global.get(\"sixteenoffauto\")\n\nif(flow.get(\"Rupdate\") === true) {\n    return null\n}\n\nif (msg.payload === false) {\n    msg.reset = true\n    flow.set(\"offtime16\", null)\n    global.set(\"offtime16\", null)\n    //msg.payload = \"\"\n    return [null, msg]\n}\n\nelse if (msg.payload === true) {\n    msg.reset = true\n    //delete msg.payload\n    node.send([null, msg])\n    \n    if (offauto > 0) {\n        msg.delay = offauto * 60000\n        delete msg.reset\n        msg.payload = global.get(\"Nsixteen\") +\" will turn off in \" + offauto + \" min\"\n        let d = new Date();  // Current date and time\n        let newTime = d.getTime() + (offauto * 60000);  // Add minutes converted to milliseconds\n        let offTime = new Date(newTime);  // Create a new Date object with the new time\n        let hours = offTime.getHours();\n        let formattedHours = (hours < 10 ? '0' : '') + hours;\n        let minutes = offTime.getMinutes();\n        let formattedMinutes = (minutes < 10 ? '0' : '') + minutes;\n        let offTimeString = formattedHours + ':' + formattedMinutes;\n        flow.set(\"offtime16\", offTimeString);\n        global.set(\"offtime16\", offTimeString)\n        return [msg, msg]\n    }\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":1440,"wires":[["7f62a873571c5c7f"],["b81a602635024d2e"]]},{"id":"b81a602635024d2e","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"delay16","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1420,"y":1440,"wires":[["2c5078773b3d1bf1"]]},{"id":"2c5078773b3d1bf1","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"turn off","func":"if (global.get(\"sixteenoffauto\") == 0) {\n    return null\n}\nmsg.payload = false;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":1440,"wires":[["0ce55a8753ebff2c"]]},{"id":"7f62a873571c5c7f","type":"ui_toast","z":"84346781cb2816e5","g":"586dd069119ca734","position":"top right","displayTime":"3","highlight":"","sendall":false,"outputs":0,"ok":"OK","cancel":"","raw":false,"className":"","topic":"","name":"","x":1590,"y":840,"wires":[]},{"id":"83ef71057e360893","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 1","links":["42eed0c8369331c5"],"x":2015,"y":960,"wires":[["13494441dbb96974"]]},{"id":"dcb389f0dc225260","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 2","links":["3dc264c4c99f3cb5"],"x":2015,"y":1020,"wires":[["78c4614a72600c92"]]},{"id":"a920137042f7c937","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 3","links":["43aa681ac8ec96ab"],"x":2015,"y":1080,"wires":[["0ff9d86b7dbfc739"]]},{"id":"2c389910440e48d5","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 4","links":["319f25b487ca5de2"],"x":2015,"y":1140,"wires":[["6bfdadcb7794e99b"]]},{"id":"918014e7bfe8c32d","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 5","links":["e08bda4a4a3bb274"],"x":2015,"y":1200,"wires":[["bed9a70551917d33"]]},{"id":"dbdabad00f6f8e8a","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 6","links":["49ae539fe1f42dcd"],"x":2015,"y":1260,"wires":[["4c229350274c73f6"]]},{"id":"b1fefafd079f249e","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 7","links":["09cdeb411ffd093e"],"x":2015,"y":1320,"wires":[["bdc2913dd55449a6"]]},{"id":"4891bee85b2398a7","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch relay 8","links":["3747078794f4446b"],"x":2015,"y":1400,"wires":[["8331a34b55ee19d2"]]},{"id":"1b9f71086dca60a2","type":"status","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","scope":["630dc342f5969a73","5191452f1877f234","70eaebf7748976ce","18014668dd66aa3d","0c2b5667ae7a1d62","30ba851059a04c2b","af6162b45ebbd995","b81a602635024d2e"],"x":100,"y":1120,"wires":[["169c2ba66b6b2ab5"]]},{"id":"169c2ba66b6b2ab5","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"match relays w/ labels","func":"function numberToWord(num) {\n    const words = [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\", \"eleven\", \"twelve\", \"thirteen\", \"fourteen\", \"fifteen\", \"sixteen\"];\n    return words[num];\n}\n\n// Check if this is a \"relay turned ON\" or \"relay turned OFF\" event\nif (msg.status.shape === \"dot\" && msg.status.fill === \"blue\" && (msg.status.text === \"1\" || msg.status.text === \"0\")) {\n    \n    let relayNumber = parseInt(msg.status.source.name.slice(5)); // Removes first 5 characters (\"delay\")\n    let relayNumberWord = numberToWord(relayNumber);\n    let defaultName = global.get(\"N\" + relayNumberWord);\n    let offtime = flow.get(\"offtime\" + relayNumber);\n    \n    msg.relayNumber = relayNumber;\n    msg.offtime = offtime;\n\n    // Default label\n    let relayLabel = defaultName;\n\n    // Boiler override logic\n    let boilerRelay = flow.get(\"boilerRelay\");\n    let boilertemp_control = flow.get(\"boilertemp_control\");\n\n    if (boilertemp_control && boilerRelay == relayNumberWord  && global.get(\"boiler_visibility\")) {\n        let targetTemp = flow.get(\"boilerTargetTemp\");\n        let currentTemp = flow.get(\"boilerCurrentTemp\");\n\n        relayLabel = defaultName + `<br><font size='-1.2'> Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`;\n        global.set(relayNumberWord+\"offauto\", flow.get(\"boilerRuntime\")),\n        global.set(\"offtime\"+relayNumber, `Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`)\n        node.warn(`Relay ${relayNumber}: Label overridden due to active boiler control.`);\n    } else if (msg.status.text === \"1\" && offtime != null) {\n        relayLabel += `<br><font size='-1'>(turn off at: ${offtime})`;\n        //global.set(relayNumberWord+\"offauto\", 0),\n        //global.set(\"offtime\"+relayNumber, \"\")\n    }\n\n    msg.relayname = relayLabel;\n\n    // Initialize output array (8 relays, all null)\n    let outputs = Array(8).fill(null);\n\n    // Assign the msg to the corresponding relay output\n    outputs[relayNumber - 9] = msg;\n\n    return outputs;\n}\n","outputs":8,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":1120,"wires":[["63d716b649946401"],["b0bb3475a8a57739"],["9267cbced2c5eeed"],["b9201d489545e15e"],["014af2b452edcf4f"],["e2502cf704cd6f5e"],["3ec93790d8eb79fa"],["7d1545f2e1593034"]]},{"id":"6909873bb7ec310f","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":1370,"y":920,"wires":[["37c290e92f575def","d63a0e90955d0104","69542bc29ab546ce"]]},{"id":"034286da67d0d067","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1000,"wires":[["314b1f2b85150bed","5dc6543ecf2af052","d63a0e90955d0104"]]},{"id":"992b732eb1b95985","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1080,"wires":[["35b30f7ffe7f290b","d63a0e90955d0104","4f1ddde57124abde"]]},{"id":"2e2bdfbe224620e9","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1160,"wires":[["07bf03d5b56346c1","d63a0e90955d0104","f01699fcbfd532c0"]]},{"id":"27e641c09457b704","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1240,"wires":[["c35306a5a083fb89","d63a0e90955d0104","f03f6af08a07bb28"]]},{"id":"a1a19864fb41ab2f","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1320,"wires":[["e25b5f417350eaa5","d63a0e90955d0104","e14dff2d0c396791"]]},{"id":"b5dbe2dadfecb8a0","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1400,"wires":[["f2b83f3e1ad9e8e0","d63a0e90955d0104","3839d7afeff78f14"]]},{"id":"c170bcc8f98a0cfc","type":"rbe","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":false,"property":"payload","topi":"topic","x":1370,"y":1480,"wires":[["83787709b73a0888","d63a0e90955d0104","1c06b266dfc86ac0"]]},{"id":"73d04f063f0ac277","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"match relays w/ labels","func":"function numberToWord(num) {\n    const words = [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\", \"eleven\", \"twelve\", \"thirteen\", \"fourteen\", \"fifteen\", \"sixteen\"];\n    return words[num];\n}\n\n// Save context to local flow vars if present\nif (msg.hasOwnProperty(\"context\")) {\n    let context = msg.context;\n\n    flow.set(\"boilerRelay\", context.boilerRelay);\n    flow.set(\"boilertemp_control\", context.boilertemp_control);\n    flow.set(\"boilerRuntime\", context.boilerRuntime);\n    flow.set(\"boilerTargetTemp\", context.boilerTargetTemp);\n    flow.set(\"boilerCurrentTemp\", context.boilerCurrentTemp);\n\n    //node.warn(\"Boiler context received and saved to flow:\");\n    //node.warn(` - boilerRelay: ${context.boilerRelay}`);\n    //node.warn(` - boilertemp_control: ${context.boilertemp_control}`);\n    //node.warn(` - boilerTargetTemp: ${context.boilerTargetTemp}°C`);\n    //node.warn(` - boilerCurrentTemp: ${context.boilerCurrentTemp}°C`);\n\n    delete msg.fromTimer\n}\n\nlet outputs = [];\n\nfor (let i = 9; i < 17; i++) {\n    let relayNumberWord = numberToWord(i);\n    let defaultName = global.get(\"N\" + relayNumberWord);\n    let offtime = global.get(\"offtime\" + i);\n    let relayLabel = defaultName;\n\n    // Try to apply boiler label if relay matches and boiler control is on\n    let boilerRelay = flow.get(\"boilerRelay\");\n    let boilertemp_control = flow.get(\"boilertemp_control\");\n\n    if (boilertemp_control && boilerRelay == relayNumberWord && global.get(\"boiler_visibility\")) {\n        let targetTemp = flow.get(\"boilerTargetTemp\");\n        let currentTemp = flow.get(\"boilerCurrentTemp\");\n\n        relayLabel = defaultName + `<br><font size='-1.2'> Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`;\n        //node.warn(`Relay ${i}: Replaced label with boiler control info.`);\n        global.set(relayNumberWord+\"offauto\", flow.get(\"boilerRuntime\")),\n        global.set(\"offtime\"+i, `Boiler Automatic ON (${currentTemp}/${targetTemp}°C)`)\n    } else {\n        //global.set(relayNumberWord+\"offauto\", 0),\n        //global.set(\"offtime\"+i, \"\")\n        if (offtime != null) {\n            relayLabel += `<br><font size='-1'>(turn off at: ${offtime})`;\n        }\n    }\n\n    let msg = {\n        relayname: relayLabel,\n        payload: global.get(relayNumberWord),\n        word: relayNumberWord\n    };\n\n    outputs[i - 9] = msg;\n}\n\n//node.warn(\"All relay outputs prepared.\");\nnode.send(outputs);","outputs":8,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":1240,"wires":[["63d716b649946401"],["b0bb3475a8a57739"],["9267cbced2c5eeed"],["b9201d489545e15e"],["014af2b452edcf4f"],["e2502cf704cd6f5e"],["3ec93790d8eb79fa"],["7d1545f2e1593034"]]},{"id":"63d716b649946401","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 9","mode":"link","links":["ec3f7ac641192e75"],"x":835,"y":1040,"wires":[]},{"id":"b0bb3475a8a57739","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 10","mode":"link","links":["f4a80613f490dddd"],"x":835,"y":1080,"wires":[]},{"id":"9267cbced2c5eeed","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 11","mode":"link","links":["c823209bf9561262"],"x":835,"y":1120,"wires":[]},{"id":"b9201d489545e15e","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 12","mode":"link","links":["b256ab2c4043eb51"],"x":835,"y":1160,"wires":[]},{"id":"014af2b452edcf4f","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 13","mode":"link","links":["380384990d277aaa"],"x":835,"y":1200,"wires":[]},{"id":"e2502cf704cd6f5e","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 14","mode":"link","links":["c8bffc9761012aec"],"x":835,"y":1240,"wires":[]},{"id":"3ec93790d8eb79fa","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 15","mode":"link","links":["a9ccba6b44c415b3"],"x":835,"y":1280,"wires":[]},{"id":"7d1545f2e1593034","type":"link out","z":"84346781cb2816e5","g":"586dd069119ca734","name":"PCB pins out 16","mode":"link","links":["01a437065c680b65"],"x":835,"y":1320,"wires":[]},{"id":"dd38949006e2602c","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"relayname","links":["00679106493db8ac","961a8b6d41509271","d19d99a6e5a537b7","f3b81ce4.96da8"],"x":425,"y":1160,"wires":[["73d04f063f0ac277"]]},{"id":"4d52349d05730ba0","type":"comment","z":"84346781cb2816e5","g":"586dd069119ca734","name":"update relay & wifirelay labels using switches (when on tab Switches)","info":"","x":280,"y":1080,"wires":[]},{"id":"1ba99cde3a8f083c","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"set update false","func":"\nflow.set(\"Rupdate\",false);","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":1400,"wires":[[]]},{"id":"d76432a53b52c0e6","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"600ms","pauseType":"delay","timeout":"600","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":350,"y":1400,"wires":[["1ba99cde3a8f083c"]]},{"id":"bf1bde0ef596e4ac","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"set update true","func":"flow.set(\"Rupdate\",true);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":200,"y":1400,"wires":[["d76432a53b52c0e6"]]},{"id":"70efa7ba45f8eeb4","type":"ui_button","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","group":"2b459fefb0dfc1df","order":9,"width":0,"height":0,"passthru":false,"label":"sync","tooltip":"check status again and resync it. ","color":"","bgcolor":"","className":"","icon":"","payload":"Relay states synchronized","payloadType":"str","topic":"topic","topicType":"msg","x":390,"y":1360,"wires":[["bf1bde0ef596e4ac","73d04f063f0ac277","9023f2447ce36355"]]},{"id":"f459dcb22b3b6491","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"relay state init","links":["ea056e6598b5f8c6"],"x":285,"y":1280,"wires":[["b57f215b70958027"]]},{"id":"b57f215b70958027","type":"delay","z":"84346781cb2816e5","g":"586dd069119ca734","name":"1.5s","pauseType":"delay","timeout":"1.5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":1280,"wires":[["73d04f063f0ac277"]]},{"id":"45941e83ed05523f","type":"function","z":"84346781cb2816e5","g":"586dd069119ca734","name":"check tab","func":"if (msg.payload == \"change\" && msg.name == \"Switches\") {\n    return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":1240,"wires":[["2d9d047447e5f3d5"]]},{"id":"c652e5765f8f5431","type":"comment","z":"84346781cb2816e5","g":"586dd069119ca734","name":"↑ link in on boot","info":"","x":360,"y":1320,"wires":[]},{"id":"9023f2447ce36355","type":"ui_toast","z":"84346781cb2816e5","g":"586dd069119ca734","position":"top right","displayTime":"3","highlight":"","sendall":false,"outputs":0,"ok":"OK","cancel":"","raw":false,"className":"","topic":"","name":"","x":590,"y":1360,"wires":[]},{"id":"bed9a70551917d33","type":"mcp23017output","z":"84346781cb2816e5","g":"586dd069119ca734","name":"","chip":"882646509be98fec","bitNum":"14","invert":true,"x":2170,"y":1200,"wires":[[]]},{"id":"f4a80613f490dddd","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 10","links":["b0bb3475a8a57739","6c4116dc82442a57","aadae94e2e1bc4fb","881e8eee2b737b09","b5f89f81d362e13d","3fe38c2d6edc0c84","0b8e344f8c176a5c"],"x":1055,"y":1000,"wires":[["8134caa6faef2354"]]},{"id":"c823209bf9561262","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 11","links":["9267cbced2c5eeed","33a3867fa124d56c","667a356ea66c0b0b","b3d58d735ede5603","e94fd44272944f99","3fe38c2d6edc0c84","f4a1fbdf327a2eb0"],"x":1055,"y":1080,"wires":[["9d5212f74626d4ce"]]},{"id":"b256ab2c4043eb51","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 12","links":["b9201d489545e15e","bda1f87ee4c3f512","f17cc491a45853cb","27485780129c24d8","679838963842b85e","3fe38c2d6edc0c84","ebeba6a49e1699b4"],"x":1055,"y":1160,"wires":[["95638b368db1ebce"]]},{"id":"380384990d277aaa","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 13","links":["014af2b452edcf4f","cedfdf5119bf5dc5","3eaf76fa4a3a367f","213c0f0c425f83ba","19a89a750269e1b2","3fe38c2d6edc0c84","3c9f94652b6f3011"],"x":1055,"y":1240,"wires":[["0380244897e0b0d5"]]},{"id":"c8bffc9761012aec","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 14","links":["e2502cf704cd6f5e","4c2147f5e2d0693f","cc84186738e3c1ef","35d394f03b1c74d2","ec4ad0ef5673c9dc","3fe38c2d6edc0c84","7ae284ec7467d3b4"],"x":1055,"y":1320,"wires":[["5ba6dd5d7938a39f"]]},{"id":"a9ccba6b44c415b3","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 15","links":["3ec93790d8eb79fa","180b21ade84f0cd1","69a90c7c1f57ab5c","8650051f82394bf6","b762077d6b6ab30a","3fe38c2d6edc0c84","cf98d55d1f9956fa"],"x":1055,"y":1400,"wires":[["42e9eff9969bf76e"]]},{"id":"01a437065c680b65","type":"link in","z":"84346781cb2816e5","g":"586dd069119ca734","name":"switch connect 16","links":["7d1545f2e1593034","360af5683c55516e","3fa1ea542a5af23b","0a5211b7b4683207","8e4f9e1e6c63c651","3fe38c2d6edc0c84","40d1f844ea5a1470"],"x":1055,"y":1480,"wires":[["0ce55a8753ebff2c"]]},{"id":"a2bb3a121073adef","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput1_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"1\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n    flow.set (\"mcpinput\"+eingang+\"_type\",\"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":2000,"wires":[["6bba2afbe52c8eef"],["55c3471cedb97714"],["0f61c908f4bbe19d"]]},{"id":"095ac4e46abd9997","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 1.1","func":"var dimm = flow.get (\"mcpDimmer1\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2020,"wires":[["b08ae036f7235c2c"]]},{"id":"b531e249105f27ad","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 1.2","func":"var dimm = flow.get (\"mcpDimmer1\")\nif (dimm == 2){\nmsg.payload = true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2180,"wires":[["644246daf9e07ec9"]]},{"id":"b08ae036f7235c2c","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp1ON (out)","mode":"link","links":["77900564e22f6234"],"x":785,"y":2020,"wires":[]},{"id":"6bba2afbe52c8eef","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpone","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput1_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"1_single\") {\n\n    if (flow.get(\"mcpDimmerstart1\") === true && flow.get(\"mcpDimmer1\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    if (flow.get(\"mcpDimmerstart1\") === true && flow.get(\"mcpDimmer1\") == 2) {\n\n        msg.payload = false;\n        return [null, msg, null];\n    }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpone\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpone\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer1\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":1980,"wires":[["03520f7d85bc6f26","b08ae036f7235c2c"],["a577f1ad13c5d2b8","644246daf9e07ec9"],["b08ae036f7235c2c","2333fb908d888aeb"]]},{"id":"41bd78e3eb272b76","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 1 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart1\")\nif (dimm ==true){\n flow.set (\"mcpinput1_type\",\"switch\") \n flow.set(\"mcpDimmerstart1\",false)\n flow.set (\"mcpDimmer1\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":1900,"wires":[[]]},{"id":"03520f7d85bc6f26","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":540,"y":1940,"wires":[["41bd78e3eb272b76"]]},{"id":"55c3471cedb97714","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcptwo","func":"//stopt Dimmen mit Typ Button\nif (msg.payload == \"1_double\") {\n\n    if (flow.get(\"mcpDimmerstart1\") === true) {\n\n        msg.payload = false;\n        return [msg, null];\n//Schaltet ein und aus mit Typ Switch\n    } else {\n\n        var check = flow.get(\"mcptwo\") || false;\n\n        check = !check;\n\n        flow.set(\"mcptwo\", check);\n        msg.payload = check;\n        if (check == true){\n            flow.set (\"mcpDimmer1\",2)\n        }\n\n        return [null, msg];\n    }\n}\nelse if (global.get(\"mcpinput1_type\") === \"switch\") {\n    msg.payload = msg.payload;\n    return [msg, null, null];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":2140,"wires":[["a577f1ad13c5d2b8","644246daf9e07ec9"],["644246daf9e07ec9","ade482047954b9e9"]]},{"id":"a577f1ad13c5d2b8","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":540,"y":2100,"wires":[["a2b49dac08b474f9"]]},{"id":"a2b49dac08b474f9","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 2 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart1\")\nif (dimm ==true){\n flow.set (\"mcpinput2_type\",\"switch\") \n flow.set(\"mcpDimmerstart1\",false)\n flow.set (\"mcpDimmer1\",2)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2060,"wires":[[]]},{"id":"644246daf9e07ec9","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp1 doppel ON (out)","mode":"link","links":[],"x":785,"y":2140,"wires":[]},{"id":"2333fb908d888aeb","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 1","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":830,"y":1980,"wires":[]},{"id":"ade482047954b9e9","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 1.2","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":820,"y":2080,"wires":[]},{"id":"0f61c908f4bbe19d","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 1 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"1_hold\"){\nlet dimm = flow.get(\"mcpDimmer1\")\nif (dimm ===1){\n   flow.set (\"mcpinput1_type\",\"button\") \n}\nif(dimm===2){\n flow.set (\"mcpinput2_type\",\"button\")   \n}\nflow.set(\"mcpDimmerstart1\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":2220,"wires":[["b531e249105f27ad","095ac4e46abd9997"]]},{"id":"abc33c231ac76001","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Beispiel mit Doppelklick auf Eingang 2","info":"","x":210,"y":2040,"wires":[]},{"id":"f734bee7748a4ec0","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Test_mcp1 in","links":["52bbf25fce646f53"],"x":695,"y":1740,"wires":[["a2bb3a121073adef"]]},{"id":"33c436c9f138d1e3","type":"inject","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":390,"y":1580,"wires":[["52bbf25fce646f53"]]},{"id":"1756bcf5b61e0c7d","type":"inject","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":150,"y":1700,"wires":[["0b2fe537cddb626d","52bbf25fce646f53"]]},{"id":"5744b0333cbe3963","type":"change","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":1740,"wires":[["52bbf25fce646f53"]]},{"id":"0b2fe537cddb626d","type":"delay","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":260,"y":1740,"wires":[["5744b0333cbe3963"]]},{"id":"75e0e808bf65fad9","type":"function","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"function 13","func":"global.set(\"mcpinput1_type\",msg.payload)\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":1800,"wires":[[]]},{"id":"e55a876857d545f7","type":"inject","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"switch","payloadType":"str","x":270,"y":1780,"wires":[["75e0e808bf65fad9"]]},{"id":"10fbb4f63b685217","type":"inject","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"button","payloadType":"str","x":270,"y":1820,"wires":[["75e0e808bf65fad9"]]},{"id":"442b510741e5e1c7","type":"inject","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":390,"y":1620,"wires":[["52bbf25fce646f53"]]},{"id":"52bbf25fce646f53","type":"link out","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"Test_mcp1 out","mode":"link","links":["f734bee7748a4ec0"],"x":605,"y":1740,"wires":[]},{"id":"77900564e22f6234","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp1ON in ","links":["b08ae036f7235c2c"],"x":905,"y":2020,"wires":[["b5b4e4373c642c5a"]]},{"id":"43a7115fc1dc3dba","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 2 ON in ","links":["27365ee1346bfefd"],"x":865,"y":2400,"wires":[["826288e4849163b2"]]},{"id":"66033249890c4fbf","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"debug 45","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":1400,"y":1880,"wires":[]},{"id":"4e246ff95c2d1662","type":"comment","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"True nur für Hold oder Typ Switch","info":"","x":170,"y":1580,"wires":[]},{"id":"b52e7f7fb997ea86","type":"comment","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"False nur für Typ Switch","info":"","x":200,"y":1620,"wires":[]},{"id":"c2279977038f983e","type":"comment","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"True nur für Type Button Klick/Doppelklick stop Dimmen","info":"","x":280,"y":1660,"wires":[]},{"id":"a15cbe3c82277c41","type":"comment","z":"84346781cb2816e5","g":"3e9393511262cdb1","name":"Test Umschaltung Switch Button Global","info":"","x":230,"y":1860,"wires":[]},{"id":"5fd737b1c7953ac2","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 2 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart2\")\nif (dimm ==true){\n flow.set (\"mcpinput2_type\",\"switch\") \n flow.set(\"mcpDimmerstart2\",false)\n flow.set (\"mcpDimmer2\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2280,"wires":[[]]},{"id":"aeb0a247fd8e8e86","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":540,"y":2320,"wires":[["5fd737b1c7953ac2"]]},{"id":"9ad5f03cd170cc43","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcptwo","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput2_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"2_single\") {\n\n    if (flow.get(\"mcpDimmerstart2\") === true && flow.get(\"mcpDimmer2\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n       // return [null, msg, null];\n    //}\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcptwo\") || false;\n\n        check = !check;\n\n        flow.set(\"mcptwo\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer2\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":2360,"wires":[["aeb0a247fd8e8e86","27365ee1346bfefd"],[],["27365ee1346bfefd","52de7b2f5881d3f8"]]},{"id":"59270446b9f06abc","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 2","func":"var dimm = flow.get (\"mcpDimmer2\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":2400,"wires":[["27365ee1346bfefd"]]},{"id":"ec897936deebd3bb","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 2 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"2_hold\"){\nlet dimm = flow.get(\"mcpDimmer2\")\nif (dimm ===1){\n   flow.set (\"mcpinput2_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput3_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart2\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":2440,"wires":[["59270446b9f06abc"]]},{"id":"6828f3617636a4f9","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput2_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"2\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n    flow.set (\"mcpinput\"+eingang+\"_type\",\"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":2380,"wires":[["9ad5f03cd170cc43"],[],["ec897936deebd3bb"]]},{"id":"27365ee1346bfefd","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp2ON (out)","mode":"link","links":["43a7115fc1dc3dba"],"x":785,"y":2400,"wires":[]},{"id":"52de7b2f5881d3f8","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 2","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":830,"y":2360,"wires":[]},{"id":"3de7cf1988d5c188","type":"comment","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"ab hier Doppelklick nicht aktiv","info":"","x":260,"y":2420,"wires":[]},{"id":"58d0234d1785ac0e","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput3","chip":"4e9949f3b6e19991","bitNum":"2","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":2600,"wires":[["07c9827012a4e329"]]},{"id":"ad269d5338fe9647","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 3\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":2620,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"b291eaea9fa69efd","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp3 ON in ","links":["4a517f892462acb3"],"x":875,"y":2620,"wires":[["ad269d5338fe9647"]]},{"id":"4b71420c4b4aeed0","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 3 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart3\")\nif (dimm ==true){\n flow.set (\"mcpinput3_type\",\"switch\") \n flow.set(\"mcpDimmerstart3\",false)\n flow.set (\"mcpDimmer3\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":2500,"wires":[[]]},{"id":"f57ed4ff7b6c9c51","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":550,"y":2540,"wires":[["4b71420c4b4aeed0"]]},{"id":"97930382c043cef3","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpthree","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput3_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"3_single\") {\n\n    if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpthree\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpthree\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer3\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":2580,"wires":[["f57ed4ff7b6c9c51","4a517f892462acb3"],[],["4a517f892462acb3","022ff08f7dd42734"]]},{"id":"ddd91e5b1ce149d2","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 3","func":"var dimm = flow.get (\"mcpDimmer3\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2620,"wires":[["4a517f892462acb3"]]},{"id":"096c660b76493c23","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 3 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"3_hold\"){\nlet dimm = flow.get(\"mcpDimmer3\")\nif (dimm ===1){\n   flow.set (\"mcpinput3_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart3\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":2660,"wires":[["ddd91e5b1ce149d2"]]},{"id":"07c9827012a4e329","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput3_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"3\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n    flow.set (\"mcpinput\"+eingang+\"_type\",\"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":2600,"wires":[["97930382c043cef3"],[],["096c660b76493c23"]]},{"id":"4a517f892462acb3","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp3ON (out)","mode":"link","links":["b291eaea9fa69efd"],"x":795,"y":2620,"wires":[]},{"id":"022ff08f7dd42734","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 3","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":840,"y":2580,"wires":[]},{"id":"30312d6f7df0d37e","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput4","chip":"4e9949f3b6e19991","bitNum":"3","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":2820,"wires":[["bb65cc713310411d"]]},{"id":"8df47864d21604b4","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 4\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":2840,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"80f7e5e0bf1c65e0","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp4 ON in ","links":["9732efaf1724e8ed"],"x":875,"y":2840,"wires":[["8df47864d21604b4"]]},{"id":"e656ddf9db5adfa2","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 4 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart4\")\nif (dimm ==true){\n flow.set (\"mcpinput4_type\",\"switch\") \n flow.set(\"mcpDimmerstart4\",false)\n flow.set (\"mcpDimmer4\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":2720,"wires":[[]]},{"id":"99d3e4b895339afe","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":550,"y":2760,"wires":[["e656ddf9db5adfa2"]]},{"id":"2415e6ea336762e4","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpfour","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput4_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"4_single\") {\n\n    if (flow.get(\"mcpDimmerstart4\") === true && flow.get(\"mcpDimmer4\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpfour\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpfour\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer4\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":2800,"wires":[["99d3e4b895339afe","9732efaf1724e8ed"],[],["9732efaf1724e8ed","3bb8a4225088deaf"]]},{"id":"c4ea110c864d2c11","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 4","func":"var dimm = flow.get (\"mcpDimmer4\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":2840,"wires":[["9732efaf1724e8ed"]]},{"id":"596af3500b823e2f","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 4 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"4_hold\"){\nlet dimm = flow.get(\"mcpDimmer4\")\nif (dimm ===1){\n   flow.set (\"mcpinput4_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart4\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":2880,"wires":[["c4ea110c864d2c11"]]},{"id":"bb65cc713310411d","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput4_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"4\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n     flow.set(\"mcpinput\" + eingang + \"_type\", \"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":2820,"wires":[["2415e6ea336762e4"],[],["596af3500b823e2f"]]},{"id":"9732efaf1724e8ed","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp4ON (out)","mode":"link","links":["80f7e5e0bf1c65e0"],"x":795,"y":2840,"wires":[]},{"id":"3bb8a4225088deaf","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 4","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":840,"y":2800,"wires":[]},{"id":"d893f72a2d942554","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput5","chip":"4e9949f3b6e19991","bitNum":"4","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":3040,"wires":[["e90cf9973420e78a"]]},{"id":"634f3ef702570545","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 5\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1050,"y":3060,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"842d47c5dda6a3d0","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp5 ON in ","links":["40b2a51c98aa24c6"],"x":895,"y":3060,"wires":[["634f3ef702570545"]]},{"id":"8037b147377497c2","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":570,"y":2980,"wires":[["02315abc9aa7b19a"]]},{"id":"2499185fbe83fe7b","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpfive","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput5_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"5_single\") {\n\n    if (flow.get(\"mcpDimmerstart5\") === true && flow.get(\"mcpDimmer5\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpfive\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpfive\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer5\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":3020,"wires":[["8037b147377497c2","40b2a51c98aa24c6"],[],["40b2a51c98aa24c6","348b543bdc72ac09"]]},{"id":"04b414ede568fbb0","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 5","func":"var dimm = flow.get (\"mcpDimmer5\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":3060,"wires":[["40b2a51c98aa24c6"]]},{"id":"8ff15fdad20b5b0a","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 5 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"5_hold\"){\nlet dimm = flow.get(\"mcpDimmer5\")\nif (dimm ===1){\n   flow.set (\"mcpinput5_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart5\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":3100,"wires":[["04b414ede568fbb0"]]},{"id":"e90cf9973420e78a","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput5_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"5\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n    flow.set (\"mcpinput\"+eingang+\"_type\",\"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":3040,"wires":[["2499185fbe83fe7b"],[],["8ff15fdad20b5b0a"]]},{"id":"40b2a51c98aa24c6","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp5ON (out)","mode":"link","links":["842d47c5dda6a3d0"],"x":815,"y":3060,"wires":[]},{"id":"348b543bdc72ac09","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 5","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":860,"y":3020,"wires":[]},{"id":"e9643e96bc48fd0d","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput6","chip":"4e9949f3b6e19991","bitNum":"5","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":3260,"wires":[["7f1694279e764c3c"]]},{"id":"40c17f257f2456f5","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 6\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1050,"y":3280,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"4dcfa9607483d7ed","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp6 ON in ","links":["d8fe0e7ded779db5"],"x":915,"y":3280,"wires":[["40c17f257f2456f5"]]},{"id":"017de9f60b436dd0","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":580,"y":3200,"wires":[["c5a1f37642773c1d"]]},{"id":"bf3fd494d079e573","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpsix","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput6_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"6_single\") {\n\n    if (flow.get(\"mcpDimmerstart6\") === true && flow.get(\"mcpDimmer6\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpsix\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpsix\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer6\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":3240,"wires":[["017de9f60b436dd0","d8fe0e7ded779db5"],[],["d8fe0e7ded779db5","d02432a4354d9c29"]]},{"id":"ec8ab9d3804ae276","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 6","func":"var dimm = flow.get (\"mcpDimmer6\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":3280,"wires":[["d8fe0e7ded779db5"]]},{"id":"18adb0370ce119a1","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 6 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"6_hold\"){\nlet dimm = flow.get(\"mcpDimmer6\")\nif (dimm ===1){\n   flow.set (\"mcpinput6_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart6\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":3320,"wires":[["ec8ab9d3804ae276"]]},{"id":"7f1694279e764c3c","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput6_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"6\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n     flow.set(\"mcpinput\" + eingang + \"_type\", \"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":3260,"wires":[["bf3fd494d079e573"],[],["18adb0370ce119a1"]]},{"id":"d8fe0e7ded779db5","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp6ON (out)","mode":"link","links":["4dcfa9607483d7ed"],"x":825,"y":3280,"wires":[]},{"id":"d02432a4354d9c29","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 6","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":870,"y":3240,"wires":[]},{"id":"9ae524a2e9953696","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp7 ON in ","links":["9fa84fa17f63e6a4"],"x":915,"y":3500,"wires":[["a523760172dfa169"]]},{"id":"f28fb89465ba2be6","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpseven","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput7_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"7_single\") {\n\n    if (flow.get(\"mcpDimmerstart7\") === true && flow.get(\"mcpDimmer7\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpseven\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpseven\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer7\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":3460,"wires":[["0baaf254c4d51210","9fa84fa17f63e6a4"],[],["9fa84fa17f63e6a4","708003efb47af8e5"]]},{"id":"cb0d4e98aa0da8c7","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 7","func":"var dimm = flow.get (\"mcpDimmer7\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":3500,"wires":[["9fa84fa17f63e6a4"]]},{"id":"d5773e90ec619c03","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 7 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"7_hold\"){\nlet dimm = flow.get(\"mcpDimmer7\")\nif (dimm ===1){\n   flow.set (\"mcpinput7_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart7\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":3540,"wires":[["cb0d4e98aa0da8c7"]]},{"id":"94e610ae35b59216","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput7_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"7\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n     flow.set(\"mcpinput\" + eingang + \"_type\", \"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":3480,"wires":[["f28fb89465ba2be6"],[],["d5773e90ec619c03"]]},{"id":"9fa84fa17f63e6a4","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp7ON (out)","mode":"link","links":["9ae524a2e9953696"],"x":835,"y":3500,"wires":[]},{"id":"708003efb47af8e5","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 7","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":880,"y":3460,"wires":[]},{"id":"7ed7c68c5706793b","type":"link in","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp8 ON in ","links":["0119f5b51a60c32f"],"x":935,"y":3720,"wires":[["e1c51c94b2da8e6c"]]},{"id":"e4918dfd2381b1b4","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 8 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart8\")\nif (dimm ==true){\n flow.set (\"mcpinput8_type\",\"switch\") \n flow.set(\"mcpDimmerstart8\",false)\n flow.set (\"mcpDimmer8\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":3600,"wires":[[]]},{"id":"33d867420d499f30","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":610,"y":3640,"wires":[["e4918dfd2381b1b4"]]},{"id":"bff2cfcd9716bd3a","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"globalVariable get mcpeight","func":"// Typ des Eingangs abfragen\nlet type = global.get(\"mcpinput8_type\");\n\n// ============================\n// SWITCH\n// ============================\n// Bei Switch: true/false direkt an Ausgang 1 weitergeben\nif (type === \"switch\") {\n\n    if (msg.payload === true || msg.payload === false) {\n        return [ null, null, msg];\n    }\n\n    return null;\n}\n// ============================\n// BUTTON\n// ============================\n\nif (msg.payload == \"8_single\") {\n\n    if (flow.get(\"mcpDimmerstart8\") === true && flow.get(\"mcpDimmer8\") == 1) {\n\n        msg.payload = false;\n        return [msg, null, null];\n\n    }\n\n    //if (flow.get(\"mcpDimmerstart3\") === true && flow.get(\"mcpDimmer3\") == 2) {\n\n       // msg.payload = false;\n      //  return [null, msg, null];\n   // }\n\n    // Schaltet ein und aus mit Typ Button\n    else {\n\n        var check = flow.get(\"mcpeight\") || false;\n\n        check = !check;\n\n        flow.set(\"mcpeight\", check);\n        msg.payload = check;\n\n        if (check === true) {\n            flow.set(\"mcpDimmer8\", 1);\n        }\n\n        return [null, null, msg];\n    }\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":3680,"wires":[["33d867420d499f30","0119f5b51a60c32f"],[],["0119f5b51a60c32f","a555ea8e98383642"]]},{"id":"79117a323996a03c","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Dimmer Start 8","func":"var dimm = flow.get (\"mcpDimmer8\")\nif (dimm == 1){\nmsg.payload =true\n}\nelse\n{ return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":3720,"wires":[["0119f5b51a60c32f"]]},{"id":"e33afe929afcadd5","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 8 lang","func":"// schaltet um auf Typ Button Startet Dimmen für Taster 1 oder 2\nif (msg.payload ==\"8_hold\"){\nlet dimm = flow.get(\"mcpDimmer4\")\nif (dimm ===1){\n   flow.set (\"mcpinput8_type\",\"button\") \n}\n//if(dimm===2){\n //flow.set (\"mcpinput4_type\",\"button\")   \n//}\nflow.set(\"mcpDimmerstart8\", true)\n    msg.payload =true\n}\nelse { return null }\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":3760,"wires":[["79117a323996a03c"]]},{"id":"1063b0a44dc75564","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"click double hold ","func":"let type = global.get(\"mcpinput8_type\")\nlet timeout_hold = 1200 //Milliisekunden   hier kann die Zeit für Hold \nlet timeout_click = 500 // Millisekunden   und Klick/Doppelklick eingestellt werden\nlet eingang = \"8\"\nif (type=== \"button\"){\n// Initialisiere die Speicher-Variablen\ncontext.timer = context.timer || null; context.pressTime = context.pressTime || 0;\ncontext.clickCount = context.clickCount || 0;\n// HINWEIS: Falls dein Taster bei Druck '0' statt '1' sendet, \n// tausche unten einfach true und false.\nconst isPressed = (msg.payload === 1 || msg.payload === true); if (isPressed) {\n    // Taster wurde gedrückt -> Zeitstempel merken    \n    context.pressTime = Date.now();\n    // Starte Timer für \"Hold\" (z. B. nach 1200 Millisekunden gedrückt halten)   \n    context.timer = setTimeout(() => { if (context.pressTime !== 0) {\n        node.send([null, null, { payload: eingang+\"_hold\", topic: msg.topic }]);\n            //node.send([null, null, { payload: true, topic:\"hold\" }]);\n            // Zurücksetzen, damit nach dem Loslassen kein Klick mehr auslöst            \n            context.clickCount = 0;\n            context.pressTime = 0;\n        }\n    }, timeout_hold);\n} else {\n    // Taster wurde losgelassen    \n    if (context.pressTime === 0) {\n        // Hold wurde bereits ausgelöst, ignoriere das Loslassen       \n        return null;\n    }\n    // Hold-Timer abbrechen, da vor Ablauf losgelassen wurde    \n    clearTimeout(context.timer);\n    let duration = Date.now() - context.pressTime;\n    context.pressTime = 0;\n    // War es ein extrem kurzes Rauschen? (Entprellung / Debounce)    \n    if (duration < 20) return null;\n    // Klick zählen   \n    context.clickCount++;\n    // Warte kurz (500ms), ob ein zweiter Klick folgt    \n    context.clickTimer = setTimeout(() => {\n        if (context.clickCount === 1) {\n            node.send([{ payload: eingang+\"_single\", topic: msg.topic }, null, null]);\n           // node.send([{ payload: true, topic: \"click\" }, null, null]);\n        } else if (context.clickCount >= 2) {\n            node.send([null, { payload: eingang+\"_double\", topic: msg.topic }, null]);\n            //node.send([null, { payload: true, topic: \"double_click\" }, null]);\n        }\n        context.clickCount = 0;\n    }, timeout_click);\n}\n    return null;\n}\n\n if (type===\"switch\"){\n    msg.payload = msg.payload\n    flow.set (\"mcpinput\"+eingang+\"_type\",\"switch\")\n}\nreturn[msg,null,null]\n//return null;","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":3700,"wires":[["bff2cfcd9716bd3a"],[],["e33afe929afcadd5"]]},{"id":"0119f5b51a60c32f","type":"link out","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp8ON (out)","mode":"link","links":["7ed7c68c5706793b"],"x":855,"y":3720,"wires":[]},{"id":"a555ea8e98383642","type":"debug","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcp 8","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":900,"y":3680,"wires":[]},{"id":"c5a1f37642773c1d","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 6 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart6\")\nif (dimm ==true){\n flow.set (\"mcpinput6_type\",\"switch\") \n flow.set(\"mcpDimmerstart6\",false)\n flow.set (\"mcpDimmer6\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":3160,"wires":[[]]},{"id":"aecd2c098d4f5116","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput7","chip":"4e9949f3b6e19991","bitNum":"6","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":3480,"wires":[["94e610ae35b59216"]]},{"id":"2a1058fce144e846","type":"mcp23017input","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"mcpinput8","chip":"4e9949f3b6e19991","bitNum":"7","pullUp":true,"invert":true,"debounce":"100","onMsg":true,"offMsg":true,"x":120,"y":3700,"wires":[["1063b0a44dc75564"]]},{"id":"a523760172dfa169","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 7\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1050,"y":3500,"wires":[["b4fe8ea99f7fc5c6","2c632d533e896270"]]},{"id":"e1c51c94b2da8e6c","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"set status true/false","func":"msg.mcpinput = 8\nmsg.filename = \"pekaway/mcpinput\"+msg.mcpinput\nmsg.mcpinput_status = msg.payload\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":3720,"wires":[["2c632d533e896270","b4fe8ea99f7fc5c6"]]},{"id":"0baaf254c4d51210","type":"delay","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":600,"y":3420,"wires":[["c20ecb912fc78867"]]},{"id":"c20ecb912fc78867","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 7 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart7\")\nif (dimm ==true){\n flow.set (\"mcpinput7_type\",\"switch\") \n flow.set(\"mcpDimmerstart7\",false)\n flow.set (\"mcpDimmer7\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":3380,"wires":[[]]},{"id":"02315abc9aa7b19a","type":"function","z":"84346781cb2816e5","g":"ca5d47c769691720","name":"Schalter 5 SW/BU","func":"// schaltet um auf Typ Switch beendet dimmen\nvar check = msg.payload\nvar dimm = flow.get(\"mcpDimmerstart5\")\nif (dimm ==true){\n flow.set (\"mcpinput5_type\",\"switch\") \n flow.set(\"mcpDimmerstart5\",false)\n flow.set (\"mcpDimmer5\",0)\n\n    { return null }\n}\n\nelse\nmsg.payload = null\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":2940,"wires":[[]]},{"id":"d9229161.b8548","type":"ui_group","name":"Switches","tab":"2fa37e0c8559eb92","order":1,"disp":true,"width":"6","collapse":true,"className":""},{"id":"4e9949f3b6e19991","type":"mcp23017chip","addr":"0x20","interval":"100"},{"id":"0ddb07c65cbb68bc","type":"mqtt-broker","name":"","broker":"http://localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"882646509be98fec","type":"mcp23017chip","addr":"0x21","interval":100},{"id":"2b459fefb0dfc1df","type":"ui_group","name":"In-Out-X","tab":"2fa37e0c8559eb92","order":2,"disp":true,"width":6,"collapse":true,"className":""},{"id":"2fa37e0c8559eb92","type":"ui_tab","name":"Switches","icon":"mi-toggle_on","order":2,"disabled":false,"hidden":false}]