[{"id":"3acfcba1.e50a3c","type":"subflow","name":"Tedee Lock","info":"","category":"","in":[{"x":180,"y":200,"wires":[{"id":"9b9e2492.1674a"}]}],"out":[{"x":1220,"y":380,"wires":[{"id":"835116f2.18bd08","port":0}]},{"x":1220,"y":440,"wires":[{"id":"1d9a5ef9.6cded9","port":0}]},{"x":1220,"y":500,"wires":[{"id":"e1489f39.afaaf","port":0}]},{"x":1220,"y":560,"wires":[{"id":"a907122a.78f34","port":0},{"id":"8951ea56.b3171","port":0}]}],"env":[{"name":"login","type":"str","value":"","ui":{"icon":"font-awesome/fa-user-circle-o","label":{"en-US":"Login"},"type":"input","opts":{"types":["str"]}}},{"name":"password","type":"str","value":"","ui":{"icon":"font-awesome/fa-key","label":{"en-US":"Password"}}},{"name":"lock_id","type":"num","value":"","ui":{"icon":"font-awesome/fa-lock","label":{"en-US":"Lock ID"},"type":"input","opts":{"types":["num"]}}},{"name":"state_obj_id","type":"num","value":"","ui":{"label":{"en-US":"SHM State object ID"}}},{"name":"battery_obj_id","type":"num","value":"","ui":{"label":{"en-US":"SHM Battery level object ID"}}},{"name":"flag_id","type":"str","value":"","ui":{"label":{"en-US":"Linear flag ID"},"type":"select","opts":{"opts":[{"l":{"en-US":"1"},"v":"1"},{"l":{"en-US":"2"},"v":"2"},{"l":{"en-US":"3"},"v":"3"},{"l":{"en-US":"4"},"v":"4"},{"l":{"en-US":"5"},"v":"5"},{"l":{"en-US":"6"},"v":"6"}]}}}],"color":"#30c4fc","inputLabels":["Control"],"outputLabels":["State","Battery level","RAW output","HTTP output"],"icon":"font-awesome/fa-lock","status":{"x":880,"y":340,"wires":[{"id":"2a381936.12a35e","port":0}]}},{"id":"988a9735.3ae6b","type":"http request","z":"3acfcba1.e50a3c","name":"","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":410,"y":340,"wires":[["ca506088.8b345"]]},{"id":"6e69d5de.4e02ac","type":"function","z":"3acfcba1.e50a3c","name":"","func":"let expiry = true;\nif(typeof flow.get('tedee_token') == 'undefined'){\n    expiry=true;\n}\nelse if(flow.get('tedee_token').hasOwnProperty('created')){\n    expiry = Math.floor(Date.now() / 1000)-flow.get('tedee_token').created>(flow.get('tedee_token').expires_in-100);\n}\nelse{\n    expiry = true;\n}\n\nlet options_filled = env.get('tedee_login')!=='' && env.get('tedee_password')!=='' && env.get('lock_id')!=='';\n\nif(options_filled && expiry){\n    msg.url = 'https://tedee.b2clogin.com/tedee.onmicrosoft.com/B2C_1_SignIn_Ropc/oauth2/v2.0/token?grant_type=password&username='+env.get('login')+'&password='+env.get('password')+'&scope=openid 02106b82-0524-4fd3-ac57-af774f340979&client_id=02106b82-0524-4fd3-ac57-af774f340979&response_type=token';\n    msg.method = 'POST';\n    return [msg,null];\n}\nelse if (options_filled && !expiry){\n    msg.url = 'https://api.tedee.com/api/v1.17/my/lock/'+env.get('lock_id');\n    msg.method='GET'\n    msg.headers={};\n    msg.headers.Authorization = flow.get('tedee_token').token_type+\" \"+flow.get('tedee_token').access_token;\n    return [null,msg];\n    //node.warn(flow.get('tedee_token'))\n    \n}\n\n\n\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":240,"y":360,"wires":[["988a9735.3ae6b"],["4e26c185.f25d9"]]},{"id":"ca506088.8b345","type":"json","z":"3acfcba1.e50a3c","name":"","property":"payload","action":"","pretty":false,"x":590,"y":340,"wires":[["2a381936.12a35e"]]},{"id":"2a381936.12a35e","type":"function","z":"3acfcba1.e50a3c","name":"","func":"if(msg.payload.hasOwnProperty('error')){\n    msg.payload = { fill:\"red\", shape:\"dot\", text:\"Invalid credentials\" };\n}\nelse if (msg.payload.hasOwnProperty('access_token')){\n    msg.payload.created = Math.floor(Date.now() / 1000);\n    flow.set('tedee_token',msg.payload)\n    msg.payload = { fill:\"green\", shape:\"dot\", text:\"Token OK\" };\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":760,"y":340,"wires":[[]]},{"id":"d08ca122.7eaa48","type":"inject","z":"3acfcba1.e50a3c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"10","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"check_state","payloadType":"str","x":70,"y":360,"wires":[["6e69d5de.4e02ac"]]},{"id":"4e26c185.f25d9","type":"http request","z":"3acfcba1.e50a3c","name":"","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":410,"y":380,"wires":[["d262e722.4c68d"]]},{"id":"d262e722.4c68d","type":"json","z":"3acfcba1.e50a3c","name":"","property":"payload","action":"","pretty":false,"x":590,"y":380,"wires":[["835116f2.18bd08","1d9a5ef9.6cded9"]]},{"id":"835116f2.18bd08","type":"change","z":"3acfcba1.e50a3c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.result.lockProperties.state","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":380,"wires":[["e1489f39.afaaf","a907122a.78f34"]]},{"id":"1d9a5ef9.6cded9","type":"change","z":"3acfcba1.e50a3c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.result.lockProperties.batteryLevel","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":440,"wires":[["8951ea56.b3171"]]},{"id":"9b9e2492.1674a","type":"function","z":"3acfcba1.e50a3c","name":"","func":"let options_filled = env.get('login')!=='' && env.get('password')!=='' && env.get('lock_id')!=='';\nif(options_filled){\n    if(msg.payload=='open'){\n        msg.url = 'https://api.tedee.com/api/v1.17/my/lock/open';\n    }\n    else if(msg.payload=='close'){\n        msg.url = 'https://api.tedee.com/api/v1.17/my/lock/close';\n    }\n    else{\n        return;\n    }\n    msg.method='POST';\n    msg.payload={};\n    msg.payload.deviceId = env.get('lock_id');\n    msg.headers={};\n    msg.headers.Authorization = flow.get('tedee_token').token_type+\" \"+flow.get('tedee_token').access_token;\n    flow.set('priority_refresh_count',0)\n    return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":300,"y":200,"wires":[["f847bd5d.77ea8"]]},{"id":"f847bd5d.77ea8","type":"http request","z":"3acfcba1.e50a3c","name":"","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":470,"y":200,"wires":[[]]},{"id":"76ba2142.fa41f8","type":"inject","z":"3acfcba1.e50a3c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":90,"y":300,"wires":[["7864e4a8.72f754"]]},{"id":"7864e4a8.72f754","type":"function","z":"3acfcba1.e50a3c","name":"","func":"let count = flow.get('priority_refresh_count')\nif(count<10){\n    flow.set('priority_refresh_count',count+1);\n    return msg;\n}\nelse{\n    return;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":240,"y":300,"wires":[["6e69d5de.4e02ac"]]},{"id":"e1489f39.afaaf","type":"function","z":"3acfcba1.e50a3c","name":"","func":"const zeroPad = (num, places) => String(num).padStart(places, '0')\nmsg.payload = '7AF9'+zeroPad(Number(msg.payload).toString(16),2)+zeroPad((Number(env.get('flag_id'))-1).toString(16),2)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1040,"y":500,"wires":[[]]},{"id":"a907122a.78f34","type":"function","z":"3acfcba1.e50a3c","name":"","func":"let states = ['Nieskalibrowany', 'Kalibracja','Otwarty','W pol otwarty','Otwieranie','Zamykanie','Zamkniety','Odciagniety','Odciaganie'];\n\nmsg.payload=states[Number(msg.payload)];\n\nmsg.url='http://localhost:8060/api/set/'+env.get('state_obj_id')+'/setText/'+msg.payload;\nmsg.method = 'GET'\ndelete msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1040,"y":560,"wires":[[]]},{"id":"8951ea56.b3171","type":"function","z":"3acfcba1.e50a3c","name":"","func":"msg.url='http://localhost:8060/api/set/'+env.get('battery_obj_id')+'/setText/'+msg.payload+'%';\nmsg.method = 'GET'\ndelete msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1040,"y":600,"wires":[[]]},{"id":"ffc891d5.70d76","type":"subflow:3acfcba1.e50a3c","z":"b42632.ebbe31d","name":"","env":[{"name":"password","type":"cred"},{"name":"lock_id","value":"9263","type":"num"},{"name":"state_obj_id","value":"1230","type":"num"},{"name":"battery_obj_id","value":"1231","type":"num"},{"name":"flag_id","value":"1","type":"str"}],"x":660,"y":480,"wires":[[],[],["275485b7.708122"],["9f0505f3.9e894"]]},{"id":"839af5a1.7a785","type":"Ampio IN","z":"b42632.ebbe31d","valtype":"f","mac":"819E","ioid":"20","name":"","retainignore":"","server":"58556d16.925acc","x":300,"y":460,"wires":[["ce62dc92.569f7"]]},{"id":"ce62dc92.569f7","type":"switch","z":"b42632.ebbe31d","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":415,"y":460,"wires":[["975deee8.77b238"]],"l":false},{"id":"975deee8.77b238","type":"change","z":"b42632.ebbe31d","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"open","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":495,"y":460,"wires":[["ffc891d5.70d76"]],"l":false},{"id":"d867ee26.588d38","type":"switch","z":"b42632.ebbe31d","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":415,"y":500,"wires":[["c72f0d72.6d20b8"]],"l":false},{"id":"c72f0d72.6d20b8","type":"change","z":"b42632.ebbe31d","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"close","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":495,"y":500,"wires":[["ffc891d5.70d76"]],"l":false},{"id":"b44b1f1c.6e0c2","type":"Ampio IN","z":"b42632.ebbe31d","valtype":"f","mac":"819E","ioid":"21","name":"","retainignore":"","server":"58556d16.925acc","x":300,"y":500,"wires":[["d867ee26.588d38"]]},{"id":"9f0505f3.9e894","type":"http request","z":"b42632.ebbe31d","name":"","method":"use","ret":"txt","paytoqs":"body","url":"","tls":"","persist":false,"proxy":"","authType":"basic","x":890,"y":500,"wires":[[]]},{"id":"275485b7.708122","type":"Ampio OUT","z":"b42632.ebbe31d","valtype":"r","mac":"101","ioid":"","name":"","server":"58556d16.925acc","x":890,"y":440,"wires":[]},{"id":"58556d16.925acc","type":"ampioconfig","z":"","name":"","server":"localhost","port":"1883"}]