{"_id":"thingsboard_api","_rev":"62-ba0b6457b4351b64bbaf7a8174b747d5","name":"thingsboard_api","dist-tags":{"latest":"3.1.22","beta":"1.0.4-beta.1","aivanov":"1.0.4-aivanov.2","beta.2":"1.0.4-beta.2","beta.3":"1.0.4-beta.3","beta.3.1":"1.0.4-beta.3.1","beta.3.3":"1.0.4-beta.3.3","beta.3.4":"1.0.4-beta.3.4","beta.3.5":"1.0.4-beta.3.5","beta.3.5.1":"1.0.4-beta.3.5.1","beta.3.5.2":"1.0.4-beta.3.5.2","beta.3.5.3":"1.0.4-beta.3.5.3","beta.3.5.4":"1.0.4-beta.3.5.4","beta.3.5.5":"1.0.4-beta.3.5.5","alpha-0.1":"3.0.1-alpha"},"versions":{"0.0.1":{"name":"thingsboard_api","version":"0.0.1","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"_id":"thingsboard_api@0.0.1","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-eX5p1XBl3Kk2RXyZGpNT56bh0cES3SSVX6I9IIpnSvCNKUA9wNrQuakXkPVg52aZ6k3DgG+MIThd53wfiM190w==","shasum":"1d22ab9250b88d7e2bd65ba435d7c113d9aa8fdf","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.1.tgz","fileCount":3,"unpackedSize":5956,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejy25CRA9TVsSAnZWagAAAVgP+wevG4x84DPTKfgEkR8D\nbtUzybFChtuO/4jD02IXxqmLTIUpKutg6x8Z9tNe+fYGsWBMgiH4+E2u2dUn\nHAeZ5jIYyJe6F1zhwbNV2dhHqqu0EY63oIIJ8WsgCuNkIE2MeVv1XcOuoWgw\nSXmMOZatTXSc8aie8CmjJ1uKrvasmF/uN4nQCQz3sUWpYylIfqOcgUlDDyR2\nc3i5axMWC2JmS5+A2Angt891RKwMK6AQoDebERjx3BduEbuAz/95PuJkQWNo\noNM6haQitx3MG7CDw85dM0TSLrnWiKhF4m4zW4BZCvWOPlRqx9e4oyf9Wdgt\nzDJqfP7JyzP978JaN3H/WLs/AS9gxw8/0CgdjGX//i+B2vmXN9AxL6jxarOa\nub1NgZYzJhyq4E4mDiA21AU8w/qVzP14aMJwAqSUIlgVbRsnpw2pfS99xoXi\nknQ4l1TBysjRHATjc9+VWafJYgq5LMx0lpfjG3/sEBC1qJjB4Q5Ax/t6G/Tr\n0fVO/UtpbDD211QC3cvYUW+y7IAMeTH2M5fVr4lCG+9KEOfyzB7cURUZYq9K\nQ3MYFll7xUmGJhLVdEiuQ0Lmv6lcnN4xELwLKEH6wGrl3UVYhPD2qck94Xo2\nzSgjwpwFjpFjbylSSEds9TBYLwfBSmIMWuFswy2+DvxxMOmbN9c+nFtMbQ3z\nVX4f\r\n=9KwU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGQVuCTd/5MgxkNG6CI2X7NNTXWZdQXEia5yT5c7kGhRAiEAho04kgr+K3mIqrDBEGpZG5OMZ3eQzxbHU9NFisykaGY="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.1_1586441657184_0.3859571067291725"},"_hasShrinkwrap":false},"0.0.1-a":{"name":"thingsboard_api","version":"0.0.1-a","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"_id":"thingsboard_api@0.0.1-a","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-FBQKzkmQUPJqPhYbWu8ISfwt6EPkPMpA0TL9reKRTCR6YHqlzOaX5KHCi8eD4VkZvVlKAUvfedlI/L4/gNpmcw==","shasum":"c37b04602f22fa45de3e3ea7bef41c778b345179","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.1-a.tgz","fileCount":3,"unpackedSize":6233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejy85CRA9TVsSAnZWagAAk/gP/1Hgq/TYH5O0h30saOzB\n9YIZyvJDw5mKSwid2biTQuSQ5Ug+xkwTL9x0fug8hkp1Ki+t8yvbyjacRhH1\nRzoQmIJvJy+i5IqmqyQLvjs2U5exv/FbwPgvZUVDowwTuoxwFWM4tFbavzcO\nCvvOGZ/MjTLU8Dka/mLUDxrQRzHt91S1gEbPeg/Uj02eqxpy0X5Y8nsBC2/e\np3C2qhnrOuEk1OE0kJfdipSpHKW1kFJph7z+20y2JIs2CMULgx5fekP+UCAN\nbVNYP3k3AGY9ucmqU8imBJPbqE7w4Z/aBTzrBUBaEJwokI04Y+8EomPKoa1l\nsjAZjep3B6ttlPYrqBim8OKu07PZNGhS3zCML9bmEdTXh8FnZv5oP56NQMFt\nanBrfG82kUc/OO6JoLwuJLvpNHRWNFnYG6Rbszwn+trMKfArh3+wvQwdMLwv\nHCOvFF5ZUTn18BvVtJannMpCJuaJXYnBxpzVqSrcgfgIHmJQ5Rcse6sD47Mh\nf7z8aHR3I/xI65BDDhZQSxRBZjGzXRqpw4+r/pKVnODNr0QG23BkLXEUd3XA\ngLg5cKb1e3EWsKHtJIRY5PgCw/UqDMYjfm9r8TxHHhbef8N+lcu7gB40ku7e\npjuoq3sl/0UdLjKzSUfxRPi98NU/XD3NN6PdKVJ8utuFGrDzqO2LWdtOIgmd\nOWIj\r\n=BUAi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOzFSiqRcYQjS1b9pUQV2C9Oh0IVC6XdFoAwpuoz+35AIgfD8wOqi/ZeK4FMyi9qutDljjsTp6nglH9++ZaH2D1O4="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.1-a_1586442041600_0.561820064030417"},"_hasShrinkwrap":false},"0.0.1-b":{"name":"thingsboard_api","version":"0.0.1-b","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"_id":"thingsboard_api@0.0.1-b","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-O5oLDvAJSGRKfWs86ITkO4C2AaLIosEzhVuY9tRVl8fxpwclTp6O7CPXxvXemiwvPITwBLmtB5/iafEU9Tklrw==","shasum":"8180581c2f8622dc07ff17b2d75896a51261e645","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.1-b.tgz","fileCount":3,"unpackedSize":6233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejy+MCRA9TVsSAnZWagAAA0kQAJ8BtwYhYD8kAutbSSE9\nm6a9bfwhN+VH21bG184wwceBdvEjyLdA6xChK9CtSNJ61aszMhUvTSUgyGuq\nu6EhjXjs/E6qf+I+SKZtJLQQR0KBDvO8+kpQGV9CGX4Ne3lOmFT+lUIJVXqX\nOpfv+0sOjFLhRTHEzLW212yKsvxjgvL5ZXb80eqGP0D8eJvMICU8Nb+3G3ON\nxgNIYk1ruWnUHGJP8rQ7WV2kfeOO+bKumj1PCpZPHC71w3sM7AM7EKthCBLt\nRCagGNg93c3MEaEhlQSUpEq6FPis1hBm4n0aiUbb9OY6SP+hujtcO9t5ZiKj\nj+H3s5BkM3bGN1jAcGMjb0UKQNjVIXUxwMXb8O9/dL10K01xflfMJ3vS70vF\nupQDVsmAXoT9CZr7QsxSHishljVRz6kvqvdn1HbKnwXQC314Onw2Uc+w/VFF\nYGtqqLuXJSusmLa4VJRLeJfjMWCf+mor3Oo+RGLqKS579iFes3KzXYHFX82V\numpjVZ6IDdKUisVWhJ05gU7Jx8+xqwebG+E2FaVREfLjHrNAo/FSuKVahdKp\nXb1FaU/SXyyUwAnvUL3MUaw8AZh8WeYhDINSowckEg9ZxkE5uXILPXf2oomg\nCVxZYbqkdrOXGyUlX/2/2ryS6bQokzsI4EdXXpavQkl2FdS3kz+hSkbZ5KiU\nIg7W\r\n=DesB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmbCnj9NgD88WiHN1om1Tc+4pyrjKCiWpFqGHT+g775gIhAMoOs8kXHHNMgAfjmv4U+F4LmgRRsGnUbXTmYll/lPEr"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.1-b_1586442124218_0.05485289446327313"},"_hasShrinkwrap":false},"0.0.2-a":{"name":"thingsboard_api","version":"0.0.2-a","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"_id":"thingsboard_api@0.0.2-a","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-zVLxo1JCJs7J7jlOBsNvLmUZ3gHl0J1v+00+XxaXHkxDzC3m153evTbCIfOg4tRxNyTrU5jalVPXvAuZETcdRg==","shasum":"876e0a3fbb2124ae6af436f40f34acf737f14e40","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.2-a.tgz","fileCount":3,"unpackedSize":8309,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejzdiCRA9TVsSAnZWagAA8zQP/0KBafINMLUbiQV7lv1G\nOqPic6BS2Acl/sgN53pUUXlNlRYTqQ5+j02yZou9sObkz3FDWm+zRUYeeOdL\nthAFva1sHcvqp2t/uwIfh/wHS7tGJ0BcTa6p2QLFR40GmGiJzzn3BWYYypZM\n42Zh/Aa4Ouc2BzZH/MniPOuN7YDeVjZ+YirLXGeOK6HqdLmkflDz5qFdUg0D\noBfbJ9mvCSztTJdFL6dppVzfibdZUGdPMWQb0hdun6w20xB4P1qGSP6MrR7w\ni0r78bp7SzXwT9ePApTVcQWyRCsfTD7ON0h1pbtlDkhPY7GnfM3BTEECKo0K\nmRPJ/mz+rFRr20YDjnOl4HqW5RJ+7sv30WFo6+A9IuJ63C9VnTc54JgCmhxO\nJDCRVnBoZPLJDrIGlOBiKN2CSUczOxyVaRt7VDd+xQKbxEfP4cXtYw9XzTOp\nw/skn2/G7XJiWp/Ze8BjfBedA599Fi/2IXwj0IEc+wjLiEM0vmMvdyDsnJAf\nPFh1Vw35jk0z1DiKH4TIW+Tcvr5DMdSprqjLslgSKCfeylAbgqZhEDAeSpaf\nC06T6ChnQKj/vSBYz0F+qCMGdQ8VIbxXnJNv2ttoekwP9KkCtUIuIIqz718L\n3cAcoFYtVckpm4F2olBQcRb4AVm5eFHWqMTHtHV4hLkhXUxc/iqG5GcJrgWP\nA9Qs\r\n=J068\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH1lDn+WvL+W5qoDAOLc7xJXVC4wk0bdHgL2ikWPBw1lAiEA0KzuyeJ+tFCYc55KahYX3NoWUBHPFgsowTu/ZnTy7wg="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.2-a_1586444130346_0.8419381267183588"},"_hasShrinkwrap":false},"0.0.2-b":{"name":"thingsboard_api","version":"0.0.2-b","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"_id":"thingsboard_api@0.0.2-b","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-sPEuw+603bG0wC0mwlPLtgT2RKgETVfRJN4hzAzDyIQpUjylQs7usVgMdow0BnA/MaMO+nmOzz26oAyfifZbYQ==","shasum":"1e17aa967288edf255ee44c7ec31109093799da9","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.2-b.tgz","fileCount":3,"unpackedSize":9029,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejzrsCRA9TVsSAnZWagAA598P/j65mr8l+NyW5wyxkq7r\nHjP46jZArhKjW4jOo2RFOTv+g0TiTYezZyHtnPmMod3l7MYeSIXA3H1cLoFt\nPUAhdHpC5LrGxWUI/MAsu9Lmmcnh4KFC2KcJebm4wqaArtAXAp2mNBJ5uqkS\nTEL7jV49ZxuoIb61kF3WVD5Dj3Hf61lvbKbor5e95Uz1plUAKCqFS+k4swGF\nWrqqPb3OML/29TUAZrldiRwTz/SMNalrdCgZAstoPlCdGr7f35R5mPjU/a21\nSsaNmmZTaJLOYy8qB7Oy0jYocpRtNdO3oe/Qn2knOZLooBw1SgxoatplNyvs\n5ldc0CQeXVUhNzMbL8H/rEW+VdvJPjRjnxQKUhNsC2dFR2nPe8MxXylBtq7G\nx6okPBLaXTitCERGuQ2QmM8ahNtBATxLyx+uaa4e9Mtojn+CjS3YIkPclsIz\nlAwQwH8oAjbSpqxlB8QkEiAChg0ML7sudyxfktAxPhRKELIACRofPnMrRHuw\n1MzuKQNC3p+eqXBSYeEGA1gWkDvRFqyF/xQaqs7tbPnL3IpEjhOP8M6A10HO\n+7bY6nm1+DgfURpNzPlnezW5U0WzpFbwsKG/urloeommrcZZ6LyBXWQu43Mi\n7zApRvcIpAeesrC+/ExxySFiLiIDSEUaqkIvoHaq7i/hg2co/jUSWMAr0R8p\ndsL3\r\n=/DHo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGlVpjOhKgbFsZRwFz/c4c8yA9+NXm7OACoaDCyj1IuHAiAXq1UQQaIbknZKT6BYSjFFtW5qdSF4q2JyLQ3SZSa0sA=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.2-b_1586445036132_0.9826364661130702"},"_hasShrinkwrap":false},"0.0.3":{"name":"thingsboard_api","version":"0.0.3","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0"},"gitHead":"f6c3146ea0b7ef2ba25bf6e35260cea498e208d2","_id":"thingsboard_api@0.0.3","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-lbXMyFRo26pDBeqqu1e64VVpse62xSie5XPXg+SmjdZA98JNSvIhIiO+Mt/Nn8Qs2Km3VEJp3ML+qKO5hZG15A==","shasum":"feb8e40576d481e1cbdf684543d9fcd8cef82153","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.3.tgz","fileCount":4,"unpackedSize":10323,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJej1CSCRA9TVsSAnZWagAAnN0P/3LxwYcJ12GLSza4w8if\nKawKh/A7CDDERHAYy3KWOY6PvJKYKhvIcJbXyeuc0eP+S3GA8NH+d60Kp7lr\nw5xtz2zyIJ/B9SN9sV97jmLTaYZEXMHut0ejGhPX+/5LNbgCMi1vTNp9guvH\nVxNTkCZmycCDYkqG9eMYY5LJNvuGVQ9930lNnx4W/jxN7iwDgInEEx22LeRD\nC/hajvadBsc8gtAQ6DIPv8p8A5/IC+fiAbJY5xt0spQgQNvjT2lhuDHexZHW\nO8yojhPN8Us5n9aMLJhzAo9OAkojn671oarYxYZvXmjIRHKFRx3jpbKF2+iN\nSviri3qRiKdb4vy/kgESH2CJv0x+4/zDmWGH2TEMOQgfj//cRHO5XhM7gbPZ\nWcBVl/5xFOkcRZ0svtc1O7QnZUkfOg49FkpYIOBmqYD0llOnoI9kGSIIj1ND\nyQl543VjmR3/k4tsEPLRQnz68H4uFrD1YSEyhgjnXm70IEngmESYU78g18re\nnnEtwYGPrp+d0eEEZFZOyiolVIGjZyV6ihbiRoCQBsGfnZQmgDVmbbJQdZSw\nU5adtmGtSSwnw2IltvBz2YVVqp9QtNJjw84Np8PU07QFftaFTKSZXAyPYnEc\nxsxoDtAzdWJpwESoqYq7oKXyDaz2X0irn8FofNPzbnTppclj3ECMO8QFtGDl\nQ0HF\r\n=UqTt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOORvasj07s5nVhWt2Rh7a/q40eq8QQcQBwYn2rlovcQIgXOZ4PNhgWM71s1xA8UjeK4dvchftCLRWjfFtY4vNVJI="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.3_1586450577368_0.8788330672765148"},"_hasShrinkwrap":false},"0.0.3-a":{"name":"thingsboard_api","version":"0.0.3-a","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"http://84.201.141.244:19900/aivanov/thingsboard_api.git"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"e528c5092365ec7918294081522b233a0f106415","_id":"thingsboard_api@0.0.3-a","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-korwF+yfUYprStLhWBXPOws2w1S6lZ6cOSWnCTIftGdxuEYAAHcplM3LUJiPpVbp4fC3359Xs7gw1BPkOId1sA==","shasum":"f411c3e27d918f71803018971b2ce3079df2184c","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.3-a.tgz","fileCount":5,"unpackedSize":17278,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJekG5GCRA9TVsSAnZWagAAB5IP/0bohEWvDwn37t/jUYj4\nLlm84tT1T0wftrQV7f3vejVYyhFByYOhMNPVyY9JNb4xjg2aMRCc225nHKcb\nN0StzgYWHVb8SfQPGilM1bhe+AF983/hQFaHZGXPBvDgfSlUL5oVv9oCCbPf\nuvcBZtGd+sWWzOuuiUA5JKNyiawYqddfe/NfJRyXniN081h5tf7Ih0lJFWI1\nnMC3vx4x8J6hbbIIxxdtO1PcxhcApyN9Le4y0K/jLTPUv3FeVPmTer3sbmGI\n/rVj7IMxX3TCBpy2W81j7xX0W7KVccqccNz2boJ58xvhVkm5Oa9eOD5T1kTv\nxj2g0uyAENA+AEojlrHGmXhO/x7GCfbWQpIIbBEAUu70UCrWUrQDhVD0jr1X\nJ3bu6YtEHcv9KVtBn5RoS2bWgzVzbbvHF7KT25UlDhWzM4JxwbR16pVYLzTq\nhjFn2f04qf/OYwjhX1SY8rjvJwztGWAyhBHnhY0iY17RAWbAXq0cYKuYfZqZ\nOUk+KJNwr2TLbwaNi8WjWtG70YYosrKXndiC6RG1nTOn1of1FiZ78duRfUX6\nlOxliw1ArwyUqDQnX6sYVVo3DUwBdM2z+W+yKfP5VIcy7FC9GmnN6T6nj+eC\nai7Je/efPIQiLmiDhaUdZM2OiWaTtg8bpl0CyH5jA5q7Z31HOi/KTbi6Z1EJ\nxgUL\r\n=JyEx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH04axjRmQfSRCMN/fUzYCgCRTd2ymA3SQ1Hd1+9VbndAiA34yeVRiJBP7YyeinK826DyzVCYsiosYEBg29tn2NIpw=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.3-a_1586523718106_0.8370688143304956"},"_hasShrinkwrap":false},"0.0.4-a":{"name":"thingsboard_api","version":"0.0.4-a","description":"alpha Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"4823ba9b21eabe49af32396e85e8ac42637628bf","_id":"thingsboard_api@0.0.4-a","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-HwPyVq2/1WRty5MzlLXMVkjDipdaeMnP6YYEJEVxu8JTH/q5+oqLZChWEl/jMeWebob4x+liWpa04dCdi41bFQ==","shasum":"3450b0adf38f4878a255d5e21b35fb995beff20b","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-0.0.4-a.tgz","fileCount":9,"unpackedSize":29245,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJelvSsCRA9TVsSAnZWagAAya4QAKR8S7mEKBTTGL18Icrs\n6frUzVuKZnFNjiB0LXMQQ8dCsicTSAB/04jUS2rXGO5reVNIOSWJa3G0zuLc\nMxBoBbQFGZI2WmTzQ/vpcoAV6wT0X1D1hcR0Aub3JNR+0z0YYWQsc+sYHbZe\n42Yqid+5NsLTIw/5hCKTwiwN8AWTQ4FXhSWiuJppp82VqAOjswRfFHmPU9cp\nOoGp7Htf7u3CCVTvxQXJEHYhQH2hD/Tej9NJzPBBHlkIZ3mWKcnVs80W/bMR\nnso+G0c7GO9JOhWM+5WsstheYBNXofEe2iKwOF2pbjJE7QB0aTiPbCCZXHsZ\n1I6165nw6Ru4Ay1cMtvbJeGgyrKZQEDY5fXQZvvgaW/WdTPfCVfbkovsQ/Hb\nwzKmak8mHhVn8+VGi6dSB1iW0jRRf1E6QxwGhVcSJOPu9749IhCY1G2+zKRY\nW2x09t3v2jFGk4TgT6HdLDj2XwmrbFkeSmvV47vudQRtR28gvlrcCg6WP6Eh\naD8Si1VKbTuCJGjRbUFq0PLBbkz7UVFMY8DQHMW1v9ZCHX+n1mFma8bIfMR5\nuS16vtVFytygGPqRKqQOQRJCIPj5KNIahAuWTCk4sh0UZOLcad5/pY2WOF+P\nBNDZgapBIfk3C299q7puztS8MknvtPkW04Vu1rftDDjJMbexNkY2gSzc27iJ\n/59v\r\n=fOGx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChxlkGvjETXDnItj47u0LVjGg+Ja8iUzZxLPnvd8ZA6wIhAJMi+fsoFQTgN/xxdwNz35IKpvMzEhODhMUC0KwAE4T9"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_0.0.4-a_1586951340349_0.133673346060331"},"_hasShrinkwrap":false},"1.0.0-b":{"name":"thingsboard_api","version":"1.0.0-b","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"21183cb1301faee76417a15f3aeaa7213324b00f","_id":"thingsboard_api@1.0.0-b","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-a51iQZe3IRWyP6BovjeSAFb18jlGrG3YslCqynSKbrUR4cs1vL497Ptn6Q8FbIAK4k3xCKPBbilMNZfz2SQdeQ==","shasum":"8d0b0992890734e5f1e002629bc303705d20dbe7","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.0-b.tgz","fileCount":9,"unpackedSize":33397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJelw6XCRA9TVsSAnZWagAAgOwQAKIfwgd+QOhBn8tF5fnG\nFd6+l04+8wm4lYODqyx/RADxw80PlrBnSoMYJ1p/eANyAk1q5BDJp6KA+mIe\nZmyeNbhWZpiqahCJOule+Y26R+q564YfWL36OJ6HjyYRLa7K3lEE2d1OO9kt\nhwOX9B63DTFWgDfhVB6O79kY5ARMFU+AsKIGHSzM2WnJu9vpBvFHl5y1rDfV\nBWNS9JCnxeEOFrPTEymSKy4CTeqFOQPEaZWEDmka2u+XH38MjX31AqlalqJ3\n0a0exlffEhxgl/hZLbtcXE8BkAYtOOKoHJCCWffhXhOB7sfysUY6ntqlHLfM\nt+N/gCDX2NKaWdWZRob6n9hqudsJniv27BUu8GbzOd43oEZ+Csv5U6VE9psj\nB4bigwWSOSc7fyfj8A84vkTw+1UgoVAge/bFo9lQveKIglCkI+bSCxCf+S2C\nBkt6znUaYn1fhD7MgjAg0Wqt/LO62Rkt45yzok65a7npJY99iEERG6Qq6aU/\n42ibjPmbpmgH+6gD+i4anutM5sNmrhVbrehvFlmqghyeeoFjlN9513iPYYwo\nsK2/KUTaHgxPMZK5MbBW+tulQMQ9XZZDlMRjWhwNLINnW1RtBnK56emL+VQa\nyggljry2L1HrRcrKaxhqYo+YIug5QoCELsajch1YfvUJGB4G0XBHBBeeoP/k\n4qHQ\r\n=WYDQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUovNqd8ZDxBD9kPi1HwtzAjJwr+sK3gjlQlCKC2w5wAiEA/lwZMtc3tJb4CY8eXJF04DGhMzpX2ZT+Fr0HUNTtGLs="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.0-b_1586957974480_0.18659262473128457"},"_hasShrinkwrap":false},"1.0.0":{"name":"thingsboard_api","version":"1.0.0","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"41503d72fbebe538ed2a569c234ecd7e7469bb7d","_id":"thingsboard_api@1.0.0","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-DycdLcF8VuxKMUn14wS2xKCidaheeJny6aDTMkCw3hwevY7Zt1kF+kDrnXsm3EAzIDpC2r/dNz+W0UsMqgz9LQ==","shasum":"ed4c0ff607c9b1f08ba32d2b3d94d538631f41f9","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.0.tgz","fileCount":9,"unpackedSize":33330,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJelxF9CRA9TVsSAnZWagAA2woP/0brYfBxIoa8fMWdvvI0\nNCBBD45ScOAUUE5yYuK3qqbFE5kuLaPWEb544TJVKh22qXVlQ0Vd9yYDJWJd\nFprWf/9lInui/oGefuHzhS47m279MQor2MenTak+Sw/3gGiAMAPGKPIgn0X5\n1qgAQjgQen/eDoxFJHtE/7r4F7QhQCCTWsf6ji7hzqyaGB/MMffINDWGv2DE\njC1z6VhUpXgkvMv4MGX3BxTOtz4f+Be5Ef7kHjofaIUVlAQg9dyLgpttdzKs\nZt+7fMpks9Avjcil/Zu4L6jvcDItpupzbHRgzD3nh9/lG9mzShp9gJdPwHDb\ntENTesCxWw9Cw2XU2Arw5Nd0k88eWugnvCs1OKfSzzw20B2XRX3NoQ+v8xt6\nj+o5QHPhb0LqlTKB5FPN1zbZNRgqugzbIoZDA8P+NnXNjeInMr5tY9QW8VTo\nlk8OuqBuvwnp5AO4Vv8hy5ikhwJhnVCz6rcnbuDJDL9Mcml8ntHNOiG8Wtzm\nSaLJQD81TS2Gm+fFjNyVtZHDMTsy8SRDyuXhzP9+3RZ9WsbzmBDOiOyRBldE\nxtbfEkaBs6WpAtIt7h426tz1z2sz9Scmo4De/YcJxH6u6DTA3ddAwRlOK/iK\nGUagDUoWJ8nFbzzM3owjVJE88FyiWTaAYbZJQchfQMR9eXT9wkA2HcVxbhCr\nTVRr\r\n=HKBm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB823mHqP9x2KGuoWe+kmvTLvQzZ7WZp2RiP+2ZP9HrCAiBG6r7QjblNFT3PtPtnupy0MpVocOyosYiMsx3s+TPkBg=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.0_1586958716942_0.20464442734611588"},"_hasShrinkwrap":false},"1.0.1":{"name":"thingsboard_api","version":"1.0.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"8f3d83a8e5a150427339580848e3fc0ea56f4d77","_id":"thingsboard_api@1.0.1","_nodeVersion":"10.15.2","_npmVersion":"6.14.3","dist":{"integrity":"sha512-+Tr94EcRH2mJSFUG8Evl2vxce7bAfMHKQFJCahq0Vkp80y6B9e1KkyAGbWPQx7FaKvdIshs5SvECVH4m6XeU1Q==","shasum":"80af0501634061968328117f7ed2b5daf2c758a0","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.1.tgz","fileCount":11,"unpackedSize":49385,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJensE7CRA9TVsSAnZWagAA1hAP/247aZILSAfYyJnqPPYy\nAtQhlB1zvD1QgcwVsrPypC8pFhcQz2QARcU06q8PBhbsr13n4Dt76SfdiLoP\nZNicddiWigyO1GC4cD2a/vmVAcXOY1wA5Cf29mRRi/ftmDz6HVsedbqzbWbA\noEnOxIdbJd4qE0NBzSG2XNMvAOoe1VowwMgt+9WzXKLhq3879q263W2ijlxh\nlWyWJLKcheOd5Sl6pfR+ZDSM90m9LEBvlE4nhD8Ql3/EzAuBQnbmWZVx9DHe\nfpZa8EYQ06h1U+IlN4q373CzbomYGO6V3SiAFqd7t6MTUT9kXa+lJQauwIj6\negJHN6ZzU14jYqvCdcQclKOfwvbiTXRVs/UtgYo4b64HYKG3bxDhyE3x4HUe\nu8lT+/7MA6Lv+Sw8tTpxIxIeHAowyU36prn/MlukX0s2J63nPgGODSkfGCyL\nZ6cyQGFL7HyvgRBAw2r4r3T5x1rqsbrSW6KtFd/gQ4R+CfTPAVmOFjVga3xj\n+fKN3dICsXLP1mme9qkww86bukDyuWKwKgfCdXehRW8tygNJb0Vh9cfFnPe5\n9mYuPRTEc5UxDD23Q4uX1eFze1WCJv11iaLpr27ydSfN1AQtOsMcnZRM0rY3\nwYYbiBpRXrYA5NghK5WCVeN3WimAwj07ET70Q31rpiiciLWbriYEJkn2lw6Q\nGUN5\r\n=lwWs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwggwqVcZDnfa7FXpP2rfjYDS8cYDwZB0MdjknqTvfuwIhANNxV6tLKVZfnKfc0XvN40yO3Yd9DaOVinnIX4d5a2nL"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.1_1587462459486_0.45815067483885197"},"_hasShrinkwrap":false},"1.0.2":{"name":"thingsboard_api","version":"1.0.2","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"a6b4bb0e53e4fad770357988200805b7de24f19d","_id":"thingsboard_api@1.0.2","_nodeVersion":"14.0.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-9giLWc/N1Gc80nClfBa09I2+QXSNs/XYZt1g/GJLAJ0S4eUb7FWzM6OwLK8eGwllb5qGjscWRej07oat7fEFtw==","shasum":"2aaecabe80186b74508249c94b0c8c991a204636","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.2.tgz","fileCount":14,"unpackedSize":51998,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeoAYwCRA9TVsSAnZWagAAG24QAJsLpEPbAl3EiauySI5g\nL2hxH2/uJiXnBxaJbA6RmFbSf66NqUGu8NaLhLtKnfoYqgPLv6RCnA67Wvl7\nuGKnKdfeZRNtwoxybrWazU7DcbH81eXyCm+4L5aLBSwQYUWU7ifTaYufvbob\nB4C0cHr7OH6kw7sXZpyWVUFiWM+fhu7Q7fonqQN4jC0TbtE4llkL8Kftt5Rl\nV/ujvF9uoCNd/QnpIrrhCQ2dyZxsTBJ+AohzwTAZ7VL0MKbIjXlhgdakhTz+\nIjDJZfF/n6SN+GcYxk5s2PFRb6gLxk0DbuE4dT3kjujw16WbrKTAqlJTQ5Ex\nu94ozbPpF7VUIaPnciMtpqCmkHDHbAECZb56QO77tOBFq23fgmwbZZJbu2wi\nhYus7A60gkb9EeV22FP2BVx1LokcZKeY722NGQo4wxlhYZRPZWC+v+jQ/nvI\n+bx1cH+8bHOzBRDDxidCKws6ZgGik+MjxLX4+At6N0pa3fa97NaRi0GjxI8a\ngpzQvSFagmSFGAfgkDKrlxm3lO5UJUO0kheMqO5+48jFUYAssfnY9c3xzIVd\ntHnK3JHPf7BVpouUjpYcUXltAOK74DLCk/Z/hv1P1ctV0i9yG273zN5dnoGd\nJB1F0q7jtoiCBNZ1mzejA8J8l78DBQFN7RzsSUuGLAH4yMpd8Go2bD11fMku\nq66x\r\n=Z2qM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDq0T0EJ5oGjHC7ZIEXw/4NqqeAiMEqX1HYlJQzlhI+iwIgDkJJWgBjFR9ztz/Vo9b5Q58MjEfnUuiZsX00dINLaiI="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.2_1587545647907_0.6370353251304144"},"_hasShrinkwrap":false},"1.0.4":{"name":"thingsboard_api","version":"1.0.4","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"c9a4c4df32441c721f3f61edef30c1c165c30792","_id":"thingsboard_api@1.0.4","_nodeVersion":"14.0.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-23BKfdQewfpEGCAOnOWU7/zmaWgx6kg9m7alcMm58wxmkEBAaMs1ZojHSe5Mvuq6riLiAZyz+es7KvPYpHGWXQ==","shasum":"b9b81db39b065409be0610c8b4b3a4a1bd3113bf","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4.tgz","fileCount":14,"unpackedSize":51589,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeoXcxCRA9TVsSAnZWagAA9HsQAJJXBKSMu/0IIGfPZJ5b\nROOrYZR/f5NpPbQv48eAIIhaqzIhJ864xaG3WnpSPFp2AYpeQoTeDVTL64+D\ncDUSxL2R5oj09AM4PxaOm4zhesKuK/dJA80NC3+TVjj4Urrxo1v3fT/+E0HX\nqO6vjLAtxKG1a3THfxVQxplpwKFmWNU0zhZZHxaYLZh0TODd+qyNDLgXWzPh\nVrefbj+k3w4FmBmn/lUeYjb+e8911LhWySva8BqTuU/GQJSv8UQLMFjkEq5I\n1da63o/xorK3Jyzrr5Ay4beF1T6pxwURI3RcUQxz954NnuoAwZd3GkHqfP5D\ncbiq51bZWYSwAPJ2Xh6T5lk5/Dc4BGLybjxczHZW7/Cz8RU+/AVA3HKNDjmw\nexEeEPSZKHBb83Rmlw/ga3TYu1mV13cnOftUxp4/NQD4NTf8/ebIRm1jmOOW\n5F1FOpxim1jVrTXOkVQfOzOCbpbHR+Zvty8FbseZj8AaYdfwMEZdvfzfbZzo\nLrqEeuJsXQdBGCeAIZGuLAtkNOwsdr3ZSs/hivmGUyDCkjyV8UULHWILdJNT\n54eWk4gIO6D/YJ7ICofgABr5t7M9LPRZ9ykqENWNmqj1pA2xU/FBg2+07XTV\nAHC3DQvbq8bVZI3SDumJ2UcqLPPtx/OGJ9/iz+5Fi2iWgSGzuN5Mr1yKYQTt\n1Sv/\r\n=DGSo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMPsylFTCCmfQ5WnTftzShMRPuYLSMib/9hOCaxyW6PgIgYd/KSv6CiIqTVdB62ocxbb2LVOvw/K70Kkh0/41cHaI="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4_1587640113188_0.1788069123871121"},"_hasShrinkwrap":false},"1.0.4-beta.1":{"name":"thingsboard_api","version":"1.0.4-beta.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\r\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\r\nPromise like implementation\r\n\r\n## Git flow description\r\n - Push to `master` only from `testing` branch! \r\n - `Master` stores stable version!\r\n - Firstly, code pushes to `Personal` branches!\r\n - Only after personal tests merges to `Testing`!\r\n\r\n## Update repo status:\r\n* [x]  Update error handling in [postgres.js](./postgres.js)\r\n* [x]  Update error handling in [TB/get.js](./TB/get.js)\r\n* [x]  Update error handling in [TB/delete.js](./TB/delete.js)\r\n* [x]  Update error handling in [TB/push.js](./TB/push.js)\r\n* [ ]  Update [README.md](./README.md) due to new error processing\r\n    * [x]  Update postgres description\r\n    * [ ]  Update REST API description\r\n\r\n___\r\n\r\n<!-- TOC -->\r\n\r\n- [Installation](#installation)\r\n- [Usage](#usage)\r\n- [Error handling](#error-handling)\r\n- [List REST API Functions](#listrestapifunctions)\r\n    - [GET](#get)\r\n        - [createConnection](#createconnection)\r\n        - [get.objectID](#getobjectid)\r\n        - [get.objectIDandKeys](#getobjectidandkeys)\r\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\r\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\r\n    - [PUSH](#push)\r\n        - [push.createRelation](#pushcreaterelation)\r\n        - [push.pushAttributes](#pushpushattributes)\r\n        - [push.createEntity](#pushcreateentity)\r\n    - [DELETE](#delete)\r\n        - [delete.deleteEntity](#deletedeleteentity)\r\n        - [delete.deleteChilds](#deletedeletechilds)\r\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\r\n- [List Postgres Functions](#listpostgresfunctions)\r\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\r\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\r\n- [List of unclassified functions](#list-of-unclassified-functions)\r\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\r\n\r\n\r\n<!-- /TOC -->\r\n\r\n## Installation\r\n```bash\r\nnpm i thingsboard_api\r\n```\r\n\r\n## Usage\r\n - Better use environment variable instead of costansts or hardcoded values!\r\n\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    PG_HOST:      'ip_to_Postgres',   //no defaults!\r\n    PG_PORT:      'port_to_Postgres', //no defaults!\r\n    PG_USERNAME:  'loginPostgres',    //no defaults!\r\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n\r\nasync function main(){\r\n    await TB.createConnection(options) //\r\n    const objectId = await TB.get.objectID('entity_name','asset'))\r\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\r\n}\r\n\r\nmain()\r\n\r\n```\r\n## Error handling\r\n \r\n- The most of functions support `error` and `message` keys in result object! (See update status!)\r\n- Error description is in `message` key!\r\n- Example:\r\n```js\r\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\r\n    if (result.error){\r\n        return { \"error\": true, \"message\": result.message }\r\n    }\r\n```\r\n\r\n# List REST API Functions\r\n\r\n## GET\r\n\r\n### createConnection() \r\n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\r\n\r\nList of options:\r\n``` js\r\nconst options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    PG_HOST:      'ip_to_Postgres',   //no defaults!\r\n    PG_PORT:      'port_to_Postgres', //no defaults!\r\n    PG_USERNAME:  'loginPostgres',    //no defaults!\r\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n```\r\n\r\nUsage\r\n```js\r\nconst TB = require('thingsboard_api');\r\nawait TB.createConnection(options)\r\n```\r\n\r\n\r\n\r\n### get.objectID()\r\n### Promise get ID of an object by its name and type\r\n\r\nList of options:\r\n```json\r\n(name, entity_view) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\r\n```\r\nResult\r\n```js\r\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\r\n```\r\n\r\n### get.objectIDandKeys()\r\n### Promise get ID and attributes of an object by its name,type and keys\r\n\r\nList of options:\r\n```json\r\n(name, type, keys) //string. for keys can be array\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\r\n\r\nlet keys = ['key1','key2','key3']\r\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\r\n```\r\nResult\r\n```js\r\n{\r\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \r\n    name: \"myObject\", \r\n    type: \"asset\",\r\n    key1: \"value1\",\r\n    key2: \"value2\",\r\n}\r\n```\r\n\r\n\r\n\r\n\r\n### get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n____\r\n\r\n## PUSH\r\n\r\n### push.createRelation()\r\n\r\nList of options:\r\n```json\r\n(name, entity_view, parentName, parentType) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n____\r\n\r\n### push.pushAttributes()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,attributes) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n___\r\n\r\n### push.createEntity()\r\n\r\nList of options:\r\n```json\r\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\r\n// attributes - can be null, if no attributes to push\r\n// parentName,parentType,parentKeys,parentRelation - can be null\r\n// so no relation or cloning attributes will be done\r\n//\r\n// parentKeys - array of name of keys to clone from parent to new Entity\r\n// parentRelation - boolean. If true - will call createRelation() to parentName\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\r\n\r\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\r\n```\r\nResult\r\n```js\r\nid || false //if no relation and parentClonning\r\n\r\n{\r\n    id: id,\r\n    statusAttributes: true || false,\r\n    statusRelation: true || false,\r\n}\r\n```\r\n\r\n\r\n## DELETE\r\n\r\n### delete.deleteEntity()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,flagDeleteChilds) \r\n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n___\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nList of options:\r\n```json\r\n(type,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n___\r\n### delete.deleteEntitiesByType()\r\n\r\nWill delete entities, whose has relation to 'name' in 3 level depth max\r\nList of options:\r\n```json\r\n(name,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n\r\n# List Postgres Functions\r\n\r\n### postgres.get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\n- List of options:\r\n    - type: `String`\r\n    - entity_type: `String`\r\n\r\n- Description:\r\n    - type: custom type (`Локомотив`, and etc.)\r\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\r\n\r\n\r\n - Usage\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\r\n```\r\n- Error handling:\r\n    - In case of error, target variable will have two options:\r\n        - `error`\r\n        - `message`\r\n    \r\n```js\r\nallObjectsID = {\r\n    \"error\": true,\r\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\r\n}\r\n```\r\n\r\nSuccesfull output example:\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n### postgres.get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\n - List of options:\r\n    - type: `String`\r\n    - entity_type: `String`\r\n    - keys: `null` by default, `array of string` optionally!\r\n\r\n- Description:\r\n    - If keys are `null`, `all` possible attributes will be in response!\r\n    - type: custom type (`Локомотив`, and etc.)\r\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\r\n\r\n - Usage\r\n\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst keys = ['key1','key2']\r\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\r\n```\r\n\r\n- Error handling:\r\n    - In case of error, target variable will have two options:\r\n        - `error`\r\n        - `message`\r\n    \r\n```js\r\nallObjectsIDandAttrs = {\r\n    \"error\": true,\r\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\r\n}\r\n```\r\n\r\n - Succesfull output example:\r\n```js\r\n[\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\r\n\r\n#### Information\r\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\r\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\r\n\r\n - For getting \r\n\r\n##### Steps: \r\n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\r\n\r\n##### List of options:\r\n - entity_id - `string`\r\n - attributeKeys - `array`  \r\n\r\n##### Response:\r\n```js\r\n[\r\n...,\r\n {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'attribute_test_april2020',\r\n    bool_v: false,\r\n    str_v: '',\r\n    long_v: 0,\r\n    dbl_v: 0,\r\n    last_update_ts: null\r\n  },\r\n...\r\n]\r\n```\r\n\r\n____\r\n\r\n\r\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\r\n\r\n##### List of options:\r\n - thingsboard_uuid - `string`\r\n\r\n#### Response:\r\n - postres id - `string`\r\n\r\n\r\n___\r\n\r\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\r\n\r\n##### Information:\r\n - Column names are define in object\r\n\r\n##### List of options:\r\n - dataToWrite - `array of objects`\r\n```js\r\n[\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'test_attr_key',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n]\r\n```\r\n\r\n##### Response:\r\n - To check if data was written to db `compare insert count with response count`\r\n\r\n___\r\n\r\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\r\n```\r\n - entity_type\r\n - attribute_type\r\n - attribute_key\r\n - bool_v\r\n - str_v\r\n - long_v\r\n - dbl_v\r\n - last_update_ts\r\n```\r\n\r\n##### List of options:\r\n - attributeObj - `object`\r\n```js\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  }\r\n```\r\n##### Response:\r\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\r\n```js\r\n[ count: 1, command: 'UPDATE' ]\r\n```\r\n___\r\n\r\n# List of unclassified functions\r\n\r\n### extendChildAttrs (options) - Extend child attributes by parent attributes\r\n\r\n### Information:\r\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\r\n - Set necessary attribute keys in `options.attributeKeys`\r\n\r\n##### List of options:\r\n - options - `object`\r\n```js\r\n{\r\n    \"parent_id\": \"some_thingsboard_id\",\r\n    \"child_id\": \"some_thingsboard_id\",\r\n    \"child_type\": \"DEVICE\",\r\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\r\n    \"updateAttrs\": false,\r\n}\r\n```\r\n##### Steps:\r\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\r\n - For updating child attributes using parent data, set `updateAttrs` to `true`\r\n\r\n##### Reponse:\r\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"ee31cbd30d2a2ad787f24f69d4250474c1ce99fc","_id":"thingsboard_api@1.0.4-beta.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-IKBy4TfEMGt9bXMAEnAPZZclglzCDC5FWM4wtQl5R5umxfA1MiuNumAiqxSEw2oiyYcabYHzBNByBmO3R87IEw==","shasum":"1c6bdf42f32058d7829f4a962801585cafbd3454","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.1.tgz","fileCount":13,"unpackedSize":65928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqR2iCRA9TVsSAnZWagAAJogP/imrp1aBne3etyIrCda5\ncYMBCi8YExX6V/2rvMBVzZKiJQPOx+qk7iJBsgPWOU7UH+6B02TB1LTI8ybM\nASMX6XY/JkTtmVNjT7LMUoVRG6L3FFxQ8YiYagzDMRUkRe3R2IPcRCKJuq8n\nIuJXodVrKsSIIa8gPLRynK/2g4Hlx1sZwhFN+l3Vag+AirwajpESzNjJ87tX\njjDRcbDTq2wZIZ7o9+X/QSHlEAFV7GEaNTquc0AJeq2uUbtkA3BD66HqNMWW\nGJvFOuLQ5ZhB4eCpjCrfhbVoDpyEuB+0tpPXHRzkLJb+Moz4EUSPhPGZs/44\nPXUtZHwGVP/QFyuqbIwlP1vXKbkw9g/musr3BzKJfHMCYcWOBYW1INjwLINb\nbqqv7KCxgLwKEa/uZb8Zv4TnKCaUp9I2HZ1axaTmCiOUy5WInvrYY0L1Yxlp\n5SsWcznTJfmRut1VprLaDtfoPpdP53NLaf/RzP9Tqarx+rJ1EZHH+i1cFSfc\nCxl08m69sb+Biunbo2boHX1Cbj+CiZALKuvVNLLAeRRC7PHOZ5904g69ipsR\n289g6sTwnjA9UZDwA9Qk6Cs3BA/eVPhy/Vga5VOoc/JTcbl0bPM+43j7qlSw\ntPOfzy6D9ee6GC3PQo/l8/e3loy9m9BQIC8SfsGWYLpX8VW6gbbAsXvLooHg\n9bA8\r\n=pC44\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMU76UwvrHHsFTJQrIvGrN3Xp4Su1c3GI7pYmZz5qovQIhAIR2iCcToL6nFCDDCgMBhMAlfUip+gF9bIFgp2bgn8q8"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.1_1588141473611_0.11924155183049456"},"_hasShrinkwrap":false},"1.0.4-aivanov.1":{"name":"thingsboard_api","version":"1.0.4-aivanov.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\r\nBasic auth and get functions for Thingsboard REST API && Thingsboard's Postgres DB.\r\nPromise like implementation\r\n\r\n\r\n\r\n<!-- TOC -->\r\n\r\n- [Installation](#installation)\r\n- [Usage](#usage)\r\n- [List REST API Functions](#listrestapifunctions)\r\n    - [GET](#get)\r\n        - [createConnection](#createconnection)\r\n        - [get.objectID](#getobjectid)\r\n        - [get.objectIDandKeys](#getobjectidandkeys)\r\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\r\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\r\n    - [PUSH](#push)\r\n        - [push.createRelation](#pushcreaterelation)\r\n        - [push.pushAttributes](#pushpushattributes)\r\n        - [push.createEntity](#pushcreateentity)\r\n    - [DELETE](#delete)\r\n        - [delete.deleteEntity](#deletedeleteentity)\r\n        - [delete.deleteChilds](#deletedeletechilds)\r\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\r\n- [List Postgres Functions](#listpostgresfunctions)\r\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\r\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\r\n- [List of unclassified functions](#listofunclassifiedfunctions)\r\n    - [Extend child attributes by parent](#extendchildattrs)\r\n\r\n\r\n<!-- /TOC -->\r\n\r\n## Installation\r\n```bash\r\nnpm i thingsboard_api\r\n```\r\n\r\n## Usage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    POSTGRES_HOST:      'ip_to_Postgres',   //no defaults!\r\n    POSTGRES_PORT:      'port_to_Postgres', //no defaults!\r\n    POSTGRES_USERNAME:  'loginPostgres',    //no defaults!\r\n    POSTGRES_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n\r\nasync function main(){\r\n    await TB.createConnection(options) //\r\n    console.log( await TB.get.objectID('entity_name','asset'))\r\n    console.log( await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\r\n}\r\n\r\nmain()\r\n\r\n```\r\n\r\n\r\n# List REST API Functions\r\n\r\n## GET\r\n\r\n### createConnection() \r\n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\r\n\r\nList of options:\r\n``` js\r\noptions = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    POSTGRES_HOST:      'ip_to_Postgres',   //no defaults!\r\n    POSTGRES_PORT:      'port_to_Postgres', //no defaults!\r\n    POSTGRES_USERNAME:  'loginPostgres',    //no defaults!\r\n    POSTGRES_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nawait TB.createConnection(options)\r\n```\r\n\r\n\r\n\r\n### get.objectID()\r\n### Promise get ID of an object by its name and type\r\n\r\nList of options:\r\n```json\r\n(name, entity_view) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\r\n```\r\nResult\r\n```js\r\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\r\n```\r\n\r\n### get.objectIDandKeys()\r\n### Promise get ID and attributes of an object by its name,type and keys\r\n\r\nList of options:\r\n```json\r\n(name, type, keys) //string. for keys can be array\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\r\n\r\nlet keys = ['key1','key2','key3']\r\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\r\n```\r\nResult\r\n```js\r\n{\r\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \r\n    name: \"myObject\", \r\n    type: \"asset\",\r\n    key1: \"value1\",\r\n    key2: \"value2\",\r\n}\r\n```\r\n\r\n\r\n\r\n\r\n### get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n\r\n## PUSH\r\n\r\n### push.createRelation()\r\n\r\nList of options:\r\n```json\r\n(name, entity_view, parentName, parentType) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### push.pushAttributes()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,attributes) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### push.createEntity()\r\n\r\nList of options:\r\n```json\r\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\r\n// attributes - can be null, if no attributes to push\r\n// parentName,parentType,parentKeys,parentRelation - can be null\r\n// so no relation or cloning attributes will be done\r\n//\r\n// parentKeys - array of name of keys to clone from parent to new Entity\r\n// parentRelation - boolean. If true - will call createRelation() to parentName\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\r\n\r\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\r\n```\r\nResult\r\n```js\r\nid || false //if no relation and parentClonning\r\n\r\n{\r\n    id: id,\r\n    statusAttributes: true || false,\r\n    statusRelation: true || false,\r\n}\r\n```\r\n\r\n\r\n## DELETE\r\n\r\n### delete.deleteEntity()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,flagDeleteChilds) \r\n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nList of options:\r\n```json\r\n(type,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nWill delete entities, whose has relation to 'name' in 3 level depth max\r\nList of options:\r\n```json\r\n(name,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n# List Postgres Functions\r\n\r\n### postgres.get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### postgres.get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\r\n\r\n#### Information\r\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\r\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\r\n\r\n - For getting \r\n\r\n##### Steps: \r\n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\r\n\r\n##### List of options:\r\n - entity_id - `string`\r\n - attributeKeys - `array`  \r\n\r\n##### Response:\r\n```js\r\n[\r\n...,\r\n {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'attribute_test_april2020',\r\n    bool_v: false,\r\n    str_v: '',\r\n    long_v: 0,\r\n    dbl_v: 0,\r\n    last_update_ts: null\r\n  },\r\n...\r\n]\r\n```\r\n\r\n____\r\n\r\n\r\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\r\n\r\n##### List of options:\r\n - thingsboard_uuid - `string`\r\n\r\n#### Response:\r\n - postres id - `string`\r\n\r\n\r\n___\r\n\r\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\r\n\r\n##### Information:\r\n - Column names are define in object\r\n\r\n##### List of options:\r\n - dataToWrite - `array of objects`\r\n```js\r\n[\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'test_attr_key',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n]\r\n```\r\n\r\n##### Response:\r\n - To check if data was written to db `compare insert count with response count`\r\n\r\n___\r\n\r\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\r\n```\r\n - entity_type\r\n - attribute_type\r\n - attribute_key\r\n - bool_v\r\n - str_v\r\n - long_v\r\n - dbl_v\r\n - last_update_ts\r\n```\r\n\r\n##### List of options:\r\n - attributeObj - `object`\r\n```js\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  }\r\n```\r\n##### Response:\r\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\r\n```js\r\n[ count: 1, command: 'UPDATE' ]\r\n```\r\n___\r\n\r\n# List of unclassified functions\r\n\r\n### extendChildAttrs (options) - Extend child attributes by parent attributes\r\n\r\n### Information:\r\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\r\n - Set necessary attribute keys in `options.attributeKeys`\r\n\r\n##### List of options:\r\n - options - `object`\r\n```js\r\n{\r\n    \"parent_id\": \"some_thingsboard_id\",\r\n    \"child_id\": \"some_thingsboard_id\",\r\n    \"child_type\": \"DEVICE\",\r\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\r\n    \"updateAttrs\": false,\r\n}\r\n```\r\n##### Steps:\r\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\r\n - For updating child attributes using parent data, set `updateAttrs` to `true`\r\n\r\n##### Reponse:\r\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"daf56a8d093fee065a4315449a4e8f595d115658","_id":"thingsboard_api@1.0.4-aivanov.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-gtbljv2RLGASIsmE25QvkkqLtfNaCB2CL+mTO5iSV0Q8j5lbKdvy/rpaJOs7wT23idwvtQSsKR9vWu/8KRB1+A==","shasum":"457f6fad22b9934eec88b4fd6bb08f94a4a61ca3","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-aivanov.1.tgz","fileCount":14,"unpackedSize":51307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqSHMCRA9TVsSAnZWagAAZI4QAKCU71vbmNzaF9m7IoBr\nx674t4fJM7hdf70CjRzHz9vMKQUHxXMCpoI8CNUoBvmuPld5AkOSFkhCjk8z\nLyhB51CENrq8nsMtGGuA5wf/oKILmn687Zl4wz85yndxlAYNeS+qgOfsujlb\nwhZvsKBeWLyvrzV+BaHslMVWoxyPZ6xWtC1L0Rm+18Q/grn0zKbFpGKZMEBe\nTyKvoC2NCxLAuZ8i3AmLEab1y6XkNC3tPGAzF4sFw09Gvsl7l/RDvoQGnn1C\n4BYN8SzmFqMPrwxSlE8bvCrlYpZ3xUCYCdIku9r0XF6VtGlo5cwMoe9wrhkx\n5/l9+zWEz72jPg/cxVTgWUgqB0f+DaXrKVozjh2AZJ+/6wOcOpuUMq1dkgSL\nkwqi1BEAeq44hx2DkEGjIKhDSLuNNHr7EH4qgvZOrvVTdUsijAAt4mkO+nuR\nxM2wFaAFKLxLDi/4IvJesTLU2gZ30IwOkBXF0Kc/Z4KEB+5/s3QUnCBd9QsT\n1+NeYydgQhJn0H5K0UPk05a2LRkybLZJ7Bpei4uxEHoBwJ7UIx1bdQl4B1zq\no1mFXfg1zIsL5B/A4AXy8HcJWnmNsD+8y44kQ+lciAMMWfhi15+VUVUntywU\nEjKTia0YWfc+GPM12lqtT52KvZKgx98kGXZn6KPqFCJcP7vi2B2IbL3ZV6ad\niyAz\r\n=2+Bg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCprRWiaIvN9ogDax7mNtNazvee5GCpYRSEpqEEQP4xjAIhAMuCWiJ6CmpNFX0V4V15u3kXQdPNuwNL0o9A+fxSlXL8"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-aivanov.1_1588142540227_0.1195935579760612"},"_hasShrinkwrap":false},"1.0.4-aivanov.2":{"name":"thingsboard_api","version":"1.0.4-aivanov.2","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\r\nBasic auth and get functions for Thingsboard REST API && Thingsboard's Postgres DB.\r\nPromise like implementation\r\n\r\n\r\n\r\n<!-- TOC -->\r\n\r\n- [Installation](#installation)\r\n- [Usage](#usage)\r\n- [List REST API Functions](#listrestapifunctions)\r\n    - [GET](#get)\r\n        - [createConnection](#createconnection)\r\n        - [get.objectID](#getobjectid)\r\n        - [get.objectIDandKeys](#getobjectidandkeys)\r\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\r\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\r\n    - [PUSH](#push)\r\n        - [push.createRelation](#pushcreaterelation)\r\n        - [push.pushAttributes](#pushpushattributes)\r\n        - [push.createEntity](#pushcreateentity)\r\n    - [DELETE](#delete)\r\n        - [delete.deleteEntity](#deletedeleteentity)\r\n        - [delete.deleteChilds](#deletedeletechilds)\r\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\r\n- [List Postgres Functions](#listpostgresfunctions)\r\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\r\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\r\n- [List of unclassified functions](#listofunclassifiedfunctions)\r\n    - [Extend child attributes by parent](#extendchildattrs)\r\n\r\n\r\n<!-- /TOC -->\r\n\r\n## Installation\r\n```bash\r\nnpm i thingsboard_api\r\n```\r\n\r\n## Usage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    POSTGRES_HOST:      'ip_to_Postgres',   //no defaults!\r\n    POSTGRES_PORT:      'port_to_Postgres', //no defaults!\r\n    POSTGRES_USERNAME:  'loginPostgres',    //no defaults!\r\n    POSTGRES_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n\r\nasync function main(){\r\n    await TB.createConnection(options) //\r\n    console.log( await TB.get.objectID('entity_name','asset'))\r\n    console.log( await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\r\n}\r\n\r\nmain()\r\n\r\n```\r\n\r\n\r\n# List REST API Functions\r\n\r\n## GET\r\n\r\n### createConnection() \r\n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\r\n\r\nList of options:\r\n``` js\r\noptions = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    POSTGRES_HOST:      'ip_to_Postgres',   //no defaults!\r\n    POSTGRES_PORT:      'port_to_Postgres', //no defaults!\r\n    POSTGRES_USERNAME:  'loginPostgres',    //no defaults!\r\n    POSTGRES_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nawait TB.createConnection(options)\r\n```\r\n\r\n\r\n\r\n### get.objectID()\r\n### Promise get ID of an object by its name and type\r\n\r\nList of options:\r\n```json\r\n(name, entity_view) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\r\n```\r\nResult\r\n```js\r\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\r\n```\r\n\r\n### get.objectIDandKeys()\r\n### Promise get ID and attributes of an object by its name,type and keys\r\n\r\nList of options:\r\n```json\r\n(name, type, keys) //string. for keys can be array\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\r\n\r\nlet keys = ['key1','key2','key3']\r\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\r\n```\r\nResult\r\n```js\r\n{\r\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \r\n    name: \"myObject\", \r\n    type: \"asset\",\r\n    key1: \"value1\",\r\n    key2: \"value2\",\r\n}\r\n```\r\n\r\n\r\n\r\n\r\n### get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n\r\n## PUSH\r\n\r\n### push.createRelation()\r\n\r\nList of options:\r\n```json\r\n(name, entity_view, parentName, parentType) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### push.pushAttributes()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,attributes) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### push.createEntity()\r\n\r\nList of options:\r\n```json\r\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\r\n// attributes - can be null, if no attributes to push\r\n// parentName,parentType,parentKeys,parentRelation - can be null\r\n// so no relation or cloning attributes will be done\r\n//\r\n// parentKeys - array of name of keys to clone from parent to new Entity\r\n// parentRelation - boolean. If true - will call createRelation() to parentName\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\r\n\r\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\r\n```\r\nResult\r\n```js\r\nid || false //if no relation and parentClonning\r\n\r\n{\r\n    id: id,\r\n    statusAttributes: true || false,\r\n    statusRelation: true || false,\r\n}\r\n```\r\n\r\n\r\n## DELETE\r\n\r\n### delete.deleteEntity()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,flagDeleteChilds) \r\n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nList of options:\r\n```json\r\n(type,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nWill delete entities, whose has relation to 'name' in 3 level depth max\r\nList of options:\r\n```json\r\n(name,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\r\n```\r\nResult\r\n```js\r\ntrue || false\r\n```\r\n\r\n# List Postgres Functions\r\n\r\n### postgres.get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### postgres.get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\r\n\r\n#### Information\r\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\r\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\r\n\r\n - For getting \r\n\r\n##### Steps: \r\n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\r\n\r\n##### List of options:\r\n - entity_id - `string`\r\n - attributeKeys - `array`  \r\n\r\n##### Response:\r\n```js\r\n[\r\n...,\r\n {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'attribute_test_april2020',\r\n    bool_v: false,\r\n    str_v: '',\r\n    long_v: 0,\r\n    dbl_v: 0,\r\n    last_update_ts: null\r\n  },\r\n...\r\n]\r\n```\r\n\r\n____\r\n\r\n\r\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\r\n\r\n##### List of options:\r\n - thingsboard_uuid - `string`\r\n\r\n#### Response:\r\n - postres id - `string`\r\n\r\n\r\n___\r\n\r\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\r\n\r\n##### Information:\r\n - Column names are define in object\r\n\r\n##### List of options:\r\n - dataToWrite - `array of objects`\r\n```js\r\n[\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'test_attr_key',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n]\r\n```\r\n\r\n##### Response:\r\n - To check if data was written to db `compare insert count with response count`\r\n\r\n___\r\n\r\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\r\n```\r\n - entity_type\r\n - attribute_type\r\n - attribute_key\r\n - bool_v\r\n - str_v\r\n - long_v\r\n - dbl_v\r\n - last_update_ts\r\n```\r\n\r\n##### List of options:\r\n - attributeObj - `object`\r\n```js\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  }\r\n```\r\n##### Response:\r\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\r\n```js\r\n[ count: 1, command: 'UPDATE' ]\r\n```\r\n___\r\n\r\n# List of unclassified functions\r\n\r\n### extendChildAttrs (options) - Extend child attributes by parent attributes\r\n\r\n### Information:\r\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\r\n - Set necessary attribute keys in `options.attributeKeys`\r\n\r\n##### List of options:\r\n - options - `object`\r\n```js\r\n{\r\n    \"parent_id\": \"some_thingsboard_id\",\r\n    \"child_id\": \"some_thingsboard_id\",\r\n    \"child_type\": \"DEVICE\",\r\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\r\n    \"updateAttrs\": false,\r\n}\r\n```\r\n##### Steps:\r\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\r\n - For updating child attributes using parent data, set `updateAttrs` to `true`\r\n\r\n##### Reponse:\r\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"daf56a8d093fee065a4315449a4e8f595d115658","_id":"thingsboard_api@1.0.4-aivanov.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-y5zsDki63Y7qiR5sJwNwWLr9ShtgK942hWcoQa7NyfsgT1LM5X7OqiSzn9qPp5xckK5rKhoO0PsgyT3W6k1n/A==","shasum":"bd15835849e1dab108d5be21eabe95ffa3d7ffa1","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-aivanov.2.tgz","fileCount":14,"unpackedSize":51291,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqSMECRA9TVsSAnZWagAA30wP/A+1Mmd7Q4Kp9mIxIESY\n1mPlAiyiZ7Mzcv+JZyh8M31zRC0rQBest267TVcJwgc6RbuM3iWELEaySRsM\nf2hazqQm/J83EE+nG2QQY/T+9Pyi3iK5EGwLq0bkQAwDdRTzGaMXSWN40UJ4\nQDf1MYWrAvHuWgQj89L9e4+pdvrV/AtIQKGTfu/beX/Wp9gwb+e/3XMbs91l\nbHXCau3/gnJ2VgmRAGvxedTBMLALWX2QxBLC2OnCu2xF9DTnRCsDJ8G8IO7L\n/41Ofxqg+txoDDjc/ONce+KNbgtcl0Q0Jh0zQ1kuFVaWsWio4dX554ukpD9V\nMGnVEGd4rjQE20VSxxMX0WQqC2h1An5I0gQG7X5SfHLwuO2Vcht0TtbEV+4n\nKmvK3w1wSvZGhRSZHrvxItFutsuwLh2WQyecasXY3YwuvzKKNI5BFqz4ToHk\nRKqO9npNvJwzdI3EyGeHwqvHR0LwV1x4Xzw5KuzM5xMEXOhYTcb3GUFag3wd\nLoEFyI2tZC/9QBt6vRzcbS1b5isTV/t+CC0QUffDtj1hK+ZyPDAV62Jh+DQN\ngWmqH1+H+sU/Dd8LOTA2FBwVRFEh1nGH4zrgwSgRXPqhIdH2U6UsqteV+BLv\ncs5eCJ2tIUUo1HE4txnnEc4JncV7bajZ5SKeCpDk4k3gdT09TNPfB6NuPp3k\nqtkf\r\n=CGV9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKw0NCinY7BrRlofJE0veik7QqvLmywj38Rfui4a0X8AiEA23yFMIib054ThdJ/UES6meB4p7PE380ip4+fKngGkY4="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-aivanov.2_1588142852208_0.8931337744779893"},"_hasShrinkwrap":false},"1.0.5":{"name":"thingsboard_api","version":"1.0.5","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"02b6adbee86745b85713551a065f5c558b5a981c","_id":"thingsboard_api@1.0.5","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-z1i6/Yg6rqqJb7MtSrQz/Wd6fz8Cr8O9uz/UMY8INDaBPurzWuAyBx4bf9zaFAuTIvzuVE4T7CWIhynk5yRCMw==","shasum":"729ffd72723bea0ed3a9a9e587ae3ca1a5539833","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.5.tgz","fileCount":14,"unpackedSize":51326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJes9+dCRA9TVsSAnZWagAAzVMP/34uvy8kuCUl19Aj/+rQ\nZ9rIUyMP78oS3F5vrB6YeTC9HIpkSVznTTjEhQb/KdSTKbYLgNmRDykrtnpK\n4KCzXC9OiMASFRBfRS14MJVQrJxVCUV1TYKnmNBy+3MY8Eg0ehKmwr5s1rnc\nr1L/syLa/mT1SCb/yscnFbhEwaeOEN4uTduuSh2GLbl7Iu8GCWKj3VeKAD13\ngZbe0UGK1umz8fY6Cso706nIZXzp2PlL82w2eoCRErMn/2ZxAVsZ83ZRkc3X\nBRZJt19O33lSxJsDdvYaYVjfPcvFXijQrz/wccXMqvUISIn0UfftoObQJujX\nQWJi8zsvYNdxrdWXn7+Gw78ImXniTx10V2RT9br6B9Mj7d0Z04RBFXA0PA3F\nPbpke4KqTLrBXx7L4Dgtu0h5l5UkF+ADk9EMkhczDNuHpHTKU7lNc33+D5KT\nDkvRPtCBVbg6OpizfKdxs1tnagACVTIjgjcgSzXV7NbBSZIwmE/VtBVkOJ4v\nrnZZFl4J7K3KbOV3a77zCs9UMeI1NZ51ea/3kSUy+DRWcCZKktv17p4WCd0b\nohTPtqPamuv5s0mIQ7m00DiKys5rg/KyfhZBAd3ffpg0uEuOihUMG3pwzT9n\nU49jqFyZump3Fn+oe/GtxDMiBmGkGea6rTbttMJ8KbLIzVLJkfMA+airhbtx\nlz21\r\n=P9LZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpbATPQBqG/N77jC8S+CZHl/Ct0xt5gIHCLqEDG0MVIQIhAOcFUIzx8fjGNw+Exp4w8do+Suq1DzkeLE3FJNJxaemL"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.5_1588846493143_0.407886033214623"},"_hasShrinkwrap":false},"1.0.6":{"name":"thingsboard_api","version":"1.0.6","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.6","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-JL25maGhTCGpI3A6+71AIci3wLMO8O5HxN4gfSszLE0bUpd6ju1X0hUgD8V+G+qRPZamGKret9PFYCjMwLzW+A==","shasum":"a9bd4c0a67caab619c64f7ec593bb33f8b43330e","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.6.tgz","fileCount":14,"unpackedSize":51434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuuz+CRA9TVsSAnZWagAAdZ8P/1CveVY3a+u8wyOsFF8i\nErMjZjC9+ev955v1/UhxH1B8pihF3TTKhKc4+Ux/K98GoEOMUAzjbjTfpYG7\niQHICrdGXVSk07tYDz/vQ5T1yScRWoIHlcrgde+X1pg3+RX0XGSWsV2TJDVx\n7Apj9UN93FcJn8L6K7wrVE/Thqwe/0K1Fi6HIV4QB2INwsStUVUD7httFYGo\ntftRqc9l975MITbdCnCq0kJ75oT1/uUFeHk+k6/UGiss6jJS/PrJFj0q2Znk\nAb4cl0MIcjUTEWhw7UN25GA4BH355hQj17LqC2jyFKZGg96mP4wDm7jCervJ\nAW1NE6gjWLEs6Uv/3nOlZJzP2Jj4xnCIQ9jCFDmFk1jRICoflQNuLsZJ2N7S\neJRAXm4gvC33+VhXRNEddnT4E/nOXLB0m24pfH8D02U3LFanB0ZXse28SITs\nhMUjkBt1nuJsdRIysQ20euI0R1IYOKgWMRvMPCWj98wR4+37aZowMYsKF3h8\nR/Q57LTTZjASj6H9DZJuUzsiF6OYhK2jjCo7TH+9QaC4u0x5z7XnJdZbFhyk\nlnhFp1+i3r6hFroiNKBWZPRxDLosHfQ/8ivMqMok828bsOOFBUao6dSjW5/b\n0seGvaXjYmvZp/46j8NcZBMjc9BgxyXYQrTwjMir9k0BUjjVx2byABeyvvbi\nVhux\r\n=9R4A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQmL+CSmLenm9ZzeyJi9tg/VJRaevXf0syc/dpFg6PMAiBckfF1RXGW+bM9G2NpjAwRCwEnRapOBYlHZ2go74fd0g=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.6_1589308670065_0.9546951492315559"},"_hasShrinkwrap":false},"1.0.4-beta.2":{"name":"thingsboard_api","version":"1.0.4-beta.2","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n\n## Git flow description\n - Push to `master` only from `testing` branch! \n - `Master` stores stable version!\n - Firstly, code pushes to `Personal` branches!\n - Only after personal tests merges to `Testing`!\n\n## Update repo status:\n* [x]  Update error handling in [postgres.js](./postgres.js)\n* [x]  Update error handling in [TB/get.js](./TB/get.js)\n* [x]  Update error handling in [TB/delete.js](./TB/delete.js)\n* [x]  Update error handling in [TB/push.js](./TB/push.js)\n* [ ]  Update [README.md](./README.md) due to new error processing\n    * [x]  Update postgres description\n    * [ ]  Update REST API description\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"8435c3e68b1d7c41c8bd2ddb95deca6dfea4f7cf","_id":"thingsboard_api@1.0.4-beta.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-Z97/LoTiENOv34vLYjyRgXf2D3Ry7xN9JwRUrsi8H2AOizmcRZelQyEF9wyjT/1KyODrHfdbJrxqxYxMVQ7ZAQ==","shasum":"7cf47fa123a1c5e0e0ec18f7c881c33a9ede4431","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.2.tgz","fileCount":11,"unpackedSize":63889,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeu9CCCRA9TVsSAnZWagAAIQcP/3fB96VJBlSSBo0zZxQo\nvRxJXgkpKnL9uL9JTGh7SrQZBJcvm/CVx/nCUvReq2X4ddN8Wsd50T13V2Os\niT+U9D2QFCaL2/peB9yi+zWQPoTtO7NkrPJDsk9C0cVjA2j8WxSgTn5CCA7i\n/rbysGlksXBAXXJc0segg4G2O+Xu+S8qd/5UeWk42jVuWZFM0QrDvIlG4jpx\nmqdXug3RU6r1s1bwgyMLJy3SIv0Gztz+cYsFh0sgUrPwCjuD5E5qIuXIpdMZ\nLIFKxJ+2jJVG2RWTe5s87b38lrjfPVMVbwHpU8FT+J7E1zHmK9FBWGJK/r/t\nhrDS2MM0xWrKHNKF4GxUplid2K0qqTatCjgnqoONYZ0RbORo3y5mrk79R8DO\nze9awrLF7xIlR/WPxYgQ5lQ6OvzFSv/PAU0pryqtOTHPWvf4rBrI8XhkySUY\nUkPW5egZI2AsAWzJ8VQM2y742giNk8bERg/rSUCrCTeb22mmULbtDMz9TPVm\n64KOhkdwLqCJMGcPzXJG5WZ7+fQ9ROh1Dn3xvBAelgDW7fOINhnRHG9BA8pS\nURjAtYnvjXEmfv+kKwqyRYyxDOIehz6WzJCHIzGp7c4p99XuWCq9A+3xZBZs\nH7K+YmImnIRFqHYDlYjDS6B6f6F0uOmp0KwNSNFw3NsQtDu/9wr7+fZJic5R\nGjsE\r\n=foxP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDnjrJoiDH3SALgd8T0wJrfFsACf8vJHnBJosObSG2KwAiEAkUBD78C+SdBD460XqolwhRNwgOWp1tKcWpDt+h7lae4="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.2_1589366914287_0.4152026689585886"},"_hasShrinkwrap":false},"1.0.7":{"name":"thingsboard_api","version":"1.0.7","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.7","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-d3ZqtYt9MtyDjcnBaV/OTtIDpM4Y/ieM0iX8qwy2BkzJn0g12Sen+bUokA+84h1xkL9NhIYkojislvw3JcHmAA==","shasum":"74db50d8ce296bf2df8659061a65a4e17bab095c","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.7.tgz","fileCount":14,"unpackedSize":51472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewlAZCRA9TVsSAnZWagAA4mEP/07JbBet9+sSgdOfDoYX\nOjc7LnJfCpFvMN5rT2AgMlreTipaQGpCchFNGahMJfYi8+y93JVw1Tc36VIz\nY3v8aZKxRs+yIgCZKZMjZwPQgxCtkay5tb9gvu6Uzk5V06PCSS0viCaHo46y\nhd5IrlJf1dU7CGuE2ghmVps9Ii5V8X3DnNXKu2sFH+dt76ZNPco/g10AIZWL\nY3phsK85sGF6eQ9L4ExmI3cibvkZ6ryM9gYrNWxxOje2I23I3bq+FM4t8Lt3\ny7Iy/TUiezPdRHTgmOsllDX/hRIJYQoJ4g27g7tkjy5zN0poqabsJT1X3Ccv\nxK0gl1tih+kxFtgwBfL42O4KwNlLaQVqemeQs1J90VIbMECIukggwMj1ECxo\nG+Y1YO2JhnWN5dGGorVX48U3Mx2bE7JM/jT4JY5goqOgaxftfJxZPEB9XhLd\nYwQjyJKTq3gqBSg/ajTJ302SUo5sqfgiqim7l7JYOmokSVwKXobJtyw8MV4r\nHC1Ig3JZ1FeSah7S5CjW26NsZPJeS57quMD/Ddlfgw/kJrklIqSvF7IgZbFW\nnxagX0KNWwDxTDzSscCe/T3HrapNNVMmCpZMw00phBoY6lwMLKJzXlP3A0Mm\n/9g8StfeTqLhEPHkwK8G4QKvspoUHPZobPuoYXUWYAzIWf6vFeeSoVZ/p6+P\nocZV\r\n=RHSV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNwbYIRizNQgM+lv8kPdN51eWWYVCL1OBLxgVZs7dFVgIgIFlBbNqz0XUXu9DtQh9ZUzq9Vo0DT6oeCAMlCc8zD84="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.7_1589792793013_0.8618131648118967"},"_hasShrinkwrap":false},"1.0.4-beta.3":{"name":"thingsboard_api","version":"1.0.4-beta.3","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n\n## Git flow description\n - Push to `master` only from `testing` branch! \n - `Master` stores stable version!\n - Firstly, code pushes to `Personal` branches!\n - Only after personal tests merges to `Testing`!\n\n## Update repo status:\n* [x]  Update error handling in [postgres.js](./postgres.js)\n* [x]  Update error handling in [TB/get.js](./TB/get.js)\n* [x]  Update error handling in [TB/delete.js](./TB/delete.js)\n* [x]  Update error handling in [TB/push.js](./TB/push.js)\n* [ ]  Update [README.md](./README.md) due to new error processing\n    * [x]  Update postgres description\n    * [ ]  Update REST API description\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"5905ea7a5534d4a0079f1f1d29bab7fed572c49f","_id":"thingsboard_api@1.0.4-beta.3","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-fMcFPR+3OqjHtQQOM9pmXLGn3a5Jtbpvv0fA1MtyBb+0QyZvCBgEBUhQO792Sg63VSRc2ehGe2owmtUxbCnNZw==","shasum":"22f4f84f525fff13a4b7a270b908b900ac2b214d","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.tgz","fileCount":11,"unpackedSize":64015,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJew3+ECRA9TVsSAnZWagAAtqoP/ji5viFzcj+KKNNQcLZy\ngbO+1GRg03eB+QrWOaWjOKB+svFW1kZ6VEufe8lXYoIj3J87Xg/G78+Pxv0Y\nm8cJZH/P5Ous1KqL2L+PRHXfUxrCUo9bqwUCdQ76jszTnDaHFcgYO1EamF69\nw3Cq9JPHIqam2JxeoHbbNgk3gAfgo5f0XRW3PbbefbaxHvG8kegnwM30X26z\nqF+jLeeCLufbprCUUxPKmKXHz7AodAOlW0xNn+AcNlpABRwH1VU2+G8JySRK\nyxmZIYkRLUr7YWPrmaN+BhU52E7hcN/9VS0HD2ier76tLz3EP7W0yplloYSL\nUnfeTHuMmhm+1J9C7vua3MEIgPeYak66HviTgBxCINOeZEiehbn+J4TBhjqa\n+TdWuNCg7yz7rTdhCa+VDQNfh7RAmT+qUUy9z7aFMsXFePMstWkaef1WWl9W\n6aC4bHQXOZG4KbmIgUB2qNPPceZhf/VUm/KgR2IADc/opSsJEPf7+/EMaBhf\nmjzxJPKTPr5WuZ3Pu0oQ5JZqdAAcNeHY0ukosRUNzKrgLTeJRMk9FMU1ZUpW\nNawYWfTtAguJd9BrNX+v3GRy+UDLb5IwHQ7/ZNFw1tbZWH0HeW+5SUCagJ91\ntDB1gemo7HQceR2CZoIZdaMKM/9nM6w6Sm8Ubs1rYtLDhDglaMeUgu+f2q9E\nvDJZ\r\n=svl1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpsqEYT2HPRNXVVYPr06r9M886V27XY+wmA2AnSVnMlgIgBg9qTkvBgAOYSlF977Qtu0e9Vu+PsPontX+jqmWZrIw="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3_1589870467790_0.8547215199356746"},"_hasShrinkwrap":false},"1.0.4-beta.3.1":{"name":"thingsboard_api","version":"1.0.4-beta.3.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3 update:\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"9f787ca6f8137fbba0c6e6120c96ad61b6a2ec84","_id":"thingsboard_api@1.0.4-beta.3.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-E+cILaGoFbmnzp/+ex6kH0WXVFac0qV0g+GFOKY5Vzt5WQ6DGfhLnsWWj58/s/kcsFqY7+oQMY2n74/UyPp1CQ==","shasum":"00c2235fe71a3195b6e737f4c94f2a05e2a3aed4","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.1.tgz","fileCount":11,"unpackedSize":64587,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJew7lXCRA9TVsSAnZWagAAevUQAJvGabUmmQLC7G8/wpnC\no76XqdJbYqGpvllUrJ4m3z18sjDDL32Lk2s06BeLyE5AnzFxSnFz5thkQXBc\niCB9zGpFZHb6wGMqek0MPLv/kLkB8g4kg2y3+9uZYTDQsY4F0O04C9xQkSU2\nJORpHyIHDPwPlVzcaVmPni4UuM++f84XO51TbFopeBzWiAwgjx6HNFbKjl6n\nPI1nHgnn4FH1B1vUOksmaK6R1BwW4OKRKrtCsmjdSanjR+W1ol8OOuYMvMwc\nm2X9bufodPYQ9qAUTAeFZQd65F90oKrWjPvueltvuJxTO7kJq62H6I99iusT\nUfNUFBbkQ9jxNqKxKARblviunv/UQTXf8GupwFoqRKqXYJFxmqyKssMht4+n\nE9FRGMQe+K35zzD7uNPqnryZQ5HM+oQfRP0vaonNDOZMkirR1KdBAcTy6dSQ\nTjIaMLGXyZq+8YwTKTA5DFgdI806lXSOmFJ6pMbFhdSgrqRtu1vJjRaZDWhD\nUVHqWIHAI9aX0+dHireMeTdgACYOh9NpRVnCS24yADPOvpTWErO46JFixfjU\np1fOYY4Ahb5xYhs5J5u2tqxKRZ5DhlPbD1yDZk5wEsvTa4PTh1un6l4uPzgW\n46UJ0LIe1jGmd4+LiabbnlBLWi+OO3q1rjud+9wJdAvHvYP4c8Ygs3z2nMtx\nHOr0\r\n=ppyj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCq4K7IQSnN0cXxC4qxeCPNzIOa0Mk01sal3KyFXsWXnAIge1ho04SrHkNeIE++V4MMBfnVAPAyS5tYijTbaJj7fR4="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.1_1589885270709_0.4713040841665308"},"_hasShrinkwrap":false},"1.0.4-beta.3.3":{"name":"thingsboard_api","version":"1.0.4-beta.3.3","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.1 update:\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"6821c99f2c5b5e16e2094c809c7c2a3fee7bf924","_id":"thingsboard_api@1.0.4-beta.3.3","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-YEy7bvBMvlI1g8AFGSL6RjDvkBEffeW0rCDs8ez8maosZ3ATWHnL/M3Y66SyrKwh0r8yPmNjnMjO++zxTZ8nZw==","shasum":"4a86353071b8eb9ed655f356cbffa355d2cfef0e","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.3.tgz","fileCount":11,"unpackedSize":64676,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJew8SBCRA9TVsSAnZWagAAwVYQAJaRbtu3rsaPZJfbaHL+\nYCIFtpQHQnoGpQ5odUxeeEEt3R+5F5i2ZJxfsIUgnJrmPWLRHHfxSmrHFaYy\ndL19fq63/Ce4GBBFlMH7+Rm3I/ZcagLgcRyhK/Uxrw/huhL484YirUcFdRcg\ngdGpniLvUIiaUppNiUpfHjI9orr++45i/RNEKxd/H2JnpN6Zxm0W6gyqdQw+\n2Yxk46X1i+oENsZ/rCucHThi4gbFOiyo31W7R5pSczuUdODheQgYhj9i3o6V\nU/df0TUB/kju13vN/7+JaTIgTs0nYVk/ZjWaHc17ATPV/4fzWly6+tRRSLsx\njy4epAVUzERHpWLNlRqbR42/0P7Fe4i56OHhwYgUqzp0bZcfDRD9caPukGZm\nxutgmIfsVYdgHYXw2cjB465bygDUehE+sl3ptEciEYxT7ro22qs8QxSq3018\ntRn9hLEHLanlNIovrYMB8kBuXSAAe6j3W3tJoJxLJE4Ds91zSyOkoC13MxLn\n3uvGxxOzguQp6RTfa2lJwfe84Zk0ScF0dw6jyT7Hi3FErXdJlPW2ccW8r+rn\nO4uPXnAjenyPnS+8gQm8rQ2mSy1/XDWWH7oGMpS4EyugDzIh05NsvHdqdko4\nyqZpTxIf45ivQiPjxairCDOHhv6Wi1AM5uRx2H024eDP0XQgrSxrNlLbzykI\nuEwg\r\n=oDFE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICi8aMEcfBE7NrsHwYR7/jMiMr+IZY0VHPqdNEYAj78QAiAcbagCDiveiCyBFTq+BMUMHUg45MzNtO9gDlzbuLlz4Q=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.3_1589888129150_0.5099712933896963"},"_hasShrinkwrap":false},"1.0.8":{"name":"thingsboard_api","version":"1.0.8","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.8","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-HRzbQZpMUBymBcbcQg0s9Fq0mlskBjJRCJqslcFPk+oGuysNb/nNMULy4Gr8Noa4vQQG/YNLrl+xIw6/vYUbeg==","shasum":"fdd86b9bb7e740c615c6d625f153836229816638","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.8.tgz","fileCount":14,"unpackedSize":51616,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezCoSCRA9TVsSAnZWagAA1pwQAIzKaQyyasGUrhBFo7x9\ni7ln8/xuJzDpszXisNYseiDCiGRovs67/OGx21/gGYJUtEKGtshBnTSgATa1\nEaDTGP1R5Fz9EMCvMT+aSamSI+9nMw5YsSe7K5P1w4Qf7y+jh5KX+wxZ25ev\nNtSsg3l9wbpvuboqBZRpwCMUBgSXrNRyvBQo2WXn68jQrSg2kBFaTe3fJwCz\nEr5I30IUvHw8/nRAgcyhOlUeIIDbJPWZeDxje2yMa9WURgyrkG8T8SP2jt74\n/JduKqTmkSffk72gfqLnZaLZzAPx1Xs/2/j9swuwDMO4U+Q4WhZs0+5qag5j\nACvvos9QXxGxeMrMOnwCc9U14QFN09BuLbzBwP57iQaUQ2ScgbrQ9+uWG38k\nTpRgLnqMLqZtU0Sf2tTOqZJYB3UwGL47zLau4rUKYoJRVl68IJzHdeS8MCmR\njUMIuWX+sm2P9CS9T4QCdA4SdUbnQirXxlgw5EqBPze9hiuql1J/4gPF6Iok\n7RO1aN5Nt94x+BDdKX7cXhSFFdqRD7hn06KDoqcFMfixwI3RbLWHa0LrMZKQ\nAXhZ9OxGNUIkHkn5eDYoO0P3W7Uq8IVf0tjYfMUuOMwyg/GRXx2eofcyhZaa\nWMxkT+MLtzEX3evUQIw5lsYDiw3JpQ4PVswudj3J4r2y7pBMgdEEFu3/sGa9\nYvtn\r\n=cjW0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEFJ4svvOb9dWXtm/M31TmLS5UuJo/3RC7fNbXH098vgIhAP7EONmx+KMk27QF+LGlzoit917aii5hIQD1gi9VJ5+y"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.8_1590438417558_0.4434501275522553"},"_hasShrinkwrap":false},"1.0.9":{"name":"thingsboard_api","version":"1.0.9","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.9","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-t1Wb77aRbDNKoEdBjp+nXuAly8a9J7CW9PYNjlNyZ1/tB9OCjPmfX9spLtN7yb2QtrqMrmaPmJ/HxaUGBfOiTA==","shasum":"c5b001fecad20eeef8887da9cf58e6c095c57651","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.9.tgz","fileCount":14,"unpackedSize":52279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezQizCRA9TVsSAnZWagAAFGkQAI7+g+6Wo0/3gnOcDJlV\n8+AkalEePnlXzSSZuY0NpnmUrcD2bLWX2mKRctqA/QdPGGsSJ8VeUsHX/xkf\nfBcX0c95CxuA6Wgoemy9b+6kYle33tWcIhxUICDXiqfFd6FEugT/b5jMoWwL\nQqrbKZOouJf/4VVfH2DbLwjWoHhHihcN0eO2HEecsnhxNSO/1uk7r4rUX+B6\nEpn+6+fYv9IhXdssf4eaiXtlbxcVk0A+mUtgR6xCRcK9BLRjx5bBG81D01BA\n4PWKZO9ieij4O+lAIuM9GUcECVd72lzIO0RW5T6+fT+KZkKBi4RmmcUc3fS8\nZ+9y2MVH+gr0wrQtjph09aAOEPCIrPsqxleh4832u5Z6SEGuhvx3Mfu49orn\nnwsRFA70EC8XgpkandM4c0aae5ysBhM67NSBaPwReojtKWkNrU6psAD+Pl/u\ncdGwYaP+/iPW/0U/2R4GDpAfjAFmk1zH2KYBNt0oOghn0thw7bSjQirsYI4I\nw6UGgIt55Rs7Xg/In0T7nQXGB7zCoDQ2u+vJ8zVVcQtnomb8WMxuWPfFQ3lJ\nNcXfqJddZEZbdeP14wbunc/nb2UNl2wegudX7rX2S19Ma3wxIJ//2tO8YZMk\n5KddQ0TSIH5N0zHWNG0Q+j/IA3h1uwsSHb4do6ElBaLwgR+Z6kX4T6HBcItm\nJ7rA\r\n=JeYt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAymQp56HOjLsd57VKE0YnwhRXuKl3lsrPS0CmqhuhBWAiEA9+i2dnaFclAzU/Y1hmdNj5On7ox6HfC5hqx01k2dUls="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.9_1590495410933_0.6683491417296861"},"_hasShrinkwrap":false},"1.0.10":{"name":"thingsboard_api","version":"1.0.10","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.10","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-J98cx8nJI+i+3kbGAk+OMLIb/w754Hiihs7WkL+VNH9wm8MJsVXe3f4PdpCwVIqfyFjBpHJ5lfeqK8VN6gQ4TQ==","shasum":"73ec3e00afed36352928fbd7053fcc4ef2fb7487","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.10.tgz","fileCount":14,"unpackedSize":52356,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezSXUCRA9TVsSAnZWagAA5KcP/2137BhE7bbifrjqbXhk\nZCTU9EPJqOxGNNfKJYwMZfPxuTvHZPA8qaugYw4aL2/pVU4dHXO1uSsqxoeT\n6meko/jKAbhVOFkSATAoB/iVj9vzp7mi9ZiBfFRMiBpUOR+JAvHJVdBDnzdb\ndfTBdsGGgyIAdxuYL+q0RPY3dLbp861MV473XGzzvR+J2WcX3cC4qdzAAK+3\ng24Qn5NedzhDgw+aJbaFQfQUm0QFO/WGiQCIWV9Rkxzc5Ol41gU06VAaVNka\nJgJdfe/ubOaL/RtTvj9oG2jXM09OjgIW1SQE7ErrVMhdXHW+do0CWhPRa0Sp\nKgNMTwokw3t/FeN0r2yL++QqF98uX7q4r9foovImljVaq8VaDRFQ1WPrAKp5\n9xUorR6DXF5mPbwOR7vS4QpFkddvCQKHjGLgc2La6JUlRwz8m7L2s2NyxSjo\nkJD4CamE6IsjfeBDPpFxBwqazvrjHkLFeKe0QIe9N73xQ1AKa6Uao4TIIQjR\nPNQpklubDYsIXOkJ4uXs6J1sjG1Du39e2/ttWG1XsT+XiXEl496T1OKvT3o5\nmq7a8TLE4Bys4m7Tw2LaQkBEcTi3qgp0sA/TkatRoWVeG5J0uOR+hXH4JWpy\nFiiZpN+zkSnCz6aVEahGmzIW8AbRsukG0eFFE/P8vJLEaoXqBvBV8r6iqfSz\nBti9\r\n=RFNn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNva4yiKTZN06UBR7m2CFHR1Rga1UeexUjyAX8Ewz/yQIgbEPPG1sJmFNIlrEx+jRGrtSu39RLbXphsrBKhnX7Ang="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.10_1590502867609_0.012536329767333987"},"_hasShrinkwrap":false},"1.0.11":{"name":"thingsboard_api","version":"1.0.11","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.11","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-4WYJ05ZVID68WRlDjIkPN/YLnojx1ZJ3Na3qXy+obnwAPEhXSu+A4+iPKoqWr2CCKtrqqoBCfoj1176Frxfb9A==","shasum":"059f8158fb59cbe693a0d5d0c845560df692c7a7","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.11.tgz","fileCount":14,"unpackedSize":52362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezSdGCRA9TVsSAnZWagAAu1kP+wZ4pwj1P4kkFTtaTqH+\nESMQjNIuHS7S/bn5npVPx1trknWW0C3XGmgT6e5DbOyx/c5eh/gvkXNCWd+o\nUn1IjE3PGIq6jDQdbPDOIuDgrSWU3EcCjpWM6w1HSAzI0OHvNqktGSB3ZmkE\nRvWYSgKYyQBK6eAoMvWEh37Znv+Xy96H8t4JMqX4Hfeu300+85iFXvKMRu4D\nglSdMFRuOV/ZUuKE4cWmfuJd1YYBOG/ZO/Ma2zsuywNsgJaFruviEIR/wncG\nFZKgy0U9GxD0W73loa8Yfd45X+a/ZHDHTi5IbiWLqAv3wvfLJr0eY2BPuC5z\n99CZDz5hrnfyyXZUpVKF2wi54jXSimyMaicV7bduRDWpJsM5Fx7kVSWaJlLn\nTdLiFxTSf5ESv5f932UTCN/IYzSeijz6xlMfbMkc2fK9WnJdRfEJCCY93Prr\n5yzNf+zfqNdduHBp+TGgqoMRDLhzPvLEv+Hjj4y1ZI+bpoI2dpOx+K7PKfYX\n+YYsPU+4bs2We9QtPok0x+Nyj1/cuIwWbQhs9mKJpRJyii5Dxiu9ZK0ATisa\nOC2SV17wt4dvA/xXuFu0fehMkfAdgL8Rg7v44dxQqQr26HvWPcFVPYPc+b84\nKD9XyYoQKAZBN1y+JpzW+3NOlttFwEFmOHxhGXTqnraqLGaa/nLPK1gjGMh7\n4B7J\r\n=yIyA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAtr528YZwuguSZh3Oqv3JYbGDK5w6yJrgp+Z//WVjCXAiAE+VOT+s0pJjQ5PwgIHybqscCk2qH83XUuWU4m6Jm56Q=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.11_1590503237844_0.5874124206044682"},"_hasShrinkwrap":false},"1.0.12":{"name":"thingsboard_api","version":"1.0.12","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.12","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-J0fNTRuLF1d9OpnmOBNIVq+15JZ3zY8kFsOI3dpoTfCbwdrRHF73xv80x9f6/QCt2TjF/qniIana3QWyPvOSoA==","shasum":"cfa7e2b80e2708628d391175637ef996d50c5516","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.12.tgz","fileCount":14,"unpackedSize":52362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezSfxCRA9TVsSAnZWagAAjGAQAIY+AczhTTzgd+OGBZ6d\n/QplWB6X/1zZNWNGMTh8qWtzZjrHhejZS3I2U8GU3zRgAN2xaZTzB4L61GGE\nCpzcZrK/HbVnHZadBndUAXMu6ALd9A1CvbePZ4QZOmHpCZT4stH44vqQ2EK/\nobMVF+1cXlfSYf1FtIfMenmw3p8MrgyZzws+NFjNHvBiVGZ55BKxvxMkbwW+\npCe8412Ngto6wH3MD3W7/CGaFDxJSfaTpYJ1Gur4LAC0BVEJ/M3USc2IFbAO\nfjNc2ZO0ijGxTQFp1irg3vV7Lj3ykbNzQadxFuIv+6QBg3zZmjcXX3Y6nlKZ\nkbnajmAmcoBKwoN8GxbMfqRnBkjgovIZCpZMJTWKkmLQ4oELVWsrtM7C3FDQ\nqS6UIMq2z6WB34GOI8+mL53WJsa5G/UMIiYAMPWyO+l9S7DQLCIXPIMkDhyi\nhr6WYJNDBdh2WeFuOOdE7Cuq1souPmdNhvNSJmJP4qcO2gcwuZAPijg9uuxv\nXhQX8AxwzvZL8LrWLIe8Sdynk6ju7hwyHYlXispRWkQK8RK4GJGWsvk0pmEi\nDi8LJlDbV3Rk0vBTqNTKk6xURZFuPoP8akIb5A4PO93JypWnACcQhlCXNyGv\nLO755QHIJVQRyB2SOEXJgE7XValzS/4C/hZddFvcmRBZFIscgZpwN0mVtRpO\n6wBM\r\n=dZpZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPKFMOlRjqyBOP5/gAFFi4dWbO6qXP0kEqFIn4dPG19wIgEaDoFU9SEJM72iPn63q0bVvlTOnLb+bit0LEhiv/geI="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.12_1590503408596_0.010534204953668747"},"_hasShrinkwrap":false},"1.0.13":{"name":"thingsboard_api","version":"1.0.13","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.13","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-tDeVwah4tyoJv/9Mhohmg2RKGs1paLfJ5esdnNhUVvgodLTwJAI+NW+f9NbURcyu74ZgqIb4xJOGZzpOiML1SA==","shasum":"5cc8965e0b33eccfbe38fddcb0be281f64a8ef8c","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.13.tgz","fileCount":14,"unpackedSize":52393,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezSmtCRA9TVsSAnZWagAAwfMP/2Ffs3jshLUWxebVQ0aI\n/ontSLiB7xKPPt2bvMrsQGwvTErIUMOyStIzUAHwgG6SIwefNyZh7HAChzK3\ntySHYHsWeH4ZH06Smpw1m4qhNNt1uiAAn011qjbAGohF8qYdvKrr8cLee9BB\nFfOj75b4nHVK/WbstyG+6VNIPkrCRuw0li2J0hILj8JZ/9IRDDXMhIem/gsP\noUUJJikHoLtlKADNOI/thsakWh6S7plrnqi9vo1egToRgs62s8qsmLBPirFg\nnYswvE2P/KwCxa8rd5VfRMl91nOLaZ0my+A1B1aR+rs0eawiN30BGrFuPxis\nbVqVwg9dx09NtwOL60N+WfxDKOIAnjjL3rKXsWuFAOQTx4f63hi372dM83ab\nWg0PKSu3XfVDHem7Di3vTEYHoU7KVc/XhmBdEDIp7D6M+zu/H1r1cl/siXV4\nJWAgqVvcnXUvOdtFVPr20vbZ+J8EDGdSdSFzjVRO/MeaBKyvnpawsVQunNzK\nAi4HQ7SAZr9AU2hMTC3N6QMHO7H1+CfPxrttgrGvtJ1BoG/sMucbLyJ/6zSs\nRyFkJ8tsiVrx8k57P93YEZTOiU56BEsM9rQh/t1wHKA/G4Fvfz5ePcXhjlIC\nSZU+W3Hfam9WtV0Niu0TUUUnuRVSk99gmOcK6fBoSROGbWKViiVOOeCQTNRs\neJo0\r\n=B7V9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHuK0yfNAfSTjLr6bUAbLLHabkiIVTUFLg/S0tYi3m4YAiEA83pYfkWr/1++l5mYFRYHv9+lQ47DIQTcjFmqr4tQNc8="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.13_1590503852811_0.4883457573218839"},"_hasShrinkwrap":false},"1.0.4-beta.3.4":{"name":"thingsboard_api","version":"1.0.4-beta.3.4","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.4 update:\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"ac0e07b843c5b1b39034541840b2406207805ba2","_id":"thingsboard_api@1.0.4-beta.3.4","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-Cn4s/MxyAppJAAsx8rGPOkC0GE4F3HSM0eEJzj734lH6iuMWiNuO7ZkabfksqMrmxUt8PO2noC61pFhPWy5xOQ==","shasum":"7ebadc7b3bc29aeca7e27c6ab9bc76aa4f9db006","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.4.tgz","fileCount":11,"unpackedSize":64697,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezkByCRA9TVsSAnZWagAAFWoP/01Y41z8Iq9YH+RIXW+9\nO7PIhVMWij0ZTZkNIez29iAZQXh0zWG1XsxvtXNsfdYY+IR45tf+ZDKCh+3q\nOed/Y6HIRoGVHgUJQIm1kKH8dNhCUNFM41SiDrc3EFU8oGogb12Vl8gaeJNo\n4l9b7t97DKzggUTFiRAAAY0Vxw6a1Ee4lKCQhPRaeNDK5YGLjD/XuC+tyMUu\n3MnVngIVLkbNm8bQ2FMo+yM+3vU8z/xqSiCBYPS02JNyRRLaWMjTSraRrY91\nDOu6VusTYj1e62iuDTqYvMIOO/jRRVBv6+Kj1NFkuop7uoknx/EQuY8PLa/K\nBHBm6pBA8QKOCOQqykZIjrAjkEH926ciKCcCymzcMRJ5LVnKsAQQtYi48Dxa\nSQHerqpAPqf6itTgjtrPHmLoDsuHM9HDbbFI5j+3DVvw1Ijz+58rPdGGEGU5\nOkfLjDu+5uy7Z4v8j6RjlfS4uLth0o04QliScqq3R2W2eUvk+oi5GfHqO7Cm\ndUsvnNJWvriKMBIQALt+O22gSzEq/j9P2pPVCdwUkGolE97ZlFgOydmD7aI/\nM4jtymksbv27RUMaQfViYAMcauzQPyp9cevQ3rQwU/9nbnRQ1VaVM2iFi92V\nGNfSO93/r0Oa5Cm4hFvvPasnoh9oTw8eV5EzFBYjpkwJGsIBHqGxMmJfi+qx\nPTVo\r\n=vpF8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxeN4h9jnpcKIDKk93Byq1UX1crf4yPHxCAHIo3peN8gIhANuXbggINa3637P4RbysKuKu5Q/jEQE6BLEbaBqpQ5Jx"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.4_1590575217792_0.5131614444306678"},"_hasShrinkwrap":false},"1.0.14":{"name":"thingsboard_api","version":"1.0.14","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"eccabcb0e48b31edff09decdbf61e4c4bb0f820b","_id":"thingsboard_api@1.0.14","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-S+2HjHAPzVfng09+UJ4LOz7+45PTxFSYgzluBMBD82oV4N936hDG2r4yGhLAxTsQqTRbLfnP+SDVlXltKOPzrw==","shasum":"3fcfb61b65ceb8b1e0acb0f429073801a12b3c07","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.14.tgz","fileCount":14,"unpackedSize":53696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJez53dCRA9TVsSAnZWagAACqcP/3R586gwUyiWfBKPVssI\n8ktQPwntiagVOOLMiGIKNp3rSx1NBHQ1UmrusIqHwEkTqhHD/yvzrz5Fh1+V\nhzlw+JyOqzqjuyL7y0jBRfOuXsQQ+MvauRNXP+T8iAiYVWzRE7Tc9cjseHgc\nfgywuA4+3vpwbPqWp1TZk0idDvbNW9Ix5CRDkgwPmbedDsorqxtZWDWCuP4q\n+84f6t39othEkL8mcj0M2H0idVEq1fcxKSzM/IYt5km8CUibP2toh5cU3Zkf\niZxshMJSz6BEDD6Ouwb5v6XEPdgaoUYYVVnYwBUK0Vo+IxbYfHbt5zjLAkAC\nrLds3UIAxu+LiPa6E8fWNIYO9Ato8jW8hySK82WsgUVaT2TSwnK4P5umnbKz\nwutjcdO0LkA0tDL63pGJ3H4sUk3bAiJLrvi4phnX2+ernM6TyvwtrPl20ZTR\nj1Gwj1TR5utbrssv0HWBI03Ls2URS+Y2zzrvKHV5ub+pPC4SFRRdCQqe27vN\naITrG45J5NzRTPXgCN0Gc5aP2w9J9/LmJtTGL3+4LINdZwjwD5hvs/Z2rAag\nxTqwBpYFomQ6QUM6FvIv60/YuMq3H5pQ9JLJg6HiHoWYXR3HX0T8qWBfTnZm\n2CVqQQ8Edy/O5Ejd/3d6iApBGQ+6o4OHOzB6HKuH1AbGIrMmls0Yjq1SKi0u\n84/N\r\n=jtxq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG9R4LzUcWqjM9q0h3vcL1IRGVSJLJh8sPDZX+n3LMmgAiAwbSal0hzKCS2hcKfbYdRc7+ctBUq3Ccs9b1uuQQ2GYQ=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.14_1590664669036_0.8576006966137126"},"_hasShrinkwrap":false},"1.0.4-beta.3.5":{"name":"thingsboard_api","version":"1.0.4-beta.3.5","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.5 update:\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"379248ab6ed62e1933b49bdf7fe18483c4258db4","_id":"thingsboard_api@1.0.4-beta.3.5","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-ZWr6StnRvEsim3vs9yyOmbXck/twAMpGMulVQ/jjVDZruETi50qnX1P1Uc/jm8shYSXwGYdfwRRU39RrbCGyAQ==","shasum":"732d4c7c1475de7bb339ec03b3863ff034c714d2","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.tgz","fileCount":11,"unpackedSize":65593,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3husCRA9TVsSAnZWagAA7ekP/1r9iJ28sbHJABX5WHkG\nKKv57jshafdVViDSpwHEGrw+z8qM00oUPVAmihNdEQWloLGyEDjQnZ5HWw6B\nTLAyzNVAK6Xp1++Irlul0LFtkd4ROf+ch+308i5Q6y/4lvzeWz5ck/55RGRT\nf2jGuNpB8hafgSKdf0ts3akpv02iKH1b6y1ZMkvkDkpYdAh6IbYkKP4inFjS\nDlGQQsFeEFIde1Lr5ObHsAylS8XvmxbLvaXRu5MVBjDM4xBOLrKZFnrBIpwy\nE1P8bAC6e89ozsbZxMu5H1SZIHGpQoHy/OXDQDEFkAbVYNRoBiIDMdMuLnX3\nJ83/E+HDZZVy8OOkodEDNdF8EnH2iLfyyLrOi9IDLYQBwLM7Ven+lRhYTV+p\nJA0Z/oqDOa3J5gLvLnIO5xXPWg8BQ44kUaCWMdH7cXoJGbjlP8OBlUkxX8Jv\n9TSMuTMxe8F8ZeQ7bv0oSIdMlNmUap+VGMmMebMwLF3lNm1bUaAHMK5NbzBZ\ntvEFDamXF1rdISmWSbjAISAuKqJQ3SHLgtvEuWNhjVfFNZt7SJHLdnOg8cH1\nXTWXw+p0Lpp3W6Lenix4gryKqTrdEEOxqJ6pCLRVCUEHlywn9rQQOkSnk/7c\nabwk/h+/uQH5v4cPzbgXQIE+lM8DFfm2xpjT4/c7b40AUGMu87Yax+5Ctv/B\nO+Qn\r\n=pbAo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBmN4K1qSQ9WMk7VQWGzvTH/rE/ySkXyV9Nc2B41SvL3AiABx/MJJv/ZF0yCdFE/6q9eplMSlTeNSEt2zSh0g3g1CA=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5_1591614379701_0.7432484073541439"},"_hasShrinkwrap":false},"1.0.4-beta.3.5.1":{"name":"thingsboard_api","version":"1.0.4-beta.3.5.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.5.1 update:\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"c526941bbf835689f2d0a628ac6d8a7bd2c7d3f7","_id":"thingsboard_api@1.0.4-beta.3.5.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-WaZri8lJYa8FUy9ajvSfUmKJpO2A3ZYZ2hJpGXSNq3KgNqHB1K42C31pf1bN8H3aMf66q3UUQk8KDah62EY8kg==","shasum":"c516adfe4230227c6d901551aca9b58bbb6acdb3","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.1.tgz","fileCount":11,"unpackedSize":65347,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3h2XCRA9TVsSAnZWagAAHioQAJgRhM4ehrr58XcHEfvj\n3Et6AjXqmkcttYvie++7vlDtCwaQ/BYIarEmq7ebTQqQv1WTG0id4CD6Z0Np\nQiZQ7vbw9LuLwZ6uQQOdLmxVcbdV0y5N2J5fP+kcWHEPnlgX2NB12FnUwCsY\nQerYZ4I/k3uwHHj+P2T0Zlo0Ar4I1WO20uHcYnqdwtDOxn3vizCQOd2fcVrb\nAGSROmFjTdRrfwvNZK0bqpt4fJ5RCkrCx7evLOaPrIlxGdfqgzhc+N3TWDJu\ndGsOKfn3fCg+8R3cx6uFGecpc/cBjrx3xm+Jr9eKrNW2PHKA9NRnctV/uX5O\nM4akt7IOLDK810swauXY+75ecr6MFCXfFv4jsNAeSiOG8d1E4Ve3L1VhcphH\npF5IieadnXCjWyhoYj/4kEB4QSkP8M1Sm2k23tmCkmzRIq6QUOdGww83RBEY\nzniAemOqfzgBfGkfmZOgOkUJs+ipaE2jARp9djUOuefQa6Vho+04X5D3liMq\nWx2k9UlFpS8fWVnhdx/W4f/CZ991tjgnZreWXwxqdkrzRpmVi3KiuiP2w6Di\nafvxPyBlQGKb9TczItaQpQthETYqRWeK0FaDrR5Wyp4xjuxLMTXIfzRnp9e+\n3Gkb+RRd6ZUkMailmnm+aD9LbbYQBoaTcN7nNELK3/lcRyh2bcwza2QUpQCe\nu3MQ\r\n=dUvW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGh5QojVjN0EGNOqI/IuB4upxER82Yn+X9AyUDaei6yRAiBaVP9EQKG0XJ/fruAeqi/upogwv1eN0POj6v58X7KD+Q=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5.1_1591614871387_0.3396203569723335"},"_hasShrinkwrap":false},"1.0.4-beta.3.5.2":{"name":"thingsboard_api","version":"1.0.4-beta.3.5.2","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.5.2 update:\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device id!\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"d58ec4e4edc488094d8e2e64303811aa80061806","_id":"thingsboard_api@1.0.4-beta.3.5.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-IUJSZoGMFqbNF3X8hE3GYTxIsimHaegPlrUF/z6msVPd7HcN83I39/fiPBdIi/cAHi6Qfrc6GBwoeXGSMBehvg==","shasum":"ce8a74049e86a59f586f7de3180984dcea94013f","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.2.tgz","fileCount":11,"unpackedSize":65500,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4L9BCRA9TVsSAnZWagAAw6QP/3bJKEtCezB1vK0boRF5\nw4vTkg3BFapf1ADgrLB5qD45AXN6I4+Sir84w8r7zPET2B8ln1SVh4EC51aq\nwStdlXq4b6V5gEwdUFCRUSUOMdUW2Up3CsM67D+NsM/u//gOQy63i1ftAAzE\nsj0jJaTBBDLj8PR74SI2CP3QdnxGyzJsUyQRHxDIrKxTdm2icPmVk8CPHymc\nAwgp5tQtSqqska3tatMuvdC9ZzodzMDUwKRKjUf5n9XV+hTSzVc/1ZO1Cv7U\nXd0GbosLjRW6rf9Zv1ssHS3QDCg7xVEZz6Z/stY1vQnyTEjD4K0hjFDSn9q1\nM3HO4BfrBnAsNbr92kBZEBYo3MPqYqjVLiayRDNHqoKS0NkbD7DLggOOQvpg\nL4mGNxlpwZ7Nh/urQn8cy1gMGfRMMdb0eQOgOcOaJCbTpgSDTH7PFUcxRU/b\nxvdeMCJx5e6OPTGfLBZk06k/AEjf6+qFbkNx5nrLMj23G+28nZtGOQ8Nm3sy\nebPSO/+Iw4pJo7PWDpviYE1rhl6WLo25Py137Q1DDjT8aZBziHSDY7Wb4RkP\nxmyWKTcT2T3kmz9zIZm2OCHLRpxiEk9Mq/KAnzX199d4a+c3fYu9loz/S+qR\nM1xTZTWPxfm8WVwHOWy+zwZlQ/0Znk5KfynmHkn6pX77JB3YO0qbxZiVWjkC\nCc6C\r\n=3huP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoe0K/VHxTpHlyw8gJ+aTc2ifeUlPVjkuYVbLbpbLfJAIgMP3OLSCb1vo10HQy66vnyVMJpuORFT765I11AJbE9Fw="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5.2_1591787329021_0.9621759006101422"},"_hasShrinkwrap":false},"1.0.4-beta.3.5.3":{"name":"thingsboard_api","version":"1.0.4-beta.3.5.3","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.5.3 update:\n - [get.objectIDandKeys](#getobjectidandkeys) can get also telemetry data by set telemetryFlag to `True`, `null` by default\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device id!\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"9cf82161407e1673fd344d95c6e033b6545c685e","_id":"thingsboard_api@1.0.4-beta.3.5.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-Ti2Vqkv615lLCCJVAn83VS/cIS5eZHMjdTCsJOua05SC3/9nz+CB+iHhGGwp5flQPIWpSBGdXmQ330jvbphrPA==","shasum":"dd583a14380e4d01026e2fe0cfd30c5c2ea2c206","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.3.tgz","fileCount":11,"unpackedSize":66205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4NLZCRA9TVsSAnZWagAAg5UP/j3X4ZWU84hD4T13t9PR\nux+XlzZ0uB8GwJ2kIb7T32BE0ltKZOFvsqdaP0Azkw850lmiLXlbjtdb9nx7\n8PMn4VB8BOROiaw8b2E2Q03bgSPOuMFFxhU6/+RrsgI/edTUMwlVEi14l2J1\nZwFWHTIpcwb8pEf+InA9qYMImNTyN76N8G9RZOyPer+qk9C9o0WnZZ4wh2Kd\n3dPemBmzrnWak5/0reh9Kqj6PAdezA2fy58mpV9dxrUkpAET/RMdhLNyv78S\nS+UnzTxVjq9W7IK03qRlZjiYr8ZXUTmuRqUGNslq9SK+hgkhMqRgAgXp93R9\nQz8sTtDpfmNO4flay8d8vvbAHlurcK7txuoFt7KB/FApqMa1O1HzYoOkSAmp\nKGm6f2relCqkYZVIEa1QOOce3DQtBXCUyAIUli0wkGImUEaCEmsWWkxv92QM\nZkYLSft51RD0fdUI2M1Dmy6nVGz9LSW4TDkwe4G8gqYOPaZwpR0lzKa2WgzZ\nbTzYDnLJ83PU833EiNVmm2HNyXGBaZGmzAxXWi52KFCfeIaWnnfBrLjv7n0S\nLktuMwLvlvQaMQKMiNVLD6ivovVjUcqPmWIW0HN4VPn05IA72qfvdTtKoeNT\nQzgdjd7uhjej9wegBiZofO0oL35vFXNh75NevmrS86JNXdnZor17s7qVU50M\nKzAR\r\n=Oej6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB1qj8pV7LK+M572ybjN3eleKgWyYenWqAwTSWO3p7nCAiBW2nw2/3SyhvthJXhssXjOlM22t7XZeFAnV0fe4+nkRA=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5.3_1591792345071_0.5276782256323751"},"_hasShrinkwrap":false},"1.0.4-beta.3.5.4":{"name":"thingsboard_api","version":"1.0.4-beta.3.5.4","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n#### Beta.3.5.4 update:\n - [get.objectIDandKeys](#getobjectidandkeys) can get also telemetry data by set telemetryFlag to `True`, `null` by default\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device id!\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"34714aacb808e75fc5cb0e6cbdf42730909bfc9c","_id":"thingsboard_api@1.0.4-beta.3.5.4","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-qQiYRiSytcovBkV1RlK25G4Jvz46radYH87NqhNqPW0Fx+telsAq1x7+GPDzAMnskhkil+kNAdEOipKOFk600g==","shasum":"7b2f1486775ded5c965beb67f522fc3171372b2f","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.4.tgz","fileCount":11,"unpackedSize":66222,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4NV6CRA9TVsSAnZWagAA9bcQAKBxg/5uHTLZZJ4g9b81\nyinuOnzJlan4NKuKOnhiWQ01WxjQbEuPy+2w30FbA/c2iUZvEM6oS7YGqJPX\n20JimLIVG0KWv5OE6yEmUTaAQjwYtbxQo24SgqPBdXlxvU+MGj7BvvwhwUtb\n1QpjstEJyra7hno6wVNTlu5lOomXvaLXFYd0WW85wXWu85INdcTVO+3/afwY\nmm9Wa0UXiEimsNhcpNF/OOrukM08CZkZoxhZgg7XKUkF+DjWYII93wWQ6/44\nnpnNL8AOz/GGdRQEFNLtUXGBLiU1b8lx9SpQdr279uR6M+IOmJYv45Lo+lh2\nyKIYEDvv2mFfg3HSYAGNSmSKNDYnNnB5EnMoeaDbMGc3Gefy+OiHZgQIu7QY\nrtY/nLogJZTXZTRiPxH1MK3q7waYmhPZI4Pe9+NuW/TJTtFMHpHY+VID57hI\nBhzhFMLzxxLXxFWsW/RW6lVZdpyVaz68MMHVshaew6Vonx3n0JPhaEYU3Gj4\nVmH+9wZkwOlKCDK9/+3lgtUQCCN2iQqOa/MYsm+zPd6QMmIr6meRlSvpwnv0\nX/QI/l3HevlLGMknUg8WHikPyzlEHLf5Hx5Q9NFhshInOOeuYrFZvvB/cnDF\n1AnNFufpE4z5oztT5TO1xeTq7b7QbVfD0W7vegP30Ueanw9+rJkl1Xa+TGpE\ni6zh\r\n=bSYG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFzQ2AwlHTegfY1WkUsmWGqXzEYJy8QChHs0eE4KbksbAiAOhWNGggmMpcTDssrdzKQh/nUqzK+oWIIcM0/+aGO1Gw=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5.4_1591793017913_0.5890171901992158"},"_hasShrinkwrap":false},"1.0.4-beta.3.5.5":{"name":"thingsboard_api","version":"1.0.4-beta.3.5.5","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n### Changelog:\n- #### Beta.3.5.5 update:\n - Bug fixes and improvements\n- #### Beta.3.5.4 update:\n - [get.objectIDandKeys](#getobjectidandkeys) can get also telemetry data by set telemetryFlag to `True`, `null` by default\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device id!\n - [push.pushAttributes](#pushpushattributes) can push telemetry by device token!\n - `get.getObjectKeys()` in case of keys not found for object will return an empty array (`[ ]`)\n - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype) by default will return ids and names of objects, in case of keys are not found for them!\n - [push.pushAttributes](#pushpushattributes) can push telemetry to `ASSET` from this version\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"9e1a375b17bb979b9eacaa47e4e2ea3414561e3d","_id":"thingsboard_api@1.0.4-beta.3.5.5","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-zfmZ1hvSVQIuSLVXSdBVRqpX6ro/dQtnlr5+rKfzkFWbu1+sYfFMCOWuUvLzH1zVFsciD3/yZJDelaxGQh58Pg==","shasum":"3bf0324a2934e70cd31be4a6bc4e033bf517bb38","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.0.4-beta.3.5.5.tgz","fileCount":10,"unpackedSize":66405,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4gsYCRA9TVsSAnZWagAAonYQAJhZVcyYAVEbOOEJxcQ8\njCZCCORkbsP5yewlu+0ZW6Kt7xCaEgJehXwd5lcW65PvIs6Zve4ccdrv+vUH\nPVld/Ce9QcOYWSHqibDoT+OtXddHZ/LsmGlqccDM09xEMFhqGs5bXm+llM1u\npGqP43RoYAyCgtmYuUO3h9I/hrUiy5NRCSzuSbuIu4ItnZ6mN0htoMx/LnRW\nVYKAJIY2d8xQQS8xoCgk6kalPYvf1j4ARTPHkd02uSqz52fCC7udt+MFWKgZ\npO8mZYpQY8lELTkQLTWUpe/sXZNMNIMJ0B6/ndOXH2uAEH4Ylt2HC3behqB2\nmfZPQN5qHjUfwv5T+dCX9v0WCeXB7ZP2YNe9qS6sGOi1IJzpagZvSIwVTyl3\nO0ycExCZyQKZ2sBkx/vqQWuXLs8VQ5dSKVZVKoIu3L1CRMV33tPosCSO8ysq\n6BIxF/s1tnXyWSn3X48t86ChSdISD131DB/RJxl0Q1WeRE5iMh4A6w8EokxC\nNCd++kAAeBDbohxo9lGUmN5oltUMlCwEZZz9ONzA8Btz+npHkcsJNJFRldss\npEnp3TVSb7EJ3j2lAftRY1cgqVkRsFDIjYICG3bXFLR2MNQmm+deZzjmmCbQ\nmMVva0bzP/mqhsntiZ0s9BxGQ6SCyOV2W5pOiAciC5sgV6ci46ZzRk2SUmVa\noU7P\r\n=vQU0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAKilugVwuzVdB5YEwZFQf+Jm15buYnSr1B6P6twnUXwIgRWPGF3HBQU+7kQMNXNi4LIgNEg7dgr/VNYNEP3/+wIM="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.0.4-beta.3.5.5_1591872279411_0.9393781474211496"},"_hasShrinkwrap":false},"3.0.1-alpha":{"name":"thingsboard_api","version":"3.0.1-alpha","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0"},"readme":"# Thingboard API\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\nPromise like implementation\n___\n\n### Changelog:\n- #### Updating api for supporting ThingsBoard 3.0.1\n - Fixed modules:\n    - `GET`\n    - `PUSH`\n    - `DELETE`\n - In progress - `postgres module`\n\n Bugs reporting to `i.kovorotniy@2050.digital`\n\n___\n\n<!-- TOC -->\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Error handling](#error-handling)\n- [List REST API Functions](#listrestapifunctions)\n    - [GET](#get)\n        - [createConnection](#createconnection)\n        - [get.objectID](#getobjectid)\n        - [get.objectIDandKeys](#getobjectidandkeys)\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\n    - [PUSH](#push)\n        - [push.createRelation](#pushcreaterelation)\n        - [push.pushAttributes](#pushpushattributes)\n        - [push.createEntity](#pushcreateentity)\n    - [DELETE](#delete)\n        - [delete.deleteEntity](#deletedeleteentity)\n        - [delete.deleteChilds](#deletedeletechilds)\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\n- [List Postgres Functions](#listpostgresfunctions)\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\n- [List of unclassified functions](#list-of-unclassified-functions)\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\n\n\n<!-- /TOC -->\n\n## Installation\n```bash\nnpm i thingsboard_api\n```\n\n## Usage\n - Better use environment variable instead of costansts or hardcoded values!\n\n```js\nconst TB = require('thingsboard_api');\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n\nasync function main(){\n    await TB.createConnection(options) //\n    const objectId = await TB.get.objectID('entity_name','asset'))\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\n}\n\nmain()\n\n```\n## Error handling\n \n- The most of functions support `error` and `message` keys in result object! (See update status!)\n- Error description is in `message` key!\n- Example:\n```js\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\n    if (result.error){\n        return { \"error\": true, \"message\": result.message }\n    }\n```\n\n# List REST API Functions\n\n## GET\n\n### createConnection() \n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\n\nList of options:\n``` js\nconst options = {\n    TB_HOST:            'ip_to_TB',         //default: localhost\n    TB_PORT:            'port_to_TB',       //default: 8080\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\n    TB_PASSWORD:        'passTB',           //default: tenant \n    PG_HOST:      'ip_to_Postgres',   //no defaults!\n    PG_PORT:      'port_to_Postgres', //no defaults!\n    PG_USERNAME:  'loginPostgres',    //no defaults!\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\n\n}\n```\n\nUsage\n```js\nconst TB = require('thingsboard_api');\nawait TB.createConnection(options)\n```\n\n\n\n### get.objectID()\n### Promise get ID of an object by its name and type\n\nList of options:\n```json\n(name, entity_view) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\n```\nResult\n```js\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\n```\n\n### get.objectIDandKeys()\n### Promise get ID and attributes of an object by its name,type and keys\n\nList of options:\n```json\n(name, type, keys) //string. for keys can be array\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\n\nlet keys = ['key1','key2','key3']\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\n```\nResult\n```js\n{\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \n    name: \"myObject\", \n    type: \"asset\",\n    key1: \"value1\",\n    key2: \"value2\",\n}\n```\n\n\n\n\n### get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\nList of options:\n```json\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\n\n```\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n### get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\nList of options:\n```json\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\n//If keys == null - Trying to get all attributes!\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet keys = ['key1','key2','key3']\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\n\n```\n\nResult\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name1\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        name: \"name2\", \n        type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n____\n\n## PUSH\n\n### push.createRelation()\n\nList of options:\n```json\n(name, entity_view, parentName, parentType) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n____\n\n### push.pushAttributes()\n\nList of options:\n```json\n(name,entity_type,attributes) //string\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### push.createEntity()\n\nList of options:\n```json\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\n// attributes - can be null, if no attributes to push\n// parentName,parentType,parentKeys,parentRelation - can be null\n// so no relation or cloning attributes will be done\n//\n// parentKeys - array of name of keys to clone from parent to new Entity\n// parentRelation - boolean. If true - will call createRelation() to parentName\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\nlet attributes = {\n        key1: \"value1\",\n        key2: \"value2\",\n    }\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\n\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\n```\nResult\n```js\nid || false //if no relation and parentClonning\n\n{\n    id: id,\n    statusAttributes: true || false,\n    statusRelation: true || false,\n}\n```\n\n\n## DELETE\n\n### delete.deleteEntity()\n\nList of options:\n```json\n(name,entity_type,flagDeleteChilds) \n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n___\n\n### delete.deleteEntitiesByType()\n\nList of options:\n```json\n(type,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n___\n### delete.deleteEntitiesByType()\n\nWill delete entities, whose has relation to 'name' in 3 level depth max\nList of options:\n```json\n(name,entity_type) \n\n```\n\nUsage\n```js\nvar TB = require('thingsboard_api');\n\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\n```\nResult\n - Response in `success`\n\n```js\n{ \"success\": true }\n```\n \n - Response in `fail`\n\n```js\n{ \"error\": true, \"message\": \"error description goes here\" }\n```\n\n\n# List Postgres Functions\n\n### postgres.get.allObjectsIDbyType()\n### Promise get all object's ID by its name and \"custom type\",type\n\n- List of options:\n    - type: `String`\n    - entity_type: `String`\n\n- Description:\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n\n - Usage\n```js\nconst TB = require('thingsboard_api');\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\n```\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsID = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\n}\n```\n\nSuccesfull output example:\n```js\n[\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        type: \"device_type\"\n    },\n\n    {\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        type: \"device_type\"\n    }\n]\n```\n\n___\n\n### postgres.get.allObjectsIDandKeysByType()\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\n\n - List of options:\n    - type: `String`\n    - entity_type: `String`\n    - keys: `null` by default, `array of string` optionally!\n\n- Description:\n    - If keys are `null`, `all` possible attributes will be in response!\n    - type: custom type (`Локомотив`, and etc.)\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\n\n - Usage\n\n```js\nconst TB = require('thingsboard_api');\nconst keys = ['key1','key2']\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\n```\n\n- Error handling:\n    - In case of error, target variable will have two options:\n        - `error`\n        - `message`\n    \n```js\nallObjectsIDandAttrs = {\n    \"error\": true,\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\n}\n```\n\n - Succesfull output example:\n```js\n[\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name1\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    },\n\n    {\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \n        entity_name: \"name2\", \n        entity_type: \"device\",\n        key1: \"value1\",\n        key2: \"value2\"\n    }\n]\n```\n\n___\n\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\n\n#### Information\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\n\n - For getting \n\n##### Steps: \n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\n\n##### List of options:\n - entity_id - `string`\n - attributeKeys - `array`  \n\n##### Response:\n```js\n[\n...,\n {\n    entity_type: 'DEVICE',\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'attribute_test_april2020',\n    bool_v: false,\n    str_v: '',\n    long_v: 0,\n    dbl_v: 0,\n    last_update_ts: null\n  },\n...\n]\n```\n\n____\n\n\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\n\n##### List of options:\n - thingsboard_uuid - `string`\n\n#### Response:\n - postres id - `string`\n\n\n___\n\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\n\n##### Information:\n - Column names are define in object\n\n##### List of options:\n - dataToWrite - `array of objects`\n```js\n[\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'test_attr_key',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  },\n]\n```\n\n##### Response:\n - To check if data was written to db `compare insert count with response count`\n\n___\n\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\n```\n - entity_type\n - attribute_type\n - attribute_key\n - bool_v\n - str_v\n - long_v\n - dbl_v\n - last_update_ts\n```\n\n##### List of options:\n - attributeObj - `object`\n```js\n  {\n    entity_type: 'DEVICE',\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\n    attribute_type: 'CLIENT_SCOPE',\n    attribute_key: 'Работа по программе',\n    bool_v: null,\n    str_v: null,\n    long_v: null,\n    dbl_v: null,\n    last_update_ts: 1586949836446\n  }\n```\n##### Response:\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\n```js\n[ count: 1, command: 'UPDATE' ]\n```\n___\n\n# List of unclassified functions\n\n### extendChildAttrs (options) - Extend child attributes by parent attributes\n\n### Information:\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\n - Set necessary attribute keys in `options.attributeKeys`\n\n##### List of options:\n - options - `object`\n```js\n{\n    \"parent_id\": \"some_thingsboard_id\",\n    \"child_id\": \"some_thingsboard_id\",\n    \"child_type\": \"DEVICE\",\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\n    \"updateAttrs\": false,\n}\n```\n##### Steps:\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\n - For updating child attributes using parent data, set `updateAttrs` to `true`\n\n##### Reponse:\n - Function doesn't return any data!","readmeFilename":"README.md","gitHead":"08f61b88564354c3b985bc3854f7527e01e98d70","_id":"thingsboard_api@3.0.1-alpha","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-0wa8LgWjEWsmmDEiC2fkAQhWPQx5RTQPqQymJ9GYFbJg91zXUtRFTKhFuYoNIksP/K6cytpkZ5OaHS4pYI13KA==","shasum":"5aab90c781e1a799223ee715910496b214d854f4","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.0.1-alpha.tgz","fileCount":11,"unpackedSize":64723,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBdovCRA9TVsSAnZWagAAWYwP/ArhcVK4IQUX+acA3wtn\niQrL+QOujz1m7tMae+ZisvoBfHI9EV/fSnu6Z/3RD5RR4ec/VkChPJKZFRWO\nkVFc5aExt9o3az5JPDPebHJBKqcfANQ5I8pTmAmmaulP8z1jre3EaInN+6Q9\n6SOnjkp3ZYAcRcYqUCg4Hu75Yqn2rfu97yEb/HMhMN36F6A8ZIwMLs/dNj0x\ne+zrnfnuAOcGMEjPLL9UiqCsO51xXlbSMY7bLNRtRSfY07sdF51RPCJTgDa2\nkIdFQGyjntMR5qwUoUPQST5KsM4L5sUvfF/BjBD+ZUi9BHLBzk+h4xc5BxoK\n2K/VqAVavtVBNVWwIuXFqAm9oTHLtHAaMx65NRoGNB9JsmnXVfd3xhZC22jS\nZXGqdMEOC6Ef7Kr2hxHCCTzTSkErhvDtveST6fpsWcWSEJU17dJIireZO0wQ\nvz9ncZAOL3q3gV6ksaSDSrLs3YNOLchYu/okzWgeZJ1WhT8ay3DiDz56Sb5s\nNit6xSiTCUO4BV48fx9x4J82tBOvuguUXqq9F4SBm1CF/b+dYIBB5sBnXlwu\ntfWnjxrFQnD6JjUCRV4nRAhBEgd7KRE8rjeBaWxzMHNLG5nrDCKY1UyMcHPz\nsAZUmWb7gyaZr8QBU4Wk1QsY4bhP9OABMNpRiQfd45yvH95+VIq9z7ccQEhH\nOqiz\r\n=6bM1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXN2Zz04tby+avu/SqRYlv0unexrHGxecAsJpvXiafnAIgGVRTYnRVlDGMPxcbWk1b728PUjqFewrTCPlX4qmUpjA="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.0.1-alpha_1594219054685_0.5355131403584847"},"_hasShrinkwrap":false},"3.1.0":{"name":"thingsboard_api","version":"3.1.0","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0"},"gitHead":"bc8c37e3ce4b71deb7fda6981a1016b731f4f301","_id":"thingsboard_api@3.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-l/t1hiFdymKP4O0BWfKjUD9SLugOB0TjYpsJuKEVfL85eVEQGbz2prItERnq/okcjiAKen75ouXf6LU+nRQuIQ==","shasum":"d1f7e5b44c2bdb10680f3ed412e406490c599631","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.0.tgz","fileCount":10,"unpackedSize":63538,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDBh8CRA9TVsSAnZWagAA24QP/RjMBIG75N6+OFoNa9oJ\nAtJ9f0NrWaOL2DlxnPmDVI7C7yXlFLogdiF7iOUV2TH3BmK9zFD1BCDsSZKI\nvVnLe7GsBZVPz7UOGdq2tNKD93wk5I40M6d1HdnOWwdxPxLzhJHUygqN/gtk\ndHiun+MJb6FRYlq6eknoU/1estJDeChiH7W57swEz+NyIUkHwKF3CZrWKlWw\nMDTHSkPnrjmBKcQtOL1nEISd8Is6Sux9VwrgTmgXzvjqP0CPQRulCxKLEP5D\nMxC/SYPiQ/jp+RAs/pRWuJhwExi/aOwK5x65GvmmYE4XUM9ar7PIMa7BUY4v\nMNmKqsLni5xs9ZMinaN9M0kGBCq3ygJZCGS1igoH2kjwxnPpLAjb0XtCcNm0\nnjZuWHUzbx9NM8GjCDWBX4yQSxbXt2FWJWblRZ79z3Ff0kpXcmKJgntcyGKS\nPLm2fOocjzP4EJZ8yuAwFtOCQdWWyHWitccRqWs1nB+H5GMg8tmPKcgfCQQP\nUh08eDnWrfWDZPbtMmLJY3395D6C/vn0EM6seu1hpsp2kmGPPsplPiekyEpg\n/oPD8HBJzCPmXiDY8APrKHMfpCXoTRbTkoN3ZGVEzbJBIMns470R7jsAPyb0\njH/SKQATh9adA7/4BVi6Qs7LD18hqTNDEgEzR1U8+AtZoONuorGCJ7885yab\neVrU\r\n=SgHw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGkVW4WH7JxCDF4ame16S8rxlyPpsEmkZRXALkNZp/z2AiBksgo7Q/saldxwqFlbsXdlg/sUNszcTrlB0hDTaXrz4Q=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.0_1594628219792_0.131338138508853"},"_hasShrinkwrap":false},"1.3.0":{"name":"thingsboard_api","version":"1.3.0","description":"Thingsboard REST API implementation (special edition for support internal projects)","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"contributors":[{"name":"Igor Kovorotniy","email":"i.kovorotniy@2050.digital"}],"license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"gitHead":"ebe16c299874168c993f4e13699c95f832d02bc1","_id":"thingsboard_api@1.3.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-9xKYKxb8sbNBNT0XblYbnkZ8bLIQhm/pICy0mfHsdWABtafrifaUPTj1BuBDeow5L6n5xledpZz1O16XpDVNig==","shasum":"8d10dfc827aae76e7dd486063f1ef0fd6722963b","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-1.3.0.tgz","fileCount":9,"unpackedSize":49861,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDGqVCRA9TVsSAnZWagAAizQP/1keyjfW28jWtDW8LJiL\nIe7Y7XSBzYNwYvx+mGovnTabGWxHZqapa85XyhjAhgwmsUs0caJMWjTogEqY\nLifJLSKw7Um6FdqVVChkM6Tt+aHax0Q+XMNUM0zlXLKzEA667LHuvhFgl/m7\nkBwx2A6nRCAy9GpUohW0XErBnEK2rImm046Eird1AZ5AOTzFeappz+UZc6Yt\nfgdlKCvRJOByDvIXbMXVoLNHkRA8jV31BRYrIuWvCeBf5J91VkBfb9Wxb+BR\nP8cDr8gsWt5HwRM5vBclznS3/X6lIN0iPYt9sD8wOQOjSVSx79UpRy2jSxxF\n1f2RMi88aNfau+DFiy7gC4J3VVSTP/9ZJXU7GE8nDzOiiPT9EIIrAuhVdglp\nuyE3Vng/RaHWr4aChsuKqEOdC0jAW/XohXoE1M4vw20EwpovT+rnnDvYWTD8\ngnHVRVftVp5ePsVV3YoOGOXmAFkXGi4cAVIi1PRQ3qkw4oWsyndQFGpOdkHs\nt4wwPBxH8kX6ydykn9peDByLcb90jgtjDm/oJgzGH38Ppde/XhnGssdLt6fn\n+BJpLVtYJ1yasc6ZBNRgLEopsrqsLLqbUanX+E9BNm4ymxzh4v7ZavHJiGKG\nCkByNhXCmfpMqI+SzGJBTtAJ2mFVKmX+c/YKq96y+170KwP4J9EkGp7vVIt/\nZKRa\r\n=1GSN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAdJZZ+jwDmx7++Ea+Rt208xYS2SB/MhtoCmatbGzHuwAiEAmWVJZ32nne45pG9BKpIo8B3Bp2mlqy4aCKOIbvrJNII="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_1.3.0_1594649236865_0.9959706558528088"},"_hasShrinkwrap":false},"3.1.1":{"name":"thingsboard_api","version":"3.1.1","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"85b45ffe6cc10dc81a3ccd2ed56a7f46a4715820","_id":"thingsboard_api@3.1.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-2gRkj2kiOrgO1LInPYjap/QBFuZ0y2L3CY5pabhRkgHs4tBC2mAMRifXNYR0HyTpqEu1hw97gDML7slg2NIS6Q==","shasum":"b885ad70abb3b934fa3de30b7e51f3c09b74af04","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.1.tgz","fileCount":10,"unpackedSize":67007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEVZHCRA9TVsSAnZWagAAnDIP/jzKCUqgh4y+x0x8s+In\nQilleljZtJTUU41dIu3aNGcvwxFsjraWAhFGdna0iobc0fz1Wt6rppJ+P2gU\npvMWm19nPwzhciFYWkikNyXnRWspK6n1zco/SXRZs17R+qMgeTqGWdLJNsd7\nhUoJutFLN9GXYl9BDjij278ntakpPwieKTGdnbxz6Js0P3NUnKr5i/xdYYCt\nIifl+utlkHluABVS6JxlRywOGkQAIj+MZiRx0ZxwgeO3hTADLzsWomFqHYjo\nFNAZgUtA5krQJQ0W+zWMm8iH0yQyOkGL6hkRS0LnfJIds7lgiS1Pl6oO+CIe\nKfr16QjSWddCAe7YoV0HodStHky7t4bZhqfNyc6yJQvgt/LTnCmr3W8y9iL9\nNprMsjz+1C3mCDvvBHUAaVIuuTLHYIVSMS8y+SXSZcy66PWju3yEPT2Ji0oe\nprzX9PPjrshbCUvwHBe0q8vfgEoGMUzntzI9NHt1LnroTtvQ7ux8Fq30Qye5\ntWber4l8xzbfIUn3eEhpHHJTXPulj1UpaGw1AE7FqGPsty4mV5CGOw8G3ovW\nylXGeiJHe0q4ulZFcpjobvDvXCxUYVOHVAtwAA7467cOmRUHFtLh4QlKfAMM\n4OIkQVZ52TaDsK8yDBJOM6Ol8gVbK/ruG7gTi/T9oYIfhhOl0enbUykli/Y1\nb31f\r\n=lrTf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB5B8Ybj6KCRiZBV4bkmUKIOtqaKLYEnwR9OuDP0j7+oAiAVvFccpeOBiU3W1U2d8izlOLGeK01B7hDz51l0t41/Yg=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.1_1594971719484_0.418317066085079"},"_hasShrinkwrap":false},"3.1.2":{"name":"thingsboard_api","version":"3.1.2","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"f47c430cfb893338a0b13ec0abdfce1ad5b3c678","_id":"thingsboard_api@3.1.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-O6qU4IY8nMnVmfAKfqGfc36lG8CaHS3Dd1WEa5p/VXxGJeAeCiPLaF41f3BuklMzyMJGfcIVBQTWQ6/BbZf4sQ==","shasum":"06fa8db862e498430025b0586665859e97a44e14","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.2.tgz","fileCount":10,"unpackedSize":67036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEZYfCRA9TVsSAnZWagAAZ7QQAJDPDIljkggZas7oK/W6\nmyYlTWFzHbyIZz7FqHcbrxZz0uYJl2VRScWj71QEu13eTaUo1qb0lFuroPHM\nIOd4HaXWu8RcldOJnIdRcwLyCn7N1METCGAhKgAUHQfyB/cSJjtuY58bTWsX\nxKojcEgh0T9RjkzgUNgrIjeMxHOlyLJB21/pSnJ1fZLuMoo1NWv33lxa7pZa\nueg/cs4KFhYsOTAVJR6HpFxGxuXoRiszcq80aZZvodUQcqxQuymixZrQ1bQY\nMT2lLG0MH88NzLAakishSFjINX2lUXXUy81szGuBxuppvrroVCaO1iQTqqaq\nFG4bpjfeKR9bAYxAyFV5w/sselgrwrDKc+svO10fX5hYUSzpvpN+k2y6hGBg\nY5Mgm3K3MGhMDZTVzftrSiQz6OcVhgJGF0gzBF3DcCGWTDZvnP71jyIiAyzu\nL+OB01rl8HKPOE2ZCx/cjSVfhCkuoIrZkV8GurSXAdg7TIdiklSzHAK+HDdi\nZfby7X0HkK5ZZpo1QlyqjlSy66bVr+Jj8vgtUUAiCAqCy2j5OGIKBq+6uBBg\nQX3mYC94VPzB02cLCc6Xzfqm/+JAuFyNhIE4OokYRXJZuKgl/iF87RClv5rk\nEnlsba+idGoET5q+0aL390kfu5dkOPSOVfqyjAKogBSqUXwjEqPNtnslurLc\nQ/kh\r\n=ipt2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICJbgIb3b4jO7vD5t/F4c+AIPjhuQJGgwyZMU8qi0zplAiB9Ck3Lega1YF9WWawbTspCAiZbUhXmXL/mx9lPHl6ppg=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.2_1594988062722_0.3805665327478138"},"_hasShrinkwrap":false},"3.1.3":{"name":"thingsboard_api","version":"3.1.3","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"d21eb5cda07fc94e5f1fd8ee7741313476cd993f","_id":"thingsboard_api@3.1.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-4JVBOm3NERCxPluwT0NRcUWRWS3nZXSQGytlzXKj/rmsWbhG4f8+dSlgAR5Q1Zj57QDifOYmYBGQGSK50D+AlQ==","shasum":"ba10f741a20d3edd19215ee834f43a504b417070","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.3.tgz","fileCount":10,"unpackedSize":67288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEau+CRA9TVsSAnZWagAAEpkP/0AKUPdGzvgyNWGyDxby\nI+ltByCGxeKGJUcSS45IjAwg5lSXCCu15v8Lgdwyk3peOTZs36ai2mC3dBze\nNy7RHmHoqUZDgrrlxeQ73bdRD2+7lYsYnBQDH++lsIwuoqquuFZZN9y4hYSI\nc4yOChG2Wa6FSWarPu++hY0xPVJSnJ+sAJ1+ifCygyEGTgqQzNSARa/o8rv6\n5ZCo9phtVNra2xT2Jqwpq5iDS+4fxNMNBcLWEy1APbsgcnPGZed8sMGFY0+2\ntHzt9+Yff0+xn0+0IYpwK4OKvmXGucUXbYJwiuzXjsoAmtHX4Am62ddDDsPP\nFacteZ5kUama8sxFHwBz8XTbH5TaYNc82rxXP+siMAeE/2l0QmcI5UBbhkPK\n5Lxw+egsF8tPpyZGeDjq0vXaX56ODsFdiW+UnL1GrRbcS2pW4l1YkL8J5/GR\nfUYpZvz2fwLrN8dtrIvGgHSU5Rpdyz3l5cel1QhzAFtShROgIVMyiDJvQrpF\nt9Myk+zhicszt6ewSb1RuX64GS9bP/F/6nuUZSn1flGplT1VPk/USrXMa5o1\n5WpxUwAlgzj4+ATjrKyC2UGUIVRKBGvJvZ0A9Pb+6KxAlAM5XW6fHtRPQQkh\nFx8zlLFjHqFP9fdofQYhrXoN3weXNiCCBv7aGPv0P9cJLDq4p4GfgNJ6Ikd9\nnZz9\r\n=3Ngc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEShgJlJ8Nvt/Af9f/pWW2Sj2gCLqyBqPeYx8OMNnQqiAiA8avL6T7BP8C8+Z0P4R3KdyRhT+plheX+kWRMhIblxvA=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"kovorotniy","email":"kovorotniy@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.3_1594993597703_0.6448575614399423"},"_hasShrinkwrap":false},"3.1.4":{"name":"thingsboard_api","version":"3.1.4","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"197d134182283b4f998aa83bbf805813339ca21f","_id":"thingsboard_api@3.1.4","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-XMoVSjzHbKjFbBMyxK93CrmV8++xZtWmQWIqYllCIGal3kBm0sODa/mkyDqUfdufi6TsBZ5nmUpThC+2iaKE0w==","shasum":"d9eacf774b90b392c2fa2ba01c90b75ab717de0e","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.4.tgz","fileCount":14,"unpackedSize":70460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfThiYCRA9TVsSAnZWagAAWRIP/0+BSThlzRKbrQMCNPwQ\nc6e/eGXnGHaWAvtsWzOo9gVJeEdS3FUuYQS3tXYjjlhGApH3AfJoBGO1mANe\nGl7gaSgeJSUzj25jEMLu0FhWhx98/FK842g/S5KJ/V3N91OzEQ9nRb1/Ou9m\nNDbPeVQrOPGQJXGp10b1IVmCR6SH8X/Gh/0CUhycrAQTf1t/+aLhJOicH9ZO\nUefDI/4/o8rpUpKdxWV3GCTcoRBGCAHO7P6QDvELfCMnkLHVrMj5Yuqf6xE9\nc717r4myt1sYD1We7Lb7M7QwaNOd/3eobokfCcQMoRFF8P1S1/Uw85Gezomq\n7vwXTA4Hqz43eohTVk+sQHtAraA6RnDiavzgLjIrs5DNTGQtwZx2eXBgEw14\nCFp01PYEt1Kp3N7pjKSRrm0YsIHw+01YRMWAd97+KXUoeSOMnkQkOvXyrW1K\nGLkzSJ51Ate7bEg5VCz34k4qSOOGuhZkebHLr9NRPpm5SQauIDT1aXhjyZ/4\nVV2XjVIeeRZkITOrlRA3UJdPJ+9mcz3uIQ9YVTr6W3QLza6udf0176BzN0zW\nm8hkGaVEIC8F2In+AaAXaw8959P9NrzPGHdFOFiXsAUWuPuv7CFBZkfkKy1H\npItvpRUpvD3qgZT8cqS66Hgl75cLdFQt/1AaAfnby99rpvf9A69hTWpZoX4o\nKDg8\r\n=+TCG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGTjyNT60nANT8L47bFffs0Piaps54LP9txZSRClbAdZAiBI9aYHjXwXhtigmGHunOpKNVdJjmWSrXsbPliAggRKag=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.4_1598953623946_0.39236499970773075"},"_hasShrinkwrap":false},"3.1.5":{"name":"thingsboard_api","version":"3.1.5","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"8c3ac2dcedb1f9bb6849a9ef91386903e58cb7c6","_id":"thingsboard_api@3.1.5","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-gu7S02GDm+vYsP6opqrlN5oEeM+1DwNuAOOEn6HmiaPH6ifEzUvZaDHxFpIvqdmWbewv7ekxdd7KOnwV5AyavA==","shasum":"3559a153b5685569f93a5ef7ca6c659b73fcd966","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.5.tgz","fileCount":14,"unpackedSize":70405,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTiMYCRA9TVsSAnZWagAAuOgP/ivwSEduY5XhKBRE7BZ+\n5E5BYwtgGgPsGKjVVtw1bIsvDWzHJjDbDszkXD2cF2B1caHJS56OeUJhY5LE\n86E36p8Bd85HI6E08pJmaMPhJP8D+pY+OBneUBm7De10GTMMB52fichtO20E\nWo+Cf2QJsVoVb6INhgOUZOpuAuYL8d33TfDkIyFATZbU+zKh6fyOM7lEk6Br\nj3CD+3J9A65iqh56TE9ZEwDXlDdX1/O/lBPSF66dAEREAf7wjEXZlF+7FzWX\ncETRXaeMnoPv92rulCyVppj3DSUPoM36Oj/Hxuw2J/rJMtxIGuwNkiIfRn4g\nm2RvCwD2XQqD1px+VhNoakihBkXr3ISiCpGGUAe6xGxhHnHveXSEiKxxaJei\nzvOrnoRXwrEf4Tz6AbWwBT0okaKS/TuWvBsSl0bgG43ysJrORTh10z9LsLwV\nh32bFfoXFFQjJyVyc7DfZYXC1GBugZY+FZgADtFGD6XWI7c1IL7Uu5EVUTdF\nILtm9e/MwTRzErHlmGXtYsMAhJlrUMEMhvC6gON/0HoCnA5qHVClpES0tFdv\ny9z/pEQmDAKuLDX9lQlrEtsLoTgh3ecp8oRXQ97/QaXHyqCCwV+2sgZvFxsH\nBC/oYKR2noXaFwSVCtg5dQlo5HkcnfdNA3CGZCMdDYs7CuxY+5nnnhr6z5O+\ng1Si\r\n=jlz/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCXJJKRjhLvCsf6QrjQ7YVo4fvh3Add2n/6X/6t2IaOcgIhANsDgUQhHoRxRB1vS/4SVI5BMcirvw7jJjdFw5IiQxDh"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.5_1598956311921_0.10180845533500271"},"_hasShrinkwrap":false},"3.1.6":{"name":"thingsboard_api","version":"3.1.6","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"e5c9bf88a90542d39b4645bc916196a5346df426","_id":"thingsboard_api@3.1.6","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-9gIlytL0aFSY5L/cRnaQl+S4upU4hQepxODHuH6jcD8oDUrVHOlZr8zwacD7IlJmaHSOO+GtSRFGnGT8TcGV6g==","shasum":"77045b70cdc529509ba7f74b795141130bf331a9","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.6.tgz","fileCount":14,"unpackedSize":70397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTjM0CRA9TVsSAnZWagAAG6EQAJP0gvfnqSmwIihzFvaD\nv6sMME/VkRIyQ1pzXOADuWJcMRyfMaz4Pwztu1wLE8CjXled0ChgSHLY44kI\nU7msocx/4ZzWbvs+vVHW+Po8Yvd8ewjM7GCnfQR68Ci/E2hM+jojA56Mdakc\nxOYNVcYXP5O1Ni7no1609eOMzrSN+R2t3r/ujK/Pjlk+rLjg1fe7/q19jTpJ\nXJiH7zTS2HEi/KcYFYYtuOjG2wgEJOa9SDmbVwXaOnVYvo5FN01ktNJxCEYw\n5mFbn0ZqO7Gu2Ulzo5fFcB/0JlbDjsePFpF03qDrGRrj3PsAVBCAxo5q6CGs\nN1+l0L/PWbbq4Te/CQYZjUuFM8TaBQjVWVSI747wFR5d0l6R4wBzxvhwEoV6\nKnDs1k5/0L3s1vq+Z0tkPAJjlAyV0DNmfkRreHpZMu91WrXrboywzIsoebFx\nRgqiutdQx01p6rj7x9/NlXi+gLSzLpy9USOMhXgW4xHA6DK9FZa/y0A3zDio\nzC/QY6gZwRrs9EcKlyR0wNftsF253ccuF2EXTGi1G4IUinM2RPs8Zs4ud5+x\nrVWwk1s7WKaXMgnYka2acE8NWS8h5Dbaz9huElkh73hOv9u+Le5cApTEmWot\n8QvsYhcvkQyPkGPZax27cCHWwrI65Ctbf+AAYcd1uecuobHWc95RS/KV9J+Q\nCtJd\r\n=2Gjw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICnEHi5hZqyaxPKI4/K6mxH6c3fjdbNW9Vvqrr9R7ZCjAiA6FtRzn/iEMux0+cyTJHs1T8dIwNxrHep2S8rJD6x+nQ=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.6_1598960435986_0.7650333590586755"},"_hasShrinkwrap":false},"3.1.7":{"name":"thingsboard_api","version":"3.1.7","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"0e8ce04b6562d72aa5b96ec7e32bc2376292981b","_id":"thingsboard_api@3.1.7","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-KmdHfaw+u4CbIqr0NGHGzt2NG5BoEU5kkwtoWShyEXIAEjTz/lJAw02C4LP+YWoXkFf/DFe2F2RxUf2Tsl9bKA==","shasum":"17f8c7f55cc01ae4108c6abfdcf71ddcea39ad44","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.7.tgz","fileCount":14,"unpackedSize":70592,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfT2ojCRA9TVsSAnZWagAAT3oQAIzSErVp/8w14/6qsj98\nEa2Cu1oZZ2kHSwUCuZW2m8aZhf4eXFhSF4I8HovMLzbQydqso9tiOlzmsPri\n+JBgbakkwuteujs2eSGB5FKNn2EZpjUsx2SknvLanJga3z3Mbm60MuBFdRGO\niArcDgyelSJPTe9hF2qO29wcD+hCuRpslGQ5FEyvWiy5/J7ZBN/g/MlryRIU\nABFJxPvehpPESbuFEMROowuM8+blDVSRFxcqPJ1Z+NoDLDb0WDoreewIkiJa\njYTHU3P80t69w/WNBvRmVQvIULaEzr/eKGrsVrZUBJSUWaNPgSI24u+hHnVL\nhteWN9EnGk5IVJ3lwvxsfFRG9M7Vdu5XWmSi8pPUWQq4oUzd4XgLlRG2X1cS\nB5e+VcwIyw998WHXipsQwMlyL+Snzb5r28LC2UfcfxA8QY/DyCu28JO8ylee\nsq1br6N7r961SMAQtDCajmIvnXpfnhBbxsbLXkWsP7CpC1IPpA+xtLeuZgNr\n9QCDXLOV3MGLXn4PfHDmO8dwmaCsnX/uuQ+ZgB5Bdri17lqC46ACLQ7PXlLE\nLV33Mp7qmA9KNcZDkc7eWfxmExfnah9Yu9GRSCKu3V79oS149n33OIr2/G8T\nMf0M+5+4pN8oExpEbIe8TznBT7fBxicOYanCFk1sgixafzvuS2KdMMUVU/oU\nwtZx\r\n=CRcQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIETgIYHWtdLp6BCGj800drIJjgjO4TkipfQtNiDiIEInAiAXiK9Or+BeJUSCGTJt2x6UAA7d4t/5lTAVShxGmTlZkw=="}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.7_1599040034677_0.21730935341420543"},"_hasShrinkwrap":false},"3.1.8":{"name":"thingsboard_api","version":"3.1.8","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"2a226f78c9f90f1b124dc183ef7985c62df7f786","_id":"thingsboard_api@3.1.8","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-pts4iIgCtqTlQFJQ5IubVlAnOQ7YyeCn5fKJJQNtDYychdnwEQ3UeBn3IbKu2jJ47wsYRr0RUF1AC1yClWfd7g==","shasum":"5752a39903480bec77fce19f06f0aaf475ee0f5d","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.8.tgz","fileCount":15,"unpackedSize":72364,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhFe5CRA9TVsSAnZWagAAjx8QAJ8hU2Ytcp0YMrQGhzE2\nnx1xpWd7ktCTVfxh+NAM4tBvcrkncP3x6d7itQwVPaX3ulo+YncN1poRY/4f\nO/pApcUar+tXCY4n+z1y9spv0whgWo53ypH3mDTEcUj2eonv/uzHzmrN9EaW\n2QNySWnfTcrZX2TUZjkRTjq5YphckVLKcD7GMtStRFTwRUL2vmciZmBVBt06\n5YsE6uZHoJqprQFPgXjKLsyjD9OQeiZWmtN2VRcWAhbySvrPd2A2TyMSnnMb\n+9Gn+a+GuDnEHwHaScouKKAIkhRUlh1xb7ddcguLiu994XxW5RMbwdm1FLoe\nSGabheUGAfPZqLUUljxUH1QAN5yVmieydT8c8wRnbwQXQl/JTPpcY6oxuRKi\nUaKIT+/76DL0XGWTmLW+iZFh5WYmkhafAnlzkb4geh4NDrQOea6DOzR6OznZ\ndPY3h4SjfzEEmLHbIvtjiJ3et37DqDMeCUiiKCdKUy4QQY2eTbHuhBF46Imf\n5aDmR27LUKOULrp2Gynn4RPFyADw5ka2OGRz8TZ6OmgZD1RRM04W5jHgn1ZZ\n6rQbgtklQ6vwz1rhQMn/ZjCqRs6uH06tTQUU52Fevp37RDYf8bl6rabSpqRc\nYUp10cWznDB9QUighTyAiNVmUfp7JVE6RJmNGkdmRmqB3Kcj1+Jv1Cj1GtWK\ntIb7\r\n=6vPW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC85NNc3Fhuaq4h/WU6lF/uvHpGdUx+tT8M6+vchHozBwIhAPJCULS0YDzdBY2Sw0XnmuhR1eCFPZZCuEBKXkCYVDPU"}]},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.8_1602508728686_0.6323651604273193"},"_hasShrinkwrap":false},"3.1.9":{"name":"thingsboard_api","version":"3.1.9","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"b14c66445a66983c32df5eef7257b9d95571a085","_id":"thingsboard_api@3.1.9","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-rKCwGD9WrhT7AJyXCgrC3f0CO6ZxrQRtQzSBgVKAJByHChPN/5QNmbcE5sj26s8d24F8atbdnOYe04XAOov/Yg==","shasum":"0a88474bb77d21fb45ee86547b4113919d6b9a01","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.9.tgz","fileCount":16,"unpackedSize":73607,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqldcCRA9TVsSAnZWagAACkgQAJPir3xKzgM4oqtzPfif\nmQzcGwg27IHtKQSxUSdsRO0VvQTB7Ck+yADo8oGuTjocFAMq5e42nSw4MH/J\na/uEgKg/kF7ZtwEyXYTBWz2cIrbAs0GwBp30JznXwrTsXzzWf9onhvgu4aSA\n8/M35ZpYxWizCrgYh8qrljwYDm4iSaHOaEwXL+o0kqqahF4qX/Cnw1u4siYg\n4kg3G6uquo8ruda/Ia1TdkegyTVY5FU6+LOJAVvAWUVrNk/izEs4P+6m7qCa\nCo9hSnEqDg4QB26oMT+NIC5s5dvduJTP03XV5BPjpzXrW+NxDPnvK8egigaB\nv5FgU77W9oiG2TCZK5ehL5CXuRkLICBUeZ4YZKZDmiKzHsAcL46nJOtnjc4T\nTm4vPYeA7l43j8qV5WQtJc/PEGzxn3TYH1xmRYx8TIVcXMj7mbrPDUjNOmRQ\nhgWNHxla4/GufBDujZVH4RDAtZiSXlBMqx3kwZzLaWNQruT61JHdTZ0xVQvc\npW8eMMfP9m7RsjcB5RxeTzONCWNi6FcfhvNplDEDFSAVSSw7JZLoDFoKYF9w\niBY2nAKidmgxlDsZxQ+Xp7zJVMohER+dlr9Dan9lrdCqL4DoSwzgdfVHvngC\n0O5CV8HH47sxuekTn9b3CdGFk8YG7ZxRisDZKVDbkl1GTiQdYuJgXXPw7Ijh\n7gse\r\n=xftS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQcLwNIywxzxxNFQfWqb1QZgfr5Io0PsuP6To1mlgJ+QIgGzVcnRNOlOYezAtfxU6fWpn2fGwNL3MPSDW0G6n0tHM="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.9_1604999004035_0.17010247010046853"},"_hasShrinkwrap":false},"3.1.10":{"name":"thingsboard_api","version":"3.1.10","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"fb90c782dc709c6c30fbfc1a8153f3c4e074d649","_id":"thingsboard_api@3.1.10","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-LtsJ/omHL5W/nmCQ+3ukHl5y6ubz/eJt2bfdxoMFRJOC9fRrzUNbuCG8RLKi+5KOR+nnaWICXISYeCjuT2POkA==","shasum":"99df0728c8a1ec204130163bd00cbfbd4983760d","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.10.tgz","fileCount":16,"unpackedSize":73838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrRtwCRA9TVsSAnZWagAApA4P/3A/GE0iS6bDqKvRTots\nQQaYz7rYqnnOQUn80aLVPqJ2WUgM61m0SGRPy4U48E1fdyrS4Ce0x6kTgM4d\nlr1C7qpjyteQ5R7UmzFWCk4l6Up5EezStBqj93FqdA4ayJAjfyKfZEC9XipE\nH1n1NoHXYjb2WQidLTWNZGmXUTlQfmE+85HxMr4w6HBSyShv7AbkUXwAIZUC\nrzNwodUuziyB+h+2kctoihD5lxVh3eDrm+zOda03ysFta7qpbUjBHWiXJzac\nZ8rGmBDRkUT9MW6AhCy2Yjfp/2g52oJzLGzHShxAb670cikaoZSk+YC2iU4A\nStz1qmB1uNcnoP0tovo8AiNH1I68sekpPVjFnP1vy7ej6YxIaCQbQZR+8vJp\nCI/HGsjoPncBBS0atjNWO2YE0CslBH4cLNDZZ6Jnc1EIsyICiTH09cixDZ3i\nMLStbREs2ZoRIMbqRMevZkima1/qtmX7QDdk7STmd9WAGBgtqt1utfXEa6ZD\n/oe2NkkfmtT7YzY5P9TFAeMNqtN4UQWt+mTjXhazMxZqGuOUy+7fx2jJBXVJ\nGsM19D0B1TR7r4J2Dm3867FjXhyV4EaE/6M8cMp/ca3wj1Mv4aZjywyeZkdL\n7BA1yXNCTD8YNW7xGqykGgRrRgTt/kObbjvK/I5m0ebMHC6tsplMES9wKFOs\nqNzv\r\n=uDvW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDToaLjs65OYnP1Dv0zd52JslmBWfpyqU7sHs7JA0B9gwIhANEZjSwEYxuEXimJQ2NIqpMYAbexkyKphkYaLZ3Rd/T3"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.10_1605180271864_0.36684062898306924"},"_hasShrinkwrap":false},"3.1.11":{"name":"thingsboard_api","version":"3.1.11","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"b337b82975f599bd7cd0f6184e731fe97db8ee87","_id":"thingsboard_api@3.1.11","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-L86A+/FApmx6nZ72JDlqTwKMF/duLuFtyXjrMa4yv3FACDzXD1dA0BGw8jCaBXvpxZgl36bTWhfo5qlNNcuKfA==","shasum":"36a913e30f5e55ae2546c802f7a6dec7119caa4d","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.11.tgz","fileCount":16,"unpackedSize":73952,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrSVgCRA9TVsSAnZWagAAkiEQAJN9u7EmU1gcIRtzCgob\nO3n685xUxD8cDcpiFYObhfvS77Izy53GveeRs6hTyNo8HBcNXFN29KBi0p2J\ne5jYq2OH/plpTuA6dE7kklVVSid+d/MBCi6HVfDjH4CmPufX48sw6B16WIr7\nbCRQFORwuX2y554SKk0PgcmoaXZzR7G0vbgfrab9n2cilU7w6rW77uhrXFrk\nuZjXdcgQodCcMV2thaglwv5B6aea5gmat97vCI44GRSG7F3RwPV1ppR8nqkC\nm+yPm5IwXYJmgGdxAGlHegwm71Y2HUNv3vvfwVavoWoches6j3RLPlPyF0hU\n2n2kn3wMNSaG9a28FwQcHllv3PallNeHj/6TyzsCtOOFOHsCz/TGianWomAn\njvziP9GzxRSCXLIncwDW2+lbs7Je0OjcUPbxmq37UAo6cfRAH1b2aeFbqiC1\n+rcIb4I7mh1DvsTWPM9Rr4Eqok6NB8BcCILgu8MEUNx7Zg7cURX5ll2eYSGN\nYI7SunNj6xJ42OIWxKl+GUJYDk9XxH30AfeTHTo1n955yHEREnWgIylDE27p\nkRZj0bEi4/2D4Rh02S5yS/LNNFztQ02IDeNeFAFAzt9RwVEEXRVvVyPAyO8k\nrm6p0n4OF6gwl4hFhyiYBBeO5XZpcX+haHsppnuqbWA0ZeYj6sZkwbUeidTS\nTTZ0\r\n=Zvn+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJ9H008eWErsc/TvQZNe4aIC2Qhf8RVJze9cbtDyzaKQIgA2IR49yjbPdNbnUV6O4vpEjoep98L+QvAkVmglvYhS8="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.11_1605182815927_0.10869236508061841"},"_hasShrinkwrap":false},"3.1.12":{"name":"thingsboard_api","version":"3.1.12","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"325548d0102d637c24031e940b075fb79c5dbc4f","_id":"thingsboard_api@3.1.12","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-qdu1NtGuSoMoEXAR8yIGoKailoyRxdy2nnSOfmgkfznVi7hp++U52OiY5GUcMDyfZD4xP6pEpCVNh0vGLLKeUw==","shasum":"6ff2e56eb3581dd3f45e5e12374e00cb2ab74889","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.12.tgz","fileCount":16,"unpackedSize":73981,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrTLgCRA9TVsSAnZWagAAdJ0P/1Og/M1a94svQ7Wc2xJj\nNvJ4d7gws3iTN3KpGTGxDHPWbOE/T5KcpGNGlQLky9XFwqght7UqZtIuyu1j\n+ZIyNXoGkMVR7wfHndDEOCF26es8+UnDQjGfJg9umD/wLIO6fBzXuFMBJj4Z\nTDdhLOydfDb1Dq34umoG2AFYq530mnsQoeYnF/pHT5Lh6rAwi2bF2VtKc4B/\n965YYRGY9trE/9sFMmezfiaOtc10XyXoTkCqhtdn60g5wr9u7BEmM8N8TOdk\nZySHe3AdU/cSQmVqQlXztLScrc44AjUVzlHcKimOjqCg3uiwVgJWJ41UonJt\naMm4t9RHh28Y9zI+BxQlDVgwsT5oKZbxkAPczGQZuTskQLBQ51itrAZBQbfF\nxanRvNA+bAQHgZFe1tNE4ArIUbI8s2NG5g46KZmwE1Qx18pf7XhI1slwbyio\nVM/2fB0zNnfmo2CXW8QenenUBOzPloldXexSn/BRvCHNw7oX2vAZ4X6TbZ5e\nKU0EoZp0vuFOqD9n+KxkARThoU760kd912ulhZjas+F45kuTp8RRv74D1KXy\nLdi6aNv4ZN9ljQ1EWyxjcdP5oTIyXNeWnM194HJjJG7gami69/QSP9uUt/Lm\n0HZT3KyklsRDXENFoMqwkU2Sl3hbtjhLr/uL019LWJWJGuWtMiOTel9lUgCk\nsI07\r\n=tumf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeXWpe1y1/H8EPGpp3bRlHjADBZ65dNfTzZxcGU/uvDQIhAI+U+bLxSYi/LdTuP0n2QnAoCfbTZjB5jI0BYgdxXsc2"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.12_1605186271912_0.5417621103185404"},"_hasShrinkwrap":false},"3.1.13":{"name":"thingsboard_api","version":"3.1.13","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"892f281ff8b22e3b1b061a775b872935eaa68e32","_id":"thingsboard_api@3.1.13","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-yVW3zMMIC0ORBlFon7dPo7nACVLMKoqLWhzCS3XCj6gHWwYLxZGqST3nWVpMbJRgSP7qCuFwoV6yJ+8uaxZczg==","shasum":"b0822c3e89119c896575ad4cd96f309e05f60f9e","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.13.tgz","fileCount":16,"unpackedSize":74087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvMypCRA9TVsSAnZWagAAEYMP/2lcBJt+nTG85fqCNUvp\nNcoCHcic6lTuBqj7hJEOF+EswWsRXX6L5lCE7fR2x0MU94gQqoT0pwhxJAuZ\nXp28W7QmY9zGj+iQy9Zti61B4Y4FOMP9YBaPI4CpJBYTNWEHXUoyEOh1L2E9\nSIkmJI0tagNFHOrFQJEPwQGg4TMszqXVty5NhfO3njQELWRsJ4o/0TZzraal\nc2MJ1BgYv7Wtg1hHZtP1LtCQ43tMpSTV5gZczmxCRPVPRzjA87VeUQkyJ+FX\nqNZF3KinWAFvpFKhpD+gZp8PhDQYCZaAfvjEJX1hAxCUXsLVuyx5BKd4Pq1o\n6TqBoUGsCH7J3kUu9/YINc5gLq5jxbz0DK3VKPW7mIVcuPkD5fViaNHvj2Gk\nfySatm9TsompvsbG0o4UR0sJ+BhIpVBHD9Y+HdMY2RZL6XDOA9gYsQ1rxroc\nkwYC7bKNVn4TxcqdKefsXpTjQEuKYVmUCXgs3EPseyPAVp+0fCrUx0Z6V8SH\nwjmY4mwWe/vgzc6gxQmsW+Wcxq2RbuN5JmUgmGrY3tM6rWMGxA9jENPdEdnn\n8+HDSJ9ZzNK/Umy1sgUEuNznJJom2hO3sHHoXeb7vb4ztrBEhxKVxsZmt9Lh\nYzJvQpCcp5XsfG35yTtSKs1bhsKd+AUdGNusZQ6Tp3uVe4SQas6zba8OsHhL\nafjN\r\n=d67t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDS4BWA6QVEdfttg3ypJsloTnqBFJcdYz1CDPHplJw9UQIhALA6R6GnKkAXw9+BH7lmp/kkMsDRjYz+KIVttLeygqQw"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.13_1606208680899_0.8167375491241486"},"_hasShrinkwrap":false},"3.1.14":{"name":"thingsboard_api","version":"3.1.14","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"ecffd337bcc66e21da8bf505aa097cce6b4afaab","_id":"thingsboard_api@3.1.14","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-Ru9OGEpZqK5foYM4VovibO62HSoc4kjThiOVvaM1AUvrDtrnYMU8FYLjV0KeLvqpxt2DKuTDFKxiOr7UWXS2tw==","shasum":"223d502306f7e584789d47b73e92defb0fb1d0bd","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.14.tgz","fileCount":16,"unpackedSize":74095,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvM2OCRA9TVsSAnZWagAAmLMP+QA61NZI3Nd0Mi/O6uPb\nl+GknSks4Q9lnhNQ3tuo793+EwsaYDM61H+aEQJ+yr9PCQRWjLfVoItF0yT7\n8fNqvfAU5RzUFfomtwq+c49S/ZPN4EOPSXYk2NsCF4v65OzfhEio12G3Rtxp\nQsRHvKDjoRoxRFkeJSKtqqIz1zTcBMfiky5i+IfMRpYZbFXLHATtGddJnJ1c\nbRftc+Jt6vGED4Zb+1IZ3qDd3T+wIHCpmm9u7oezyL5N+GOmF3U9tLZE3cAl\n2I1nrsJoxyDW9RNuNSqa7cVyPtR359qgsBxLMJaijqtqMIYeV1+MdslZAPqm\nFiFlmc+OsTjaFRofuIhLbOCYZQFoEAB6b9Pim0HqZDJYuo36azVxkg/C0Ujh\nYkHh0uWregR0zVrL61FnWNo1WB0BO1vktz5UXiFpzZprBEZKQ9eAdEKcNSvg\nWuatqg19OAg5S2DuSO3ZocMQ6CiVVUJhM1rI5c1PuArRmhLU4UTrpx+dNXcf\nzFcgas05mjWPsvB+G2BD12pRg+Idggigl6u072kLgPUyrdKXHYbV/7KA5Rnq\nO1AU14pENSALY1Gwoy45u07sNsLjaLPAWWlpVRcnujl+OCkX/oY2/1Sygx/E\n2/v62gJBxKYP5etHg3FPZY52aEOQ7Ovs01GH8HSMKN878RqPWL463Orjew85\nXB1C\r\n=W6VY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCunY+5781i7GsSxXpfz+kN+gGDT7DdgE+6eaVcDHAptAIhAMQMuSfJu5L6o2VDAif3dKR4SN6/5lW6nCGg9PYBhkkx"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.14_1606208909939_0.6024551745617974"},"_hasShrinkwrap":false},"3.1.15":{"name":"thingsboard_api","version":"3.1.15","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"645f16b216ed8a5eca89fc2ce586d5684eb3cbe7","_id":"thingsboard_api@3.1.15","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-9BIzuwkT82s7pVL+CsDfsu5MJAt9J2/fEkXlGcFG62E/P7R2xfgvrgvNRU48LTkzrPjB7FVHfasWBvJ5ZZjNzA==","shasum":"95a6e786f143aaf15d91bdd2ce0ae408690f2c36","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.15.tgz","fileCount":16,"unpackedSize":74975,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfx1d7CRA9TVsSAnZWagAAWlEP/idYKEj995sfJ8wd2kcu\nVnmsc9OuzuarXUViVI55vUU+unI1X57x16SxG1YY6YdFpxke83+RlP1b54kY\ncw2pr9CibY0RO3ZO5OeDe8HhHSosbaZYzQHBba8h9JDE002O6IyHjaFBr6zR\nAgiuh9sEHTd6LjoeGAt/yFehLjxiJGSv3K80n6iQEWwT2IJH6c+48jr02OSb\nuQGnLu5swx6k4wztnRMymFovR9k+6QkbN6hMzCRB0DBamjlfPQyAkKrsAYKb\n2/I7d+qteJnONf8x0mkY7oScA6mVlAhShwotpenKghMkaSpVOJe44py70TTN\nMg5U0v2iyGTzF1M9pm1wdTN/Qm2P75VJ8hP7JXTnXjlzFIrLw+4A9LZFSXT8\nONkVLiTWDhK9zBXJ11/5VIyeKMOXb41DLEmcB4WAE3g9sma6rhVKb2H3kI5T\nGwe0+Bz4sbj03lG8CoA8UPX1PSpt2td2AbatJBfdR7RqrSQr0CbKKOLW993O\nqPBr2UyCv0xrv/Z+AwixPIxCTE550lNZD8dMEBKl7ok7wBvAYAqhClqDJd7R\nWSKSCaAUpQ9HOt2KLMC7rHWCqg2wrM5yVY9/n/zaAfUEpZHvZW2PM337GC9Z\nSePsf6CBwx0LyaY/Y28GpEj/AkJiS+tEDBy15hoyRAyM3foXIJzprgdhGSXh\n+NbD\r\n=kMQe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaKM1VDtUn1/0l/IS1QdeNAQOg25FCSARzvLccAlI5BQIhALOVYGxo5aQUm13ZcorQLfs/K/4dXi1lX5+N31hptv1+"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.15_1606899579236_0.8672178784941027"},"_hasShrinkwrap":false},"3.1.16":{"name":"thingsboard_api","version":"3.1.16","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"25a316b17ebe8b3a6bf7a6cbbedb35a7859eaa59","_id":"thingsboard_api@3.1.16","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-gSzs4ke0X5ARwLpZbUfHFujDftwNAKXNnYL7i8Qprq420srD4aMFUjExYdlCibVEMrI8BNUB3cTKNO/KiiA6Wg==","shasum":"024913066b285e9bccaa5ab14d279740382792b1","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.16.tgz","fileCount":16,"unpackedSize":75014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfx1oiCRA9TVsSAnZWagAAlUEP/REzhECcnoD1SQWeemNX\nMHI3rsKo6kDBOoDAI5wm5DDoVFCPTsOM4WG6HA7BPPoIQHPzyAWZchWtzihP\nMnTy5ET9/XEXtFPsvwiiOW+jt+Ab0K3KpazZ0kBHhzaI5eKbQH74m3wST4KM\nC1+m9SxRv9vVHiU84+iBRyXhYoKHbOl6hlKZ9OCxSFAh+wSWHNQ/9CUsCEKy\nsQSrd3KGwS1tJA5GGIF8LzH60vFtdxFQoChEtfCzOYrIgXj0enFZr3h9c6EP\ninDIUmwiZfvxEY8oBr2EyZNSfj6pf56gUDAXJrWYtwM29Qt//ae/l7AS6z+H\n8eBEjTIoS2R1bSS21PykFT1iSK14bYORqGaC/flgOPpVEDZqpwDxEIKA/RrQ\ngkMSM6j2uSJSAkmaKaR5+zAL5Don2npcBKJX/7s5eVcTra5ITBtkPkzCFByC\nl0KbwhVNd+zcEXtsrJHE7KLp2HdmZunTtcKEZIrBfgNvINf8DveixY5+f05q\n/stP0FTJEgd8k81QRf/KwDz8oEql9lq9W/tSUGpCKQcisGZD35J0aFBP+WTR\nUEN461RC/Qj1qKBwXgbWWrzYOYyriWeomzUzoV3dpmFuAWHR9P3LRqdyjYqd\nsFw0DdNkTzmuHdfy3m7RRiNbOEHmxItT4vLh6I0kvY8V8OyUmXzqV3lSkNs7\ndPkF\r\n=cSKx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9bot1bjAhrc92/jCz7TJjYFE+CIvN1Gi+krUnd4EpCAiEAxzKogKmglgF/SamXSpUlGE1gBA0s5Lm45IYvqrdV1+8="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.16_1606900258397_0.44094746970749"},"_hasShrinkwrap":false},"3.1.17":{"name":"thingsboard_api","version":"3.1.17","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"b134667d8aedd55b100a12068b00ca5e47182355","_id":"thingsboard_api@3.1.17","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-blEZiZLSStbNxhr/DCRDCwc86yJ2DBFhQeT+f1HkAoTkm3rPEndF/83AV2vLvwbpbERgHBMuiNBCET4BunekdQ==","shasum":"5ab1b1fb21f01b9f4b910ac36179e24be8e7ee5c","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.17.tgz","fileCount":16,"unpackedSize":75175,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgF9JeCRA9TVsSAnZWagAAwloP/2hqWBvRPpPBW4xsHFWc\npJ6qMU7Pe9PqKhPgTFNm2eg7/CewYZ1fKqeIGmxrE8bxu7z6RjR09jt3tb4H\nX+Z1nihq5jH6eLEmAH4SgOORMSmzNXCRX0oKTxy0fsFE88LvfVXpXWIWEf1s\nU90dOhYQVeDuur9fEjMCFH8xfQPmvT2WuX4Pvu7U1D14Dpf+AnGRNZ1vRglJ\nHdHI1hHcBjUAMs71oJUOhYOWzi5JxZoc901syW9O+UB1dmTBiJufQoSYsgor\nKwWyIaQ7B8NviRpYtj6D+kFkhLQ7PzH2CSOUMASOw8RlrdIbErAghNtZV9+5\n1cTj0VgnBfURzkb1myMH5+5tkexfFCiLBrlWXXcaAchEUqp3XsbVtz6MnI/w\nfucRBsXofSujow/u2kZEqEMuD1gArGexU27D7gKaGtRAhUCxB8yUpe27bocq\n04w5i99h9980jI5jyVESlbEuPXySeQpwUEPbnsoCTLozH7AJmWJSztFcgIlx\nbLbk+7ailhMaxhopSVsYCgOjxLbIa9WFjP3ANXPBG6cz5ebNA9cUE3A+vou8\nfF86Bg1lPlG+pXUjUfhEkyqtSd7IJGg59HTGXjAIOyDGEGW9XiGt0V/OeZYw\nqZZahCCGZQxPzw57Q9J9kT0BaGZsndO4Tg7LcP8un2mrToEUgbP3lKebRTDq\n9Omu\r\n=9jRI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAd4MjyIIptHy4HAGFUneaxOIxwhFmPRfqMf2T+HVTeVAiEAnyi9u9OMGwyfpmF0k0gXu8/IUCZBzIWVMyasAW6dC54="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.17_1612173917804_0.028707053329145138"},"_hasShrinkwrap":false},"3.1.18":{"name":"thingsboard_api","version":"3.1.18","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"957172472246654beb90b53d9271598d7fb17e28","_id":"thingsboard_api@3.1.18","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-JbajcM2M7RQ3cqjtFlToBA42dD8HOJ7tHJdd/ehc/fc4OExR5LLcUAi+CeevUYwhr3nf9W0iljyMFYXxg4vGoA==","shasum":"f9eab9da68b8d214a54e489696fe201db92f2536","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.18.tgz","fileCount":16,"unpackedSize":75171,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKoXxCRA9TVsSAnZWagAAoTEP/jy/+mTbpod7cTxq1odz\nrralZ6+ejgwi1t24CQIemUbQ1SDdH+to3VVEBJFQdX82COrhhhCviX6/aLU7\ndfKG8Dn/QkOqtbMqEltAGBraxLXMDlccxbF4qU44GUr4BHqBv5MuavZYsXCe\nO2I5VDpMm9qSE27EnJFCNDRhdBvwG+dHa4e8n4txJSlOAfkCGwGtjaPQiYz0\nGZCMOm8rNpjJd2XaQF80W3KxviiAMn7STlV345xpr1RrL7ocCD/g3yuqMDWh\ngNOVaiB3qWfDgjDEkriyA/dejSy0hkJV/GUe/+CXg/HzqPvDR2hUfJ2KrsDp\nwa7IkwfBotvpid24lmvu5s4h2KpBGW/diMyYQO6oyK196altV8HdbHD1J2ZS\n6RsCzNE1Ve9/iCejysyNc7frjyjJ7g5CoFeyd+EJM44X11j4LqLp8aeagGa+\n9LwMagjCov3kiodoemB81VReNIV+84yYPyUjGYQiuVIea6rdE+ZcC2CiNeK9\nSN2ZB+JwsMI+t6+wedZOfPu4eMGUpgOeQ10zcfYeF1bGopbhG9wjcOR6Eqq8\nqrARhXVA0YbtpXVxYaxMWqIJNjsXHX3xSH/0vSHEpNGumyawNRIJ2NYDcvoi\nz+tpqZUXCvB0rgmTkad5Ukgmel2MIt1J8ycDrvaTBUag3MYoFQcLkeh6Bsb1\nW1fS\r\n=XyZF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIlnNNELKKxcQ5P1CT23X9ObtDAsGjNLX93QMd4ZDihgIhAORacQ0sWi1qVG4CcECLUeXSv6k+hTROuTT6gKRnr/Or"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.18_1613399537232_0.7062105904030034"},"_hasShrinkwrap":false},"3.1.19":{"name":"thingsboard_api","version":"3.1.19","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"957172472246654beb90b53d9271598d7fb17e28","_id":"thingsboard_api@3.1.19","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-AY4sz6IR4VvzVdA7I9Ry5Pz3YeINeKT695iHbTycSr5lDkEZx0NxST1ZZuuSXesIY8x22CaBcZ1eaf5m5SBctA==","shasum":"5b7d944797853bf5b5b2e93e1e29123d74807f76","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.19.tgz","fileCount":16,"unpackedSize":75185,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgs2PMCRA9TVsSAnZWagAA53YP/2BCbawRf0qU2evho8r/\ndwNtTaY2cEX9VWcH8Nyzd+E7rx03375FRorBKcllIqtTyZT8F/4WQpc6q9fN\ntja1/lPU4oD4TYYbXguBxq+R/87XQMRxDAWB5KvXQx0LIGno26bIYNB6BI+h\nEKkXrOp8PJhctk223xPMxXlmxRp0yL+P8wYP8inRFx3Enca0h2TWuPK3SorU\nO7ub2JJyRLhOnJBK2n6BpRNcfMR6jT7sH3+sDMhQjIyPUA4fKqoDe1WTeLqp\nt8dVzrpudw+tHT18At5D0LWXO8u4H4Ldm6vAmbaZq/FVZHiMh40gAt8qDmGi\nEwF0vtPob5x2LEWCRwGg4vW1Tc6+nlRdwit63e5MLxE1mxMZDFxojX4ErApv\nlK44u4dilghf7sNQ0eHWz47vjpyPtYLirE121hePVNLqgt42dchH6AW22Wue\nrbApTTnX5sTSuVv3NfeqszI7ol5X3IjxUvzKZPx3J9JNqlGSS7E4S5ktPWuI\npBDEr1Ln+XAJ9386tIrgSCpbYPufttgiYr70WKbOqY3czAoge6wnp+yzxCuh\nSIED/ZjCdL70gkdTG4wxQ0drlVMLKWo9gFLODUqBjDV0ZR9o5XDyiQdoqX7x\n4WwK3PCeQOSWqvlUq+WTbwmVdmuELzEtEpVp1sL4USWGaTLiqhWCxVjIzaLn\n6dbP\r\n=XbdF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUezwZtowRF1GluzrxtFOwPGCmSFtgO2ARsT2KZC7TPAiEAwxOH2kS8msEIScUvWgwLwXxM3c1Kiw6PPVi6FOM0big="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.19_1622369227347_0.9067305049829235"},"_hasShrinkwrap":false},"3.1.20":{"name":"thingsboard_api","version":"3.1.20","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"957172472246654beb90b53d9271598d7fb17e28","_id":"thingsboard_api@3.1.20","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-0fv24M8WC1TFRxyTy3VILn1J6PV78T3TKZY32Qm2X7VSsUbAB/D+byFRAmjT5FObJMRnrdZ3/EJx5BcoJiMJdw==","shasum":"513379e238a96eda6aaf3adf55710f0649cee595","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.20.tgz","fileCount":16,"unpackedSize":75252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgs2g6CRA9TVsSAnZWagAAkUAP/0sBz0oygRyG4kfrUymp\n3qq7He1YnPBxC6JoDfdJWTXFjxDfITg1DPKIta4qu0bE1yEz9WrbXzsTLTB0\nAX3d4O08jO6JcuHhrh1RuOrMjjARguypZqI1/23Q7zNiLMBfa/Do8M5muPD/\nYvUMSlYwnK6NJTuTCnkAgqVwXRb6NDkb0wHEnbPkQ+QtPHY2niLnvz+NB3SH\nXI3aoUtlSncYpU+jeiq2OrgGG5DmSjjEpWr5d0hYW6dg+2AOMgrGtOYdqdJl\nbWP05Y6hjncMBmomydi5VFRl3rF7zvimD560MicxXEjx1BX2eI/kozoad/PF\nwJrtkN7l2sIzgqMN0HUrxUkl4OJGShwHLIu7PdB5F6t8sHeLkd+aJwsuB3dv\n1PbV/3dpohFhPG2BWcXFCuiIcG//J5H0q8T9irVvzfHmKbe2UfhnPFsAleho\ng+amHQxvHLbLmEgiifcLbZ9Qmg6kZrAUJdrxQOuDosC4WtG6y28tJAkZ7TAc\nW7AkK3U5BA7IE1hFVJGyCAppP/NRBs3gyecPY4znqZ+hCQ2JRhHxmYG4SPau\nvEmYLoCBJ+2jDXSnPYjRuFxEvjZc4jaDClBQWEPT1pO6MMpOUQOznIGzxRpg\nSrVFHK95j1xHfwILRFpib+h2hxV+/tbitl+bm+Ka5/SH0AhOinoRl5tmvG7a\njaji\r\n=p++k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVhGBX/hBzF6kqM2cGoqSXBEMGVNxpVEY8M3CUjb9hnQIhANqWNKksnqP3e4Ok3oy66fJlyVzHlm80fgEjMcWfco+s"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.20_1622370362327_0.7077996675625258"},"_hasShrinkwrap":false},"3.1.21":{"name":"thingsboard_api","version":"3.1.21","description":"Thingsboard REST API implementation","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"collaborators":"kovorotniy","license":"ISC","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"gitHead":"957172472246654beb90b53d9271598d7fb17e28","_id":"thingsboard_api@3.1.21","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-Ii8M/ziiJlKKdrchD8d7woFgGBB6OCz78UEnlKUmTCDiBh5yw7/hDtRHVgeVidhzaaQ4QHVyvb82otsVDyYLBQ==","shasum":"cb6eba6ca0e0818fdf576172605197a0c1b854af","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.21.tgz","fileCount":16,"unpackedSize":75252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgs2jiCRA9TVsSAnZWagAA+hcP/iEZA0G009fcE6NEUUoR\nn+uBskMjCB7z+aQHdz8NrZSolPth/j/l/CNYZUeaZa3hsTQ9yhVsNcyPZNDV\nam9b9rnl+iFeU+V1+x/5f8Yw2cgg/tllr+WrEoFln+KbMODARbDXHGeNiYJK\nxR8ypPyqmLjfYrAWlsljxsue3AO3Ek98JBj2y1ZtZE9SWn87XUsj42GBsdEg\nokD11mBXMipxcY2by08DIKoCixuIUapuum7zrxau2Wl52Y1Wzt2IZvp8hUEi\nvPaDyDtrWIS+puFoK1bsfkOsBRYauLrmbFZvSxtR3XHn4bVO3j/RjfsMc7Yz\n8H1CpNFhF+3v6xs4CjpAo/81BeMF14+BNAIIneJt/ScccbcOvQ3KVQqnxdrV\nfoPsbP3bXGrN4h7Sfco4iTxKQ2qZroiuJZ/J3CMJROMtYPlAatmhh1zeUL3s\nY6H8JHAIDspIHZXZDiq8BvhR8+BnBUrS2a8H0wvpmvyOPtXjidJ3hr8YX8HW\nQH/sV8Pgw5ksfA2zfMQpikK4n6hswCrT+LhTfk+XKbTUjhULMiXLAR7v5nfv\nnO8zjiXYbwZIIoSfawyYipPx/Jq8J3jmtksi9cxA49O62wwbVJZreJwJRA/l\nnBACr82uga2FnuqWF/IUOOLiV3l0EItEm+M5YjDQ9yfTJFvf5A65JQR4Lqf1\nQMBP\r\n=H7kk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDohRMRmylf3JBdIv6OhuuSHgeQZjMwIr6WlSF1iLbRnwIhAIF+QWttJEcW+dbZZkNDGWPnX4r/FKSipWgeh8q65yB+"}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.21_1622370530253_0.11201622597149963"},"_hasShrinkwrap":false},"3.1.22":{"_from":"thingsboard_api","_id":"thingsboard_api@3.1.22","_inBundle":false,"_integrity":"sha512-Ii8M/ziiJlKKdrchD8d7woFgGBB6OCz78UEnlKUmTCDiBh5yw7/hDtRHVgeVidhzaaQ4QHVyvb82otsVDyYLBQ==","_location":"/thingsboard_api","_phantomChildren":{},"_requested":{"type":"tag","registry":true,"raw":"thingsboard_api","name":"thingsboard_api","escapedName":"thingsboard_api","rawSpec":"","saveSpec":null,"fetchSpec":"latest"},"_requiredBy":["#USER","/"],"_resolved":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.21.tgz","_shasum":"cb6eba6ca0e0818fdf576172605197a0c1b854af","_spec":"thingsboard_api","_where":"C:\\Users\\1\\IdeaProjects\\rfid","author":{"name":"allive"},"collaborators":"kovorotniy","dependencies":{"axios":"^0.19.2","dotenv":"^8.2.0","node-cron":"^2.0.3","node-fetch":"^2.6.0","postgres":"^1.0.2"},"deprecated":false,"description":"Thingsboard REST API implementation","devDependencies":{"eslint":"^7.4.0","eslint-config-airbnb-base":"^14.2.0","eslint-plugin-import":"^2.22.0","mocha":"^8.0.1"},"keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"license":"ISC","main":"index.js","name":"thingsboard_api","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"version":"3.1.22","gitHead":"957172472246654beb90b53d9271598d7fb17e28","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-GfT+X9pZURy0dKaWpeRxmxMC3LQBDTpyCHfSgGfM0nwY8IFH3TD9N2j0gcE/zFmj8TPKlsckRIIuZYiGhs611A==","shasum":"136b38070416a3873e9e624a16d940872c8c5486","tarball":"https://registry.npmjs.org/thingsboard_api/-/thingsboard_api-3.1.22.tgz","fileCount":16,"unpackedSize":76047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg9o54CRA9TVsSAnZWagAAT/0QAIWcpkjs3gW8rZ2l46nk\nWb1RBhpXSRkmvjkWJsOKY1Ro8AbD+V26s1Ji+rbWRmv8cAe392m5dga4q/b+\nwREkXa1TNSQpY9HumujvZfwAq3jlYWQudp/WuAheBvFL3M5zFYmAgDxhRybk\noEzQ8lkX0h6K97HT8tzrvv12suAg68kMV/xD+7fFGyEsQsh1LXtSf7Aic8y3\nOHU0ZZZhMPgQK2xiGoysi9fC39/rWZuQ6IOZ4GqcQ3p8BUaSMhuYftSoTGbk\nXz/3B3Y3F27xpPFICf/iMlFKJ1B/YmfxQp0gU2NsGQW/mUgrOatZKYnJAaBN\nZExVyq40yxr8PAo8vMxE+huVADAx2p884Epa0QZQIgr35Xgx9MGzQnbzqg14\nERgV6q+n9UhAn0/7k/bjJL9HRnmoGq/+zzeeN60sYJb42bjcP5Zcxjt9TwyL\nK/AY2MayU0r1IBoVVGUaPVN0LuVjKV2wycGTHPepB9flbvcoeqGiesJiH8Nw\nJWTyAYw4jzxgDrlEV56bk1yjJvqir49fTnvljFDuloVQ5N2+8c5xf6nvyE8z\nbVlpNyoZ5VCZHQnMY+hpEAqQDBcc1YMHvxy62bwXeMqzfRXDy6U9DuOfjJkN\n3n1Zd7ZoZiV0VK7eYtVFEDQP0H9JqDdAEdombIHOIQpuVCTLTolbBCvpqrvT\nCTE1\r\n=s8d3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGV7OXhedpF5pLadmqL8qjiqulGvOZ+jfZKGSQ7KtHg8AiAFbKf+mc02S2KwReHXj/ymUFzgsh2ITpqozLAiUDsaSA=="}]},"_npmUser":{"name":"allive","email":"a.ivanov@2050.digital"},"directories":{},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thingsboard_api_3.1.22_1626771064620_0.10609208873881482"},"_hasShrinkwrap":false}},"time":{"created":"2020-04-09T14:14:17.184Z","0.0.1":"2020-04-09T14:14:17.322Z","modified":"2022-05-21T18:27:32.705Z","0.0.1-a":"2020-04-09T14:20:41.711Z","0.0.1-b":"2020-04-09T14:22:04.320Z","0.0.2-a":"2020-04-09T14:55:30.448Z","0.0.2-b":"2020-04-09T15:10:36.269Z","0.0.3":"2020-04-09T16:42:58.000Z","0.0.3-a":"2020-04-10T13:01:58.200Z","0.0.4-a":"2020-04-15T11:49:00.462Z","1.0.0-b":"2020-04-15T13:39:34.685Z","1.0.0":"2020-04-15T13:51:57.094Z","1.0.1":"2020-04-21T09:47:39.579Z","1.0.2":"2020-04-22T08:54:08.031Z","1.0.4":"2020-04-23T11:08:33.275Z","1.0.4-beta.1":"2020-04-29T06:24:33.924Z","1.0.4-aivanov.1":"2020-04-29T06:42:20.365Z","1.0.4-aivanov.2":"2020-04-29T06:47:32.368Z","1.0.5":"2020-05-07T10:14:53.480Z","1.0.6":"2020-05-12T18:37:50.191Z","1.0.4-beta.2":"2020-05-13T10:48:34.544Z","1.0.7":"2020-05-18T09:06:33.110Z","1.0.4-beta.3":"2020-05-19T06:41:07.911Z","1.0.4-beta.3.1":"2020-05-19T10:47:50.815Z","1.0.4-beta.3.3":"2020-05-19T11:35:29.315Z","1.0.8":"2020-05-25T20:26:57.691Z","1.0.9":"2020-05-26T12:16:51.146Z","1.0.10":"2020-05-26T14:21:07.758Z","1.0.11":"2020-05-26T14:27:18.013Z","1.0.12":"2020-05-26T14:30:08.704Z","1.0.13":"2020-05-26T14:37:32.917Z","1.0.4-beta.3.4":"2020-05-27T10:26:57.957Z","1.0.14":"2020-05-28T11:17:49.202Z","1.0.4-beta.3.5":"2020-06-08T11:06:19.867Z","1.0.4-beta.3.5.1":"2020-06-08T11:14:31.510Z","1.0.4-beta.3.5.2":"2020-06-10T11:08:49.151Z","1.0.4-beta.3.5.3":"2020-06-10T12:32:25.184Z","1.0.4-beta.3.5.4":"2020-06-10T12:43:38.166Z","1.0.4-beta.3.5.5":"2020-06-11T10:44:39.803Z","3.0.1-alpha":"2020-07-08T14:37:34.777Z","3.1.0":"2020-07-13T08:16:59.950Z","1.3.0":"2020-07-13T14:07:16.983Z","3.1.1":"2020-07-17T07:41:59.611Z","3.1.2":"2020-07-17T12:14:22.829Z","3.1.3":"2020-07-17T13:46:37.900Z","3.1.4":"2020-09-01T09:47:04.084Z","3.1.5":"2020-09-01T10:31:52.079Z","3.1.6":"2020-09-01T11:40:36.111Z","3.1.7":"2020-09-02T09:47:14.873Z","3.1.8":"2020-10-12T13:18:48.942Z","3.1.9":"2020-11-10T09:03:24.226Z","3.1.10":"2020-11-12T11:24:31.993Z","3.1.11":"2020-11-12T12:06:56.112Z","3.1.12":"2020-11-12T13:04:32.137Z","3.1.13":"2020-11-24T09:04:41.023Z","3.1.14":"2020-11-24T09:08:30.230Z","3.1.15":"2020-12-02T08:59:39.594Z","3.1.16":"2020-12-02T09:10:58.512Z","3.1.17":"2021-02-01T10:05:17.962Z","3.1.18":"2021-02-15T14:32:17.452Z","3.1.19":"2021-05-30T10:07:07.535Z","3.1.20":"2021-05-30T10:26:02.495Z","3.1.21":"2021-05-30T10:28:50.411Z","3.1.22":"2021-07-20T08:51:04.768Z"},"maintainers":[{"name":"allive","email":"a.ivanov@2050.digital"},{"name":"kovorotniy","email":"kovorotniy@gmail.com"}],"description":"Thingsboard REST API implementation","keywords":["Thingsboard","TB","API","HTTP","REST","2050"],"author":{"name":"allive"},"license":"ISC","readme":"# Thingboard API\r\nBasic auth and get functions for Thingsboard REST API & Thingsboard's Postgres DB.\r\nPromise like implementation\r\n___\r\n\r\n### Changelog version 3.1.3:\r\n  - Fixed issue of clearing alarm. In the most cases earlier it doesn't work properly. In case of error, it returns http response code.\r\n  - Added methods:\r\n    - [pushAlarm](#pushpushalarm): Allows to create new alarm\r\n    - [clearAlarm](#deleteclearalarm): Allows to change status of alarm to `Cleared Unacknowledge`  \r\n\r\nBugs reporting to `i.kovorotniy@2050.digital`\r\n\r\n___\r\n\r\n<!-- TOC -->\r\n\r\n- [Installation](#installation)\r\n- [Usage](#usage)\r\n- [Error handling](#error-handling)\r\n- [List REST API Functions](#listrestapifunctions)\r\n    - [GET](#get)\r\n        - [createConnection](#createconnection)\r\n        - [get.objectID](#getobjectid)\r\n        - [get.objectIDandKeys](#getobjectidandkeys)\r\n        - [get.allObjectsIDbyType](#getallobjectsidbytype)\r\n        - [get.allObjectsIDandKeysByType](#getallobjectsidandkeysbytype)\r\n    - [PUSH](#push)\r\n        - [push.createRelation](#pushcreaterelation)\r\n        - [push.pushAttributes](#pushpushattributes)\r\n        - [push.createEntity](#pushcreateentity)\r\n        - [push.pushAlarm](#pushpushalarm)\r\n    - [DELETE](#delete)\r\n        - [delete.deleteEntity](#deletedeleteentity)\r\n        - [delete.deleteChilds](#deletedeletechilds)\r\n        - [delete.deleteEntitiesByType](#deletedeleteentitiesbytype)\r\n        - [delete.clearAlarm](#deleteclearalarm)\r\n- [List Postgres Functions](#listpostgresfunctions)\r\n    - [postgres.get.allObjectsIDbyType](#postgresgetallobjectsidbytype)\r\n    - [postgres.get.allObjectsIDandKeysByType](#postgresgetallobjectsidandkeysbytype)\r\n- [List of unclassified functions](#list-of-unclassified-functions)\r\n    - [Extend child attributes by parent](#extendchildattrs-options-extend-child-attributes-by-parent-attributes)\r\n\r\n\r\n<!-- /TOC -->\r\n\r\n## Installation\r\n```bash\r\nnpm i thingsboard_api\r\n```\r\n\r\n## Usage\r\n - Better use environment variable instead of costansts or hardcoded values!\r\n\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    PG_HOST:      'ip_to_Postgres',   //no defaults!\r\n    PG_PORT:      'port_to_Postgres', //no defaults!\r\n    PG_USERNAME:  'loginPostgres',    //no defaults!\r\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n\r\nasync function main(){\r\n    await TB.createConnection(options) //\r\n    const objectId = await TB.get.objectID('entity_name','asset'))\r\n    const objectIdsKeys = await TB.get.objectIDandKeys('entity_name2','device','key1,key2'))\r\n}\r\n\r\nmain()\r\n\r\n```\r\n## Error handling\r\n \r\n- The most of functions support `error` and `message` keys in result object! (See update status!)\r\n- Error description is in `message` key!\r\n- Example:\r\n```js\r\nconst result = await TB.get.objectID('some_entity_name', 'entity_type');\r\n    if (result.error){\r\n        return { \"error\": true, \"message\": result.message }\r\n    }\r\n```\r\n\r\n# List REST API Functions\r\n\r\n## GET\r\n\r\n### createConnection() \r\n### Promise connection with TB creating. Starting crone for token update every 15 minutes. NEED IN run once at start!\r\n\r\nList of options:\r\n``` js\r\nconst options = {\r\n    TB_HOST:            'ip_to_TB',         //default: localhost\r\n    TB_PORT:            'port_to_TB',       //default: 8080\r\n    TB_USERNAME:        'loginTB',          //default: tenant@thingboard.org\r\n    TB_PASSWORD:        'passTB',           //default: tenant \r\n    PG_HOST:      'ip_to_Postgres',   //no defaults!\r\n    PG_PORT:      'port_to_Postgres', //no defaults!\r\n    PG_USERNAME:  'loginPostgres',    //no defaults!\r\n    PG_PASSWORD:  'loginPostgres',    //no defaults!\r\n\r\n}\r\n```\r\n\r\nUsage\r\n```js\r\nconst TB = require('thingsboard_api');\r\nawait TB.createConnection(options)\r\n```\r\n\r\n\r\n\r\n### get.objectID()\r\n### Promise get ID of an object by its name and type\r\n\r\nList of options:\r\n```json\r\n(name, entity_view) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectsID = await TB.get.objectID('myObject', 'asset')\r\n```\r\nResult\r\n```js\r\n\"ea791310-78d2-11ea-a1c7-d1e730c27b32\"\r\n```\r\n\r\n### get.objectIDandKeys()\r\n### Promise get ID and attributes of an object by its name,type and keys\r\n\r\nList of options:\r\n```json\r\n(name, type, keys) //string. for keys can be array\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar myObjectID = await TB.get.objectIDandKeys('myObject', 'asset', 'key1,key2,key3')\r\n\r\nlet keys = ['key1','key2','key3']\r\nvar myObjectIDandAttrs = await TB.get.objectIDandKeys('myObject', 'asset', keys)\r\n```\r\nResult\r\n```js\r\n{\r\n    id: \"ea791310-78d2-11ea-a1c7-d1e730c27b32\", \r\n    name: \"myObject\", \r\n    type: \"asset\",\r\n    key1: \"value1\",\r\n    key2: \"value2\",\r\n}\r\n```\r\n\r\n\r\n\r\n\r\n### get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\nList of options:\r\n```json\r\n(type, entity_type) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar allObjectsID = await TB.get.allObjectsIDbyType('device_type', 'device')\r\n\r\n```\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n### get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\nList of options:\r\n```json\r\n(type, entity_type, keys) //string. type - custom type, entity_type - ASSET/DEVICE/ENTITY_VIEW. For keys - can be array.\r\n//If keys == null - Trying to get all attributes!\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet keys = ['key1','key2','key3']\r\nvar allObjectsIDandAttrs = await TB.get.allObjectsIDandKeysByType('device_type', 'device',keys)\r\n\r\n```\r\n\r\nResult\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name1\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        name: \"name2\", \r\n        type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n____\r\n\r\n## PUSH\r\n\r\n### push.createRelation()\r\n\r\nList of options:\r\n```json\r\n(name, entity_view, parentName, parentType) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nvar createRelation = await TB.push.createRelation(\"myChild\",'asset',\"myParent\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n____\r\n\r\n### push.pushAttributes()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,attributes) //string\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nvar pushAttributes = await TB.push.pushAttributes(\"myObject\",'asset',attributes)\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n___\r\n\r\n### push.createEntity()\r\n\r\nList of options:\r\n```json\r\n(name,type,attributes,entity_type,parentName,parentType,parentKeys,parentRelation)\r\n// attributes - can be null, if no attributes to push\r\n// parentName,parentType,parentKeys,parentRelation - can be null\r\n// so no relation or cloning attributes will be done\r\n//\r\n// parentKeys - array of name of keys to clone from parent to new Entity\r\n// parentRelation - boolean. If true - will call createRelation() to parentName\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\nlet attributes = {\r\n        key1: \"value1\",\r\n        key2: \"value2\",\r\n    }\r\nlet parentKeys = [\"keyTestParent\",\"keyTestParent2\"]\r\n\r\nvar createEntity = await TB.push.createEntity(\"myAsset\",'testType',attributes,\"asset\",\"ParentDevice\",\"device\",parentKeys,true))\r\n```\r\nResult\r\n```js\r\nid || false //if no relation and parentClonning\r\n\r\n{\r\n    id: id,\r\n    statusAttributes: true || false,\r\n    statusRelation: true || false,\r\n}\r\n```\r\n\r\n### push.pushAlarm()\r\n\r\n- List of options:\r\n    - `entityName`: Stands for entity name (String) \r\n    - `entityType`: Stands for entity type: device, asset and etc. (String)\r\n    - `alarmDetails`: Stands for alarm description: 'Some alarm details' (String)\r\n    - `alarmType`: Stands for alarm type: 'Change state' (String)\r\n    - `ts`: ts in MS (Date)\r\n    - `tenantId`: Stands for tenat id, required for creating alarm (String)\r\n    - `entityId`: Stands for entity id (String)\r\n\r\n- Response: \r\n    ```js\r\n    {\r\n        entityId: 'e34f1a20-c1a8-11ea-892e-756ada0522f7', // entity id of device, asset and etc\r\n        alarmId: 'ec250090-c7fe-11ea-96a3-756ada0522f7'  // alarm id \r\n    }\r\n    ```\r\n\r\n____\r\n\r\n## DELETE\r\n\r\n### delete.deleteEntity()\r\n\r\nList of options:\r\n```json\r\n(name,entity_type,flagDeleteChilds) \r\n// flagDeleteChilds - boolean, if true - will delete child entities in 3 level depth max\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntity(\"myOldObject\",'asset',false)\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n___\r\n\r\n### delete.deleteEntitiesByType()\r\n\r\nList of options:\r\n```json\r\n(type,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteEntity = await TB.delete.deleteEntitiesByType(\"typeOfAssetsToDelete\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n___\r\n### delete.deleteEntitiesByType()\r\n\r\nWill delete entities, whose has relation to 'name' in 3 level depth max\r\nList of options:\r\n```json\r\n(name,entity_type) \r\n\r\n```\r\n\r\nUsage\r\n```js\r\nvar TB = require('thingsboard_api');\r\n\r\nvar deleteChilds = await TB.delete.deleteChilds(\"Parent\",'asset')\r\n```\r\nResult\r\n - Response in `success`\r\n\r\n```js\r\n{ \"success\": true }\r\n```\r\n \r\n - Response in `fail`\r\n\r\n```js\r\n{ \"error\": true, \"message\": \"error description goes here\" }\r\n```\r\n\r\n### delete.clearAlarm()\r\n\r\nList of options:\r\n  - `alarmId`: Stands for identificator of alarm, created earlier\r\n\r\nResponse:\r\n  - In success:\r\n    \r\n```js\r\n    { success: true }\r\n```\r\n    \r\n  - In error:\r\n    \r\n```js\r\n    {\r\n        error: true,\r\n        message: Some error msg description\r\n    }\r\n```\r\n\r\n# List Postgres Functions\r\n\r\n### postgres.get.allObjectsIDbyType()\r\n### Promise get all object's ID by its name and \"custom type\",type\r\n\r\n- List of options:\r\n    - type: `String`\r\n    - entity_type: `String`\r\n\r\n- Description:\r\n    - type: custom type (`Локомотив`, and etc.)\r\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\r\n\r\n\r\n - Usage\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst allObjectsID = await TB.postgres.get.allObjectsIDbyType('device_type', 'device');\r\n```\r\n- Error handling:\r\n    - In case of error, target variable will have two options:\r\n        - `error`\r\n        - `message`\r\n    \r\n```js\r\nallObjectsID = {\r\n    \"error\": true,\r\n    \"message\": \"getAllObjectsIDbyType(), Error: `error description`\"\r\n}\r\n```\r\n\r\nSuccesfull output example:\r\n```js\r\n[\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        type: \"device_type\"\r\n    },\r\n\r\n    {\r\n        id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        type: \"device_type\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n### postgres.get.allObjectsIDandKeysByType()\r\n### Promise get all object's ID and attributes by its name and \"custom type\",type and keys\r\n\r\n - List of options:\r\n    - type: `String`\r\n    - entity_type: `String`\r\n    - keys: `null` by default, `array of string` optionally!\r\n\r\n- Description:\r\n    - If keys are `null`, `all` possible attributes will be in response!\r\n    - type: custom type (`Локомотив`, and etc.)\r\n    - entity_type: `ASSET`, `DEVICE`, `ENTITY_VIEW`\r\n\r\n - Usage\r\n\r\n```js\r\nconst TB = require('thingsboard_api');\r\nconst keys = ['key1','key2']\r\nconst allObjectsIDandAttrs = await TB.postgres.get.allObjectsIDandKeysByType('device_type', 'device', keys)\r\n```\r\n\r\n- Error handling:\r\n    - In case of error, target variable will have two options:\r\n        - `error`\r\n        - `message`\r\n    \r\n```js\r\nallObjectsIDandAttrs = {\r\n    \"error\": true,\r\n    \"message\": \"getAllObjectsIDandKeysByType(), Error: `error description`\"\r\n}\r\n```\r\n\r\n - Succesfull output example:\r\n```js\r\n[\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name1\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    },\r\n\r\n    {\r\n        entity_id: \"0b507930-78d2-11ea-a1c7-d1e730c27b32\", \r\n        entity_name: \"name2\", \r\n        entity_type: \"device\",\r\n        key1: \"value1\",\r\n        key2: \"value2\"\r\n    }\r\n]\r\n```\r\n\r\n___\r\n\r\n#### postgres.get.getAttrsAndValuesById(entity_id, attributeKeys) - get attributes keys and values according to array of attributeKeys\r\n\r\n#### Information\r\n - This function is mostly used with `extentChildAttr()` [See index.js](./index.js), so it returns data for future extending attributes of child or updating them,\r\n that's why all values (bool_v, str_v and etc.) return for each `attribute_key`\r\n\r\n - For getting \r\n\r\n##### Steps: \r\n - convert Thingsboard UUID to Postgres entity_id; Use postgres.toPostgresID(thingsboard_uuid) for converting\r\n\r\n##### List of options:\r\n - entity_id - `string`\r\n - attributeKeys - `array`  \r\n\r\n##### Response:\r\n```js\r\n[\r\n...,\r\n {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1e9fbe382c16090a0332dde0dc34203',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'attribute_test_april2020',\r\n    bool_v: false,\r\n    str_v: '',\r\n    long_v: 0,\r\n    dbl_v: 0,\r\n    last_update_ts: null\r\n  },\r\n...\r\n]\r\n```\r\n\r\n____\r\n\r\n\r\n#### postgres.toPostgresID(thingsboard_uuid) - convert Thingsboard UUID to Postgres ID\r\n\r\n##### List of options:\r\n - thingsboard_uuid - `string`\r\n\r\n#### Response:\r\n - postres id - `string`\r\n\r\n\r\n___\r\n\r\n#### postgres.insertIntoAttrsKeysVals(dataToWrite) - insert data into `attribute_kv` table\r\n\r\n##### Information:\r\n - Column names are define in object\r\n\r\n##### List of options:\r\n - dataToWrite - `array of objects`\r\n```js\r\n[\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'test_attr_key',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  },\r\n]\r\n```\r\n\r\n##### Response:\r\n - To check if data was written to db `compare insert count with response count`\r\n\r\n___\r\n\r\n### postgres.updateAttrsKeysAndVals(attributeObj) - Update values (below) according to attributeObj\r\n```\r\n - entity_type\r\n - attribute_type\r\n - attribute_key\r\n - bool_v\r\n - str_v\r\n - long_v\r\n - dbl_v\r\n - last_update_ts\r\n```\r\n\r\n##### List of options:\r\n - attributeObj - `object`\r\n```js\r\n  {\r\n    entity_type: 'DEVICE',\r\n    entity_id: '1ea6d07aaba34b094de3ddf86487a77',\r\n    attribute_type: 'CLIENT_SCOPE',\r\n    attribute_key: 'Работа по программе',\r\n    bool_v: null,\r\n    str_v: null,\r\n    long_v: null,\r\n    dbl_v: null,\r\n    last_update_ts: 1586949836446\r\n  }\r\n```\r\n##### Response:\r\n - To check if data was updated successfully count of entitities to update with update response count. Example for 1 obj:\r\n```js\r\n[ count: 1, command: 'UPDATE' ]\r\n```\r\n___\r\n\r\n# List of unclassified functions\r\n\r\n### extendChildAttrs (options) - Extend child attributes by parent attributes\r\n\r\n### Information:\r\n - `parent_id`, `child_id`, `child_type`, `attribute_keys` are essential properties!\r\n - Set necessary attribute keys in `options.attributeKeys`\r\n\r\n##### List of options:\r\n - options - `object`\r\n```js\r\n{\r\n    \"parent_id\": \"some_thingsboard_id\",\r\n    \"child_id\": \"some_thingsboard_id\",\r\n    \"child_type\": \"DEVICE\",\r\n    \"attributeKeys\": ['attribute_test_april2020',   'Отсутствие программы', 'inactivityAlarmTime', 'lastActivityTime', 'active'],\r\n    \"updateAttrs\": false,\r\n}\r\n```\r\n##### Steps:\r\n - If you want to add not existed attributes before to child set `updateAttrs` to `false`\r\n - For updating child attributes using parent data, set `updateAttrs` to `true`\r\n\r\n##### Reponse:\r\n - Function doesn't return any data!","readmeFilename":"README.md"}