{"_id":"home-controller","_rev":"39-8ff836dc228558de0f5f7426dff32fe2","name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","dist-tags":{"latest":"0.9.2"},"versions":{"0.1.0":{"version":"0.1.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*","nock":"~0.18.2","grunt":"~0.4.1","grunt-contrib-jshint":"~0.6.1","grunt-contrib-uglify":"~0.2.2","grunt-contrib-concat":"~0.3.0","grunt-mocha-test":"~0.6.2","blanket":"~1.1.5","travis-cov":"~0.2.4"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.1.0","dist":{"shasum":"0c34e0b50673ef313735e9309f203504d1b65ab9","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.1.0.tgz","integrity":"sha512-eCrW+CAavN1PwNYRzrAcAlwxAooFv4cX4wHB8Mm+HEzbB0zI9IWwv3WAjgN+Rq6CkG0lctYW1N3xynoW/nLf6Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHTLMkztVbxgACwKNRd8WvpH4YTkCDlVAESd2FNTlFNAAiBLH97gpPbWuDNrHBNHgjaqg+ZgouppS9bsNhEb6nIYTQ=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.2.0":{"version":"0.2.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"~2.0.0"},"devDependencies":{"mocha":"*","should":"*","nock":"~0.18.2","grunt":"~0.4.1","grunt-contrib-jshint":"~0.6.1","grunt-contrib-uglify":"~0.2.2","grunt-contrib-concat":"~0.3.0","grunt-mocha-test":"~0.6.2","blanket":"~1.1.5","travis-cov":"~0.2.4"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.2.0","dist":{"shasum":"b456416283445eceedfa62a3d5733363012344af","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.2.0.tgz","integrity":"sha512-y6teqLeOunwGvRGu8M8GmJ8qLhABU9UCV+ZsV4+ToXay0oIitAdZqvdx8HkQAG46FE+xCVG+pEjVXZbxZqjraQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAX6wdsCVTE2C1ICH/nGhp3JMVCFbMN4sxMV76M4YtNrAiApcDe+Amktqy8bAFmIhMSi6/BlbSxruSFbw5dSThy+iA=="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.3.0":{"version":"0.3.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"~2.0.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"~0.4.1","grunt-contrib-jshint":"~0.6.1","grunt-contrib-uglify":"~0.2.2","grunt-contrib-concat":"~0.3.0","grunt-mocha-test":"~0.6.2","blanket":"~1.1.5","travis-cov":"~0.2.4"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.3.0","dist":{"shasum":"a04cd96c2c545e8dc7f3ec8fbd57c8ba633c8c0e","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.3.0.tgz","integrity":"sha512-lRM+rKJ++JQxk+Wkva8PzKHN2iVlbrBezndv2SlXCUZuv/e0sEr0J56iJgtxOFUtitK9pBfph+j9O1VyEJxYUg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDK/LibunlkHAnOEjxvZb2ntkWD3enzWbSz91cPS5PYmwIgOqEioIk1sCG1zy0O45y+XDioeyk9u/uBqCnatMsaUj0="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.3.1":{"version":"0.3.1","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"~2.0.0","debug":"~0.7.4"},"devDependencies":{"mocha":"*","should":"*","grunt":"~0.4.1","grunt-contrib-jshint":"~0.6.1","grunt-contrib-uglify":"~0.2.2","grunt-contrib-concat":"~0.3.0","grunt-mocha-test":"~0.6.2","blanket":"~1.1.5","travis-cov":"~0.2.4"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.3.1","dist":{"shasum":"ca3daa2018e15775084eadc3f3ece9d58bf8dd4a","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.3.1.tgz","integrity":"sha512-pIsLRAhqCae5XtFc0dpE85z2CqY4z5Kfn68G0/dp4hL/vNKatH2njQ5xKT+RJlDmO5rGzYW0ngEW5PPeXX2aYQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBudcIl2tuq17+vK3UiMJw6b3398VJwMCUocRZ4wbfUSAiEAovqIsLL9yrX+sXM6HDF/cvKJQqpN+O/8jv7gP0qMvF4="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.3.2":{"version":"0.3.2","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"~2.0.0","debug":"~0.7.4"},"devDependencies":{"mocha":"*","should":"*","grunt":"~0.4.1","grunt-contrib-jshint":"~0.6.1","grunt-contrib-uglify":"~0.2.2","grunt-contrib-concat":"~0.3.0","grunt-mocha-test":"~0.6.2","blanket":"~1.1.5","travis-cov":"~0.2.4"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.3.2","dist":{"shasum":"b6f1d30086c724c2515e8571c0252ed8ece740b6","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.3.2.tgz","integrity":"sha512-9rWND7Mq7aTzbOO+Z0eTLBfJrqTw7/AdHW3rKKeLntygZSxweJsmhUcH2qL2GxjdWlkM+/oJkt7EXTslp3ExQw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFyvqU05ALpn2lb0a4pfyuS6TGbR6ZXZz0rt0UbmAynNAiAS4HVkBdQtRP7Fr9mGsAmKCu7bh4a07CfwGmXLiozidA=="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.3.4":{"version":"0.3.4","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.3.4","dist":{"shasum":"21ff962c5b9068593b9aac56cf6fe6d7f3b25e8a","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.3.4.tgz","integrity":"sha512-AzBA2i3RlDNbuXY1prFX9tb9aEaWxulyie6BdDBzDlGHsaETZla4NU+ZaO0Q4Nn65C4NTj8vYtgQaFl5Fqx+KA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDub5Uv0oNZbHIXgBY1KB6mymk4c8jRRlmkQ9lINnkOYAIhALn+JYz830NTy9rbuzUptVnBDFKSrCgAUbK0RKozm0+J"}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.3.5":{"version":"0.3.5","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"license":"MIT","_id":"home-controller@0.3.5","dist":{"shasum":"05fbd98d42a8321a1cea5d71d25e6d88e4698555","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.3.5.tgz","integrity":"sha512-2ullFvoYlC71EkScrtKI+WpiRgiK041DV3fSWTFWJ6sg7/p0emhC/Iapwok1SpCpw6Hrum6S8yNM3c0a7RbywQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHXNsYvhdnuLmWgc2GdK7Y94KS7GhHj/2T6MY/SS9I28AiAizO6GxaB6njS3NrpptDJklKlaZ5LbM7C7dVLREajY8Q=="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.4.0":{"version":"0.4.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.4.0","dist":{"shasum":"5de63457e7642e61e7979c7f98366b131c95958c","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.4.0.tgz","integrity":"sha512-V6N1B3ufUEqI8hruX5gIHOcYz8A1jTVUnZFFP4XE+BvqB9i7apaKPpt4aDcCjDVxQ2nu/7OeAU8gu7o4H2Z14Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/As3PviRAwRKYHmPhxp89e231rw8j8KenlKOK1/Yd4QIhAL1t+BySXL8fYKfnrLc7WyraWSa0DT3Oa0F0KLF7O5ve"}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.4.1":{"version":"0.4.1","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.4.1","dist":{"shasum":"1fe380d02a3327d02aa2784f816ce5074b99789d","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.4.1.tgz","integrity":"sha512-tDlFIMsXyqQ1B2D0EGHytZlPSIRn59w9xfCxvm1H6lu/fWTQI98B4/JD/6eb30wPHUGDnS8BzABLzAxfLoaDiQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuljs+oye4ZaPM9DtT7LGn3DuOY4r0DYNfUk3tE8nfZgIgY7h10BdOsSRdC2WeuMMOwSN94ZG88h8EkkfWWTXJ0j0="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.4.2":{"version":"0.4.2","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*","serialport":"~1.1.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.4.2","dist":{"shasum":"20c2ea3f0b040fc355c0ca9d732bf911b91e0606","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.4.2.tgz","integrity":"sha512-rs9QC30Wma0l4MdL5t6MsGBEvKwHDU3mldgPALXPcm5p+nPAwavUsLQXpuXYSoVbNv8WYA4Ab3J5HrKY4PNC+Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBC/lWtaq0JZmrogUFe//dfHOyLnjArG+sTTIigyjgGlAiBZkGtWKv4DrWJ84HOwtTdSSp0rRsm8oIyJLDV/1c7ffQ=="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.4.3":{"version":"0.4.3","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*","serialport":"~1.1.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.4.3","dist":{"shasum":"6cec53c4b3f4b129c4937107d8362e2dd30db1bf","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.4.3.tgz","integrity":"sha512-0XO/LZ/PcGv4kRnntQdYcGLwI+GJYKT5zORk9M/LDZsgf6eGSVuwCA2E69N89CyD9ynzz+fry2am1CJgEcVJJQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFms0OvF759RnC29qD0D0+SJZhQSsSPBmmMhkjRVBiXwIgaXT7t9GjEz3PG+DN1oKcwuX3v+kb6WUB9a7Rx5mHJy8="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.5.0":{"version":"0.5.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*","serialport":"~1.4.0"},"optionalDependencies":{"serialport":"~1.4.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.5.0","dist":{"shasum":"ff1904d5c32c030c5dcca8c574f77e48be39e7b8","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.5.0.tgz","integrity":"sha512-zvRWlZWG7JILnPz3xLg1+5UNQbx7yByP5PXesv+OQTcEgs1yXOG3ltZlekZwShh7w/nS6OQyqGBC2EqCu6Bi1w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCAsWFD5HK+YYY/yKD02+n4lGriDsY/oDXkjZM0mg5IaQIgViiL0Hb9DhFKiy0S+WZcn46DJ7eDi3m9U+bu853DzZY="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.5.1":{"version":"0.5.1","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*","serialport":"~1.4.0"},"optionalDependencies":{"serialport":"~1.4.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.5.1","dist":{"shasum":"5695c7a67f7a7d6accd5c272224cbaf0f8ca928a","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.5.1.tgz","integrity":"sha512-Ba8NW3FaFC5DHx7usgwdTMuK4ZFoIAXCZitsyGKHiqSKKT+xCqTpHbThDpzF7pAPs0L2VAQuzKhD1ix7MJM3Lg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDfD58st3ZUFp6CRsBmdFiQcBdBRCzMmaulZDUvkSCUHAiEA+d9MlMbUXYF4gExdmsA3wZOvF/N4NKfhnnU/N/caaf4="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.5.2":{"version":"0.5.2","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","q":"1.0.*","serialport":"~1.4.0"},"optionalDependencies":{"serialport":"~1.4.0"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","_id":"home-controller@0.5.2","dist":{"shasum":"cc368b98235da77511c1676c86f51198882f35ba","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.5.2.tgz","integrity":"sha512-fnaeZP3qoplbCkWi97ioQ/sEwxu4PuMsInCksWLhCV+UaEHsOVSSKJYF8E9A1llkf5sDbBQzBFt/2cXPPEBJaQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGxQJQFiSOHeEj9t0LqKYVtrfl1/gRhn9RXA7g2qh3UtAiEA7who7kzuvAxY4dqJQl+fKfoz7cbIURnD2n3brnijsVA="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{}},"0.6.0":{"version":"0.6.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"https://github.com/automategreen/home-controller"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"2.2.*","debug":"0.8.*","eventsource":"0.1.*","q":"1.0.*","serialport":"~1.4.0","spark":"~0.2.4"},"optionalDependencies":{"serialport":"~1.4.0","spark":"~0.2.4"},"devDependencies":{"mocha":"*","should":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-contrib-uglify":"*","grunt-contrib-concat":"*","grunt-mocha-test":"*","blanket":"*","travis-cov":"*"},"scripts":{"test":"grunt test"},"config":{"travis-cov":{"threshold":80}},"license":"MIT","gitHead":"0431595b58838c28ce3044e74ae63bbd81ab3dd4","_id":"home-controller@0.6.0","_shasum":"f861700c96337bffaf5b7e8a0c05cdb713bc55ea","_from":".","_npmVersion":"2.5.0","_nodeVersion":"0.10.36","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"dist":{"shasum":"f861700c96337bffaf5b7e8a0c05cdb713bc55ea","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.6.0.tgz","integrity":"sha512-4AJTTfFHY5kgMhq+CQHTbQcQjp7NDMVxkFiWnBcUjz68PuewwtDgSTd5+70ZDwits/utL5SyxHuGbloe8QO/Mw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBCxyxYeUcqzrzOdKuTaGkJ7WjB539YIerTMEQTXwFEsAiEAmawP1nLcvV+M/ty0P9RxnaZQz3j+IF4EWqzSQpWlW2k="}]},"directories":{}},"0.7.0":{"version":"0.7.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"^2.7.0","debug":"^2.1.0","eventsource":"^0.1.0","q":"^1.4.1","serialport":"^4.0","spark":"^1.0.0"},"optionalDependencies":{"serialport":"^4.0","spark":"^1.0.0"},"devDependencies":{"coveralls":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-mocha-istanbul":"*","grunt-mocha-test":"*","istanbul":"*","mocha":"*","should":"*"},"scripts":{"test":"grunt test"},"license":"MIT","gitHead":"99d1bcd492db5e63635d9c95db678900bc03058b","_id":"home-controller@0.7.0","_shasum":"3c39adac7f746f5adabe16e154434e4214eb6ba8","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"dist":{"shasum":"3c39adac7f746f5adabe16e154434e4214eb6ba8","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.7.0.tgz","integrity":"sha512-PXHuzjkc6i8StSGHVKZkvUtTQeFbDy0+HG5Xo8k31CzIIeLIims1pXU3IoH4MpxllioMU5SFVR3Q0tYhQsR8UQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEEHGetqKZ0jZ8KTOXyDQGD1Kh7AQFiCxrwBO99UeVhlAiEApqkgpjxU3G9rqfCCTqPftoE1IRb6+2/xmiBwQD1ujhc="}]},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/home-controller-0.7.0.tgz_1490871750536_0.11536337621510029"},"directories":{}},"0.8.0":{"version":"0.8.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 0.10"},"dependencies":{"commander":"^2.11.0","debug":"^2.6.8","eventsource":"^1.0.5","q":"^1.5.0","serialport":"^5.0.0"},"optionalDependencies":{"serialport":"^5.0.0"},"devDependencies":{"coveralls":"*","grunt":"*","grunt-contrib-jshint":"*","grunt-mocha-istanbul":"*","grunt-mocha-test":"*","istanbul":"*","mocha":"*","should":"*","virtual-serialport":"*"},"scripts":{"test":"grunt test"},"license":"MIT","gitHead":"530fd0d6e1f6c48fcfdb80f83388911ca6838903","_id":"home-controller@0.8.0","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"dist":{"integrity":"sha512-AgY5ossM+bOi1jIBSJb6tVZF1/hKkA8M4GHcmLd19buGROYgJe0fzrmffVnwQzhKFuYfSQM9YkO4BwXIBzRIrg==","shasum":"241d8f989b54a6a831b4d1c0d6c8b654d7997508","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.8.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDw2ysPVdWXWTODQpw09p1Li22TmoLgOcr6dHo5Y4dfggIhANCttPP2QCWTTgGBh0uiYrn2sB5p1Nwi+zX6csqEu4Zf"}]},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/home-controller-0.8.0.tgz_1501853671938_0.47526687220670283"},"directories":{}},"0.8.2":{"version":"0.8.2","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 4.0"},"dependencies":{"commander":"^2.15.1","debug":"^3.1.0","eventsource":"^1.0.5","q":"^1.5.1","serialport":"^6.0.0","spark":"^1.0.0"},"optionalDependencies":{"serialport":"^6.0.0","spark":"^1.0.0"},"devDependencies":{"coveralls":"^3.0.1","grunt":"^1.0.3","grunt-contrib-jshint":"*","grunt-mocha-istanbul":"*","grunt-mocha-test":"^0.13.3","istanbul":"*","mocha":"^5.2.0","should":"^13.2.1"},"scripts":{"test":"grunt test"},"license":"MIT","gitHead":"effa66f335cbeadc07de894040a7c1196b0cbe0b","_id":"home-controller@0.8.2","_npmVersion":"5.6.0","_nodeVersion":"8.10.0","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"dist":{"integrity":"sha512-sWvg9TcvcQm/NU189n0YCFKIu/KrUrf/TlNMAy7Mce9aPzB/QdTuz0KAS945txnRSauzzgrw2u9bwczDuvCc/A==","shasum":"ff2dc54aeaa90ec16589bd3924560c16ad3f1aed","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.8.2.tgz","fileCount":75,"unpackedSize":1284047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMN4eCRA9TVsSAnZWagAAg+oQAIGier3MHt5Am12ye3a1\n5eRjkwpotgmby/7kzuz62cLo8vgk1ZmlO1yH9nNTOhWZI6KmnNRxbe8kGPqX\nvWPKNWCxGb5feOlsJbzSfONjK7WpQ8WMdIkso6ZjNbgTJetS+Daa+80cYrDq\nJrxCIDl7yThP6VfG8UeeK6MuIFZN6PQFvVx8bsHo9TYCV19Wyf3U+6KFosor\ntSqzVvG3RvXMYsqdTYow3Cq6ZLAfT4ikQ6Q4mOdkw60FsDW1QUKsjOGgbEfZ\n0W6gFiDiJpXtiud7BG7TGa76C77dT7d4s5n/oVOd6r+rB429dJU4zsP9PRQ4\ndIBed9ZUqcgdqPzwVANuEIQC10YK8oIdpDrxsKgJNei32WH+Vba0/1m9cfxN\nJ0XIpuSP4fpauKsq+t2aSmMzm8Ig3YCsVSFRbyRWBDabW5YQSocZAW5pNhUD\nwyCmEQovVsZzvwSAfW+BHBmm+4AcU6o+iAMSd3cW2WVxzNUhR6Q1HF43gZKN\nKfYGsWTlJTtDAUnNiUn//Tge6cxOlNYrt6Hw74X6+dqkuM5dvJKlKcOISdtn\n1mOfs0T3YNTWabkpQmSi1X/elEVGGSHoyQxgt1wDW4lRgyoalljYARZVt0xe\nmYb6vUvZjepHB0l1bnUbOlQ9LNLKxHI2BblwN99Wa4sRt8+vKqelHJAMXwJi\n8hNa\r\n=LEFR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQCWQbOpZwuxICXIH4ON9yASvNSyz/GLi8G+d7t4yktjbwIfBZSBpoFR/INglyzfMFmC/AXmEoNvbnHIOYNFZqwe2w=="}]},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/home-controller_0.8.2_1529929246604_0.5937704808940478"},"_hasShrinkwrap":false},"0.9.0":{"version":"0.9.0","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 4.0"},"dependencies":{"commander":"^3.0.0","debug":"^4.1.1","eventsource":"^1.0.7","q":"^1.5.1","serialport":"^8.0.7","spark":"^1.0.0"},"optionalDependencies":{"serialport":"^8.0.7","spark":"^1.0.0"},"devDependencies":{"coveralls":"^3.1.0","grunt":"^1.1.0","grunt-contrib-jshint":"^2.1.0","grunt-mocha-istanbul":"*","grunt-mocha-test":"^0.13.3","istanbul":"*","mocha":"^7.1.2","should":"^13.2.3"},"scripts":{"test":"grunt"},"license":"MIT","gitHead":"fad936ff0fcdaea1e0199f6412259e04d6850c29","_id":"home-controller@0.9.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","_npmUser":{"name":"brandongoode","email":"brandon@automategreen.com"},"dist":{"integrity":"sha512-AB+K3gDZK+SQkF5CX2kV+rUWduaQOuJI5inXaIyHbLj/HbO++QnD0if4kgYuac2LTMuS7uVJe9f3FU10+eXnbw==","shasum":"2acfa0e84bd271a5d95c1a8dfa0b0e2ba9c6ee9b","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.9.0.tgz","fileCount":75,"unpackedSize":1289067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeudgBCRA9TVsSAnZWagAAAxUP/RXbsAPA/YXkJyPCr6gp\n/zUSYa1Ej93e8xTX1YIRut2tIKBQjQqjew19ssHhRkvimx/wcMF9yHIUBwdT\niPbnwUGr99Ptg6YDaOtWfLxM5zOyuI0WrHof7uUxpdNDhuq5GN2TU8E9MFOS\nyYLuKHj1FJlbGAfxtImORtXfzxfGERIveS9W+wxzKckw8ASFfhuvhWYcIt/C\nBjGoteE08MN5uAk6VcCYVJx1WPd3FOxRMr2zsVquHscHrJH2fkcM8DBjRXSZ\nVdU2bchZ7fsoebH3L7BYeNwCoTrd+kLrzRXkPjPtsAI1IX9hBgyitu4tB4xy\nIm/WK0DPQfrr7VR//skDBXGRVfaIzbDPVoopW7AShcbgvRoBJDgi/crmkcDV\nh5AKgGZq4BawAnYU0PNxyJLqla6PD9vN0BTcKjxJ9VXc1dAy8B0EqzNkNstd\ndpwK+68kg/Bz9IoH69aT5Zh8kt6d9UGOmNxWbJRjhYLcY2qTLbSrXzPQA3C8\nyKizKqwG/meGxCXViqbY2OQO3KkwrOarWEua9gptD9Zar3LdYza2ULIsBua3\nJL5DyYA4lM/XSu5BPyz8xrIKS4l3hI3I03MUCIV6oXMTWjS3zBn9/azGN0FD\n4tdUoZkyoUC+iIWcr+pBc5mQqtHwI0M3hQmCEvYM5EA4Sthfm7PrwwVJurjT\nsPBj\r\n=hFCd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFPylF0wlhffYsYXARSTlYeZOA90rMI6MdCPofQZvzXgAiEA7MDCyQoYzLo+4gwG9Zbrj1KdKp0qccoO40YaGUmP3/4="}]},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/home-controller_0.9.0_1589237761477_0.7446041538696426"},"_hasShrinkwrap":false},"0.9.2":{"version":"0.9.2","author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"name":"home-controller","description":"A Node Home Automation Controller for Insteon Devices","keywords":["automation","insteon"],"homepage":"https://github.com/automategreen/home-controller","repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"main":"./index.js","engines":{"node":">= 4.0"},"dependencies":{"commander":"^7.2.0","debug":"^4.3.1","eventsource":"^1.1.0","q":"^1.5.1","serialport":"^8.0.7","spark":"^1.0.0"},"optionalDependencies":{"serialport":"^8.0.7","spark":"^1.0.0"},"devDependencies":{"coveralls":"^3.1.0","grunt":"^1.4.0","grunt-contrib-jshint":"^3.0.0","grunt-mocha-istanbul":"*","grunt-mocha-test":"^0.13.3","istanbul":"*","mocha":"^8.4.0","should":"^13.2.3"},"scripts":{"test":"grunt"},"license":"MIT","gitHead":"cb2cd1095c293c4cec496a6e8dda597e0a8ba708","_id":"home-controller@0.9.2","_nodeVersion":"14.16.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-gr7XX5kqIVQPOvjv28GypF7K981b0Rlv2LuFuMZbTPOdFzqzGf3auisig9yGaKP15Odqsw5jseaTe2RfmEGvrg==","shasum":"50dba007f44b3909c078959095b06327923c17a9","tarball":"https://registry.npmjs.org/home-controller/-/home-controller-0.9.2.tgz","fileCount":71,"unpackedSize":1054035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpSg3CRA9TVsSAnZWagAAI68P/1CV865j3M443b+ru3SO\nNY4szA5tak8/yrYZFWAxnHATkbM14kp5sCuNvmbAH85xD3sWlJN7iQ1jAHJ3\nY/mc6JEzYi0SAI4fRu88VK8vzVIL4ZWx8Kbai/ST2UKWffLKt9ZjDxWPK/6J\nBnznGGhWGsJ1lR3nKZ+JtVp5hrpi7sHgK1kX2vsfcHO2hDkfAx64f5QNBBcN\nW4IQFqbcgk2poy1xk6JpyPztYUcg8j02/g6gwwyXN3hlV2s66H/zMpG3SGf/\nF+JIM2gKZNwHtK4xzRUhaKV5RPY1pPMJBo7lbuL5ugLvRPlBi5CKeS3wWoqb\nWiMCxWfXY+ajSGNXBM2nexmPvjCi4c/g5Wp2K+AyzzB+1LMo47dujjQkUlZh\nUrYvg9NmRIkfApyUE/spv9qxSXjEan3sC4Wh8wPUbnCT1/K3P8nBUdlFj2fa\n+7seknXIIdlW3Vyk7KT7SaGT5bcZeilqhzKzXITfmdXCgpX6nlwH+SBqlM87\nC2SFLyKfIpLi0N1HpGZ3cJpEkq6nbFFJjWLcGig667Dw17VXtzTJ6Pw3rI+Z\ndESCSZDYKFpVHGXE9aN4Hx/JVldPax4HwtDBq1CoYolGpjmi0EVYdPvg7UBv\naFS9/JoOyZ+K0Wn4DCqkLsXbrhafSrlqmeZryRsm7mA8Ebuo/1r707Vc3dNL\nDeho\r\n=qjqi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJ6nSH7Vp8+kjIpTHO8kfpNbqvBj6f7lPXiscuMczRDQIhAKHiSdZBxJM5lBR++fjiWtaAurDEg1uxvIsoRxqn89fU"}]},"_npmUser":{"name":"siburny","email":"siburny+npmjs@gmail.com"},"directories":{},"maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"},{"name":"siburny","email":"siburny+npmjs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/home-controller_0.9.2_1621436471327_0.9258023464813296"},"_hasShrinkwrap":false}},"readme":"home-controller\r\n===============\r\n[![Build Status](https://travis-ci.org/automategreen/home-controller.svg?branch=master)](https://travis-ci.org/automategreen/home-controller) [![Coverage Status](https://coveralls.io/repos/github/automategreen/home-controller/badge.svg?branch=master)](https://coveralls.io/github/automategreen/home-controller?branch=master) [![dependencies Status](https://david-dm.org/automategreen/home-controller/status.svg)](https://david-dm.org/automategreen/home-controller) [![optionalDependencies Status](https://david-dm.org/automategreen/home-controller/optional-status.svg)](https://david-dm.org/automategreen/home-controller?type=optional) [![devDependencies Status](https://david-dm.org/automategreen/home-controller/dev-status.svg)](https://david-dm.org/automategreen/home-controller?type=dev)\r\n\r\na node package to control Insteon home automation devices\r\n\r\nOverview\r\n--------\r\n\r\nhome-controller is a node package to control Insteon home automation devices.  The API uses the direct PLM connection over TCP, Serial connection or the cloud.  To control the Insteon devices one of the following is needed:\r\n\r\n  - [Automate Green WiFi Hub i](https://github.com/automategreen/hub-i)\r\n  - [Automate Green PLM WiFi Adapter](http://blog.automategreen.com/post/plm-wifi-adapter)  - [Insteon Hub 2242](http://www.insteon.com/2242-222-insteon-hub.html)\r\n  - [Insteon SmartLinc](http://www.insteon.com/2412n-smartlinc-central-controller.html)\r\n  - [Insteon PowerLinc Modem](http://www.insteon.com/2412s-powerlinc-modem-serial.html) is required.\r\n  - [Insteon Hub 2245](http://www.smarthome.com/insteon-2245-222-hub.html) is only supported over the HTTP client interface, which has caveats (see [httpClient](#http-client))\r\n\r\nTable of Contents\r\n-----------------\r\n\r\n- [Overview](#overview)\r\n- [Features](#features)\r\n- [Getting Started](#getting-started)\r\n- [API](#api)\r\n  + [Insteon Gateway](#insteon-gateway)\r\n  + [Linking Functions](#linking-functions)\r\n  + [Scene Functions](#scene-functions)\r\n  + [Information Functions](#information-functions)\r\n  + [Lighting Functions](#lighting-functions)\r\n  + [Fan Functions](#fan-functions)\r\n  + [Lighting Events](#lighting-events)\r\n  + [Thermostat Functions](#thermostat-functions)\r\n  + [Thermostat Events](#thermostat-events)\r\n  + [Motion Sensor Functions](#motion-sensor-functions)\r\n  + [Motion Sensor Events](#motion-sensor-events)\r\n  + [Door (Open/Close) Sensor Functions](#door-openclose-sensor-functions)\r\n  + [Door Sensor Events](#door-sensor-events)\r\n  + [Leak Sensor Functions](#leak-sensor-functions)\r\n  + [Leak Sensor Events](#leak-sensor-events)\r\n  + [Meter Functions](#meter-functions)\r\n  + [IO Linc Functions](#io-linc-functions)\r\n  + [EZ IO Sensor and Actuator](#ez-io-sensor-and-actuator-functions)\r\n  + [X10 Functions](#x10-functions)\r\n  + [Core Functions](#core-functions)\r\n- [Testing](#testing)\r\n- [References](#references)\r\n\r\nFeatures\r\n--------\r\n\r\n- Device and Gateway Info\r\n- Linking and Group Control\r\n- Scene Control\r\n- Lighting Control\r\n- Thermostat Control\r\n- Sensor Control\r\n\r\nGetting Started\r\n---------------\r\n\r\n### Install\r\n\r\nInstall via npm:\r\n\r\n`npm install home-controller`\r\n\r\n### Example\r\n\r\nThe example below is a simple RESTful interface using the home-controller module and Express.\r\n\r\n```js\r\nvar Insteon = require('home-controller').Insteon;\r\nvar hub = new Insteon();\r\nvar express = require('express');\r\nvar app = express();\r\n\r\napp.get('/light/:id/on', function(req, res){\r\n  var id = req.params.id;\r\n  hub.light(id).turnOn()\r\n  .then(function (status) {\r\n    if(status.response) {\r\n      res.send(200);\r\n    } else {\r\n      res.send(404);\r\n    }\r\n  });\r\n});\r\n\r\nhub.connect(process.env.HUB_IP, function () {\r\n  app.listen(3000);\r\n});\r\n```\r\n\r\n### [Additional Examples](http://blog.automategreen.com/tag/home-controller-examples)\r\n\r\nAPI\r\n---\r\n\r\n**0.8.0 Update Highlights:**\r\n  - **BREAKING CHANGES**\r\n    * By default, events are not emitted for commands you call.  You can restore the previous functionality by setting `insteon.emitSelfAck = true`.\r\n  - Updated dependencies\r\n  - Improved testing and code\r\n\r\n**0.7.0 Update Highlights:**\r\n\r\n  - Major bugfixes and refactor of parsing code for event data\r\n  - Support for the Insteon 2245 hub\r\n  - Support for the following device types:\r\n    * X10\r\n    * IO Linc\r\n    * GarageDoor\r\n  - Drastic increase in test coverage\r\n\r\n**0.6.0 Update Highlights:**\r\n\r\n  - Add support for IO\r\n  - Add support for FanLinc (light)\r\n  - Add support for Node 0.12\r\n  - Add support for Spark based devices\r\n  - Bug fixes\r\n\r\n**0.5.2 Update Hightlights:**\r\n\r\n  - Add support for iMeter (meter)\r\n\r\n**0.5 Update Hightlights:**\r\n\r\n  - Add events for devices\r\n  - Add sensors support (motion, door, & leak)\r\n  - Node.js 0.11 support\r\n  - As always, a few bug fixes\r\n\r\n**0.4.3 Update Highlights:**\r\n\r\n  - Add thermostat.status()\r\n  - Several bug fixes\r\n\r\n**0.4.2 Update Highlights:**\r\n\r\n  - Add connect.serial()\r\n\r\n**0.4 Update Highlights:**\r\n\r\n  - Major refactoring of the code structure.\r\n  - All functions return promises (via [Q](https://github.com/kriskowal/q)). The callback function is now optional.\r\n  - The lighting function have been moved to the light class.  Old function are deprecated and will be removed with a later release.\r\n  - Thermostat control is now available\r\n  - As always, several bug were fixed (and probably several new one introduced).  Please open an issue if you find a bug.\r\n  - [Full releases notes](http://blog.automategreen.com/post/home-controller-0.4.0)\r\n\r\n### Insteon Gateway\r\n\r\n#### Class: Insteon()\r\n\r\nAdd `require` statement to the app to access the Insteon class\r\n\r\n```js\r\nvar Insteon = require('home-controller').Insteon;\r\n```\r\n\r\nThe Insteon class inherits [EventEmitter](http://nodejs.org/api/events.html)\r\n\r\n\r\n#### insteon.connect(host, [port], [connectListener])\r\n\r\nCreates a connection to the gateway.\r\n\r\nWhen the 'connect' event is emitted the connection is established. If there is a problem connecting, the 'connect' event will not be emitted, the 'error' event will be emitted with the exception. ([See socket.connect](http://nodejs.org/api/net.html#net_socket_connect_path_connectlistener));\r\n\r\n`connectListener`  will be added as an listener for the 'connect' event.\r\n\r\n\r\n##### Examples\r\n\r\n```js\r\nvar insteon = new Insteon();\r\ninsteon.connect('192.168.10.10', function(){\r\n  console.log('Connected!');\r\n});\r\n```\r\n\r\n#### insteon.serial(comName, [options], [connectListener])\r\n\r\nCreates a connection to a PowerLinc USB driver residing at the specified USB serial device.\r\nThe 'options' parameter, if present, contains values suitable for use with the\r\n[serialport](https://github.com/EmergingTechnologyAdvisors/node-serialport)\r\n[constructor](https://github.com/EmergingTechnologyAdvisors/node-serialport#new_module_serialport--SerialPort_new).\r\nThe 'connectListener' parameter, if present, will be invoked once the connection is open;\r\n\r\n**Warning** serialport is not supported in all environments. Verify serialport installed successfully before using this functionality.\r\n**Note** Starting with verion 5.0 `options` parameter accepts key names in camelCase only.\t\r\n\r\n#### insteon.httpClient({host: 'host' port: 123, ...}, [connectListener])\r\n<a name=\"http-client\"></a>\r\n\r\nConnect to a newer Hub (such as model 2245) via the HTTP interface.\r\nThe `config` must be an object with at minimum `host` and `port`. Full set of options:\r\n\r\n * `host` Required, the IP address or hostname of the hub on your local network\r\n * `port` Required, the port of the hub's interface (printed on the label on the bottom)\r\n * `user` The username for the endpoint (usually printed on the bottom label)\r\n * `password` Password for the endpoint (also on bottom label)\r\n * `maxDelay` Advanced Usage: the maximum amount of time (in milliseconds) between fetches. If not provided, this defaults to `5000`.\r\n\r\nThe optional `connectListener` parameter can be passed a function which will\r\nbe called after the client has made its first request, and is provided mainly\r\nfor symmetry with all the other types of client connections.\r\n\r\n##### HTTP Limitations\r\nDue to limitations in the Insteon Hub's single threaded design, when using the HTTP client, it will \"lock out\" any other local network apps (such as the Insteon Hub iOS app or other internal home-control apps) from accessing the hub for programming, setup, etc. To resume using those apps, you must first close your `home-controller` instance using either `insteon.close()` or closing out your application.\r\n\r\nSimilarly, you will probably find that if you were using one of these iOS apps, your application using home-controller will refuse to start until you quit the app.\r\n\r\n\r\n##### HTTP Client Example\r\n```js\r\nvar insteon = new Insteon();\r\nvar config = {\r\n  host: '192.168.10.10',\r\n  port: 2525,\r\n  user: 'hubuser',\r\n  password: 'hubpassword'\r\n};\r\ninsteon.httpClient(config, function(){\r\n  console.log('Connected!');\r\n});\r\n```\r\n\r\n\r\n#### insteon.close()\r\n\r\nCloses the connection to the gateway.  The event `'close'` will be emitted once the connection is closed.\r\n\r\n#### Event: 'connect'\r\n\r\nEmitted when the connection to the gateway is successfully established.\r\n\r\n#### Event: 'close'\r\n\r\nEmitted once the socket is fully closed. The argument had_error is a boolean which says if the socket was closed due to a transmission error. ([See net.Socket Event: 'close'](http://nodejs.org/api/net.html#net_event_close_1))\r\n\r\n**Callback arguments**\r\n\r\n- `had_error` Boolean true if the socket had a transmission error\r\n\r\n#### Event: 'command'\r\n\r\nEmitted when an unsolicited command is received. The argument `command` will be the command object.\r\n\r\n**Callback arguments**\r\n\r\n- `command` received from gateway\r\n\r\n#### Event: 'error'\r\n\r\nEmitted when an error occurs. The 'close' event will be called directly following this event.\r\n\r\n\r\n#### insteon.emitOnAck\r\n\r\nBy default, events will be emitted for both device triggered (button presses) and hub triggered actions.  If you don't want that behavior, disable it by setting `emitOnAck` to false.\r\n\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\nvar light = hub.light('112233');\r\n\r\nhub.connect(...);\r\n\r\nlight.turnOn(); // Emits 'turnOn' event\r\n\r\nhub.emitOnAck = false; // Disables events on command ack\r\n\r\nlight.turnOn(); // Does not emit event\r\n```\r\n\r\n\r\n#### insteon.emitDuplicates\r\n\r\nBy default, duplicate events for devices will be suppressed.  If you want to see the duplicate events, you must enable them by setting `emitDuplicates` to true.\r\n\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\n\r\nhub.emitDuplicates = true; // Enabled duplicate events\r\n```\r\n\r\n\r\n\r\n### Linking Functions\r\n\r\n#### insteon.link([device,] [options,] [callback])\r\n\r\nLinks device(s) to gateway\r\n\r\nCallback return link object as second argument (see `insteon.links`).\r\n\r\n`device` is the device to link.  It can either be a device id (6 digit hex String), an Array of ids, or null.  If a device id is provided, the device will be linked. If an array of ids is provided, each devices will be configured linked. If device is `null`, the  device must be put into linking state manually (hold set button). The device will be setup as the responder, unless the `controller` option is true.\r\n\r\n`options` is an Object with the options to be used during linking.\r\n\r\n##### Link Options Object\r\n\r\n```js\r\n{\r\n  controller: Boolean, // link the device(s) as a controller(s)\r\n  group: Number, // controller group/button\r\n  timeout: Number // timeout for manual linking\r\n}\r\n```\r\n\r\n`group` is the controller group to link the responders to.  Valid group numbers vary by device type.  The hub supports group numbers 0-255. Default is 1.\r\n\r\n`timeout` is the number of milliseconds to wait for linking to complete. (Remember you have to hold the set button for at least 10 seconds.)Default is 30000 ms.\r\n\r\n\r\n##### Examples\r\n\r\n\r\n```js\r\nvar insteon = Insteon('my.home.com');\r\n\r\n// Link two devices with for 2nd button on dimmer\r\ninsteon.link('AABBCC', '112233', {group: 2}, function(error, link) {\r\n  // link data from responder, 11.22.33\r\n});\r\n\r\n// Link gateway to multiple devices\r\ninsteon.link('gw', ['111111', '222222', '333333'], function(error, link) {\r\n  // link data from last responder, 33.33.33\r\n})\r\n\r\n// Link device to gateway\r\ninsteon.link('ABCDEF', 'gw', function(error, link) {\r\n  // link data from gateway\r\n});\r\n\r\n// Shorthand to link gateway to unknown device\r\ninsteon.link(function(error, link) { // link('gw', null, fn)\r\n  // link data from unknown device (responder)\r\n});\r\n\r\n// Link unknown device to gateway (same as link(null, 'gw', fn))\r\ninsteon.link(null, 'gw', function(error, link) {\r\n  // link data from gateway\r\n});\r\n\r\n// Shorthand to a device to an unknown device\r\ninsteon.link('123456', function(error, link) {  // link('123456', null, fn)\r\n  // link data from gateway\r\n});\r\n```\r\n\r\n\r\n#### insteon.unlink([[controller,] responder,] [options,] [callback])\r\n\r\nUnlinks device from the gateway\r\n\r\nSee `link` for usage.\r\n\r\n#### insteon.cancelLinking([callback])\r\n\r\nCancels linking/unlinking\r\n\r\n#### insteon.links([id,] [callback])\r\n\r\nGets the links of a device or the gateway\r\n\r\nLinks are returned in the callback as an Array of Link Objects.\r\n\r\n`id` is the id (6 digit hex String) of the device from which to retrieve the links.\r\n\r\n##### Link Object\r\n\r\n```js\r\n{\r\n\tid: String,\r\n\tgroup: Number,\r\n\tcontroller: Boolean,\r\n\tisInUse: Boolean,\r\n\thasBeenUsed: Boolean,\r\n\tisLast: Boolean,\r\n\tdata: Array(3)\r\n}\r\n```\r\n\r\n#### insteon.firstLink([callback])\r\n\r\nGets the first link record on the gateway\r\n\r\n#### insteon.nextLink([callback])\r\n\r\nGets the next link record on the gateway\r\n\r\n#### insteon.linkAt(id, at, [callback])\r\n\r\nGets the link at a memory address on a device\r\n\r\n`id` is the id (6 digit hex String) of the device\r\n\r\n`at` is the memory address.  Addresses start at 4095 (0xFFF) and count down by 8. (4095, 4087, 4079, ... ).\r\n\r\n### Scene Functions\r\n\r\n\r\n#### insteon.scene(controller, responder, [options,] [callback])\r\n\r\nCreates scene controller with responder(s)\r\n\r\nAll devices must be available and linked to the gateway.\r\n\r\n`controller` is the device to setup as controller.  It can either be a device id (6 digit hex String), the string 'gw', or null.  If a device id is provided, the device will be configured as the controller.  If controller is `'gw'` the gateway will be configured as the controller.\r\n\r\n`responder` is the device to setup as responder.  It can either be a responder object or an Array of responder objects. The responder object can also be the device id (6 digit hex String); default scene values will be used.\r\n\r\n##### Responder Object\r\n\r\n```js\r\n{\r\n\tid: String, // device id (6 digit hex String)\r\n\tlevel: Number, // See level in insteon.turnOn()\r\n\trate: Number, // See rate in insteon.turnOn()\r\n\tdata: Array  // data to be configure for scene (overrides level and rate)]\r\n}\r\n```\r\n\r\n`options` is an Object with the options to be used during linking.\r\n\r\n##### Scene Options Object\r\n\r\n```js\r\n{\r\n\tgroup: Number, // controller group/button (default: 1)\r\n\tremove: boolean // remove existing responders (default: false)\r\n}\r\n```\r\n\r\n`group` is the controller group to link the responders to.  Valid group numbers vary by device type.  The hub supports group numbers 0-255. Default is 1.\r\n\r\n`remove` is the boolean flag used to delete a responder(s) from the scene.\r\n\r\n#### insteon.sendAllLinkCmd (group, command, [callback])\r\n\r\nSends an Insteon All-link command for a link group\r\n\r\nUsed by sceneXX commands.\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n`command` is the insteon command (2 digit hex String) to send to the group.\r\n\r\n#### insteon.sceneOn (group, [callback])\r\n\r\nTurn on a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n#### insteon.sceneOnFast (group, [callback])\r\n\r\nTurn on fast a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n#### insteon.sceneOff (group, [callback])\r\n\r\nTurn off a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n#### insteon.sceneOffFast (group, [callback])\r\n\r\nTurn off fast a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n#### insteon.sceneDim (group, [callback])\r\n\r\nDim by one step a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n#### insteon.sceneBrighten (group, [callback])\r\n\r\nBrighten by one step a scene group\r\n\r\n`group` is the controller group on the gateway for which to trigger the command.\r\n\r\n\r\n### Information Functions\r\n\r\n#### insteon.info([id,] [callback])\r\n\r\nGets the product information about the gateway or a device\r\n\r\nProduct info object is returned in callback.\r\n\r\n`id` is the id (6 digit hex String) of the device from which to get the product info.  If not provided, the gateway's product info will be returned.  \r\n\r\n##### Example\r\n\r\n```js\r\nvar insteon = Insteon('my.home.com');\r\n\r\n// Get gateway info\r\ninsteon.info(function(error, info) {\r\n  // For details on the info object see below.\r\n});\r\n\r\n// Get Device info\r\ninsteon.info('AABBCC', function(error, info) {\r\n  // For details on the info object see below.\r\n});\r\n```\r\n\r\n##### Info Object\r\n\r\n```js\r\n{\r\n  id: String,\r\n  firmware, String,\r\n  deviceCategory: {\r\n    id: Number,\r\n    name: String\r\n  },\r\n  deviceSubCategory: {\r\n    id: Number\r\n  },\r\n  isDimmable: Boolean,\r\n  isLighting: Boolean,\r\n  isThermostat: Boolean\r\n}\r\n```\r\n\r\n#### insteon.ping(id, [callback])\r\n\r\nSends a Insteon ping to a device\r\n\r\nResponse object is returned in the callback, if the ping was successful.\r\n\r\n`id` is the id (6 digit hex String) of the device from which to get the product info.\r\n\r\n#### insteon.version(id, [callback])\r\n\r\nGets the version information about a device\r\n\r\nVersion object is returned in callback. Valid version names are i1, i2, and i2cs.\r\n\r\n`id` is the id (6 digit hex String) of the device from which to get the product info.\r\n\r\n##### Version Object\r\n\r\n```js\r\n{\r\n  code: Number,\r\n  name, String,\r\n}\r\n```\r\n\r\n### Lighting Functions\r\n\r\n**NOTE:** Lighting function have been moved into their own class.\r\n\r\n#### insteon.light(id)\r\n\r\nCreates a lighting object for the gateway. Use this to access all lighting control.\r\n\r\n`id` is the id (6 digit hex String) of the light switch.\r\n\r\n#### light.turnOn([level, [rate,]] [callback])\r\n\r\nTurns an Insteon dimmer switch on to the provided level\r\n\r\n`level` is the percentage (0-100) of full to which the dimmer is set. Non-dimmable switches ignore this and turn on to full. Defaults to 100 percent.\r\n\r\n`rate` is the speed at which the light is turned on to the provided `level`. If not provided, the default saved ramp rate of the device is used.  The rate value can either be 'slow', 'fast', or the number of milliseconds. 'fast' is 0.1 seconds.  'slow' is 1 minute.  If milliseconds is provided, the closest defined ramp rate less than the provided value is used.\r\n\r\n#### light.turnOnFast([callback])\r\n\r\nTurn light on fast (no ramp) to pre-saved level\r\n\r\n#### light.turnOff([rate,] [callback])\r\n\r\nTurns light off\r\n\r\n`rate` is the speed the light turns off.  See `on` for values.\r\n\r\n#### light.turnOffFast([callback])\r\n\r\nTurns light off fast (no ramp)\r\n\r\n#### light.brighten([callback])\r\n\r\nBrightens the light one step\r\n\r\n#### light.dim([callback])\r\n\r\nDims the light one step\r\n\r\n#### light.level([level,] [callback])\r\n\r\nGets or sets the light's current level\r\n\r\n`level` is the percentage (0-100) of full to which the dimmer is set. If not provided, then the current level of the device is returned in the callback.\r\n\r\n##### Example\r\n\r\n```js\r\nvar insteon = Insteon();\r\n\r\ninsteon.connect('my.home.com', function () {\r\n\r\n  var light = insteon.light('AABBCC'); // Create light object\r\n\r\n  light.level(50) // Set light level\r\n  .then(function() {\r\n    return light.level(); // Get light level\r\n  })\r\n  .then(function(level){\r\n    console.log(level); // 50\r\n  });\r\n});\r\n```\r\n\r\n### Fan Functions\r\n\r\nFan functions are part of the light class.  The FanLinc is more or less a dimmer with fan control.  All the normal dimmer controls work the same.\r\n\r\n#### light.fanOn([callback]), light.fanMedium([callback]), light.fan('medium', [callback])\r\n\r\nTurn the fan on to medium speed\r\n\r\n#### light.fanOff([callback]), light.fan('off', [callback])\r\n\r\nTurn the fan off\r\n\r\n#### light.fanLow([callback]), light.fan('low', [callback])\r\n\r\nTurn the fan on to low speed\r\n\r\n#### light.fanHigh([callback]), light.fan('high', [callback])\r\n\r\nTurn the fan on to high speed\r\n\r\n\r\n### Lighting Events\r\n\r\n#### Events Overview\r\n\r\nThe light object allows you to trigger on events from the device. This allows for functionality such as, send me a text when my light is turned on. Why would you want this?  I don't know, but I'll just assume you're a little crazy.\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\nvar light = hub.light('112233');\r\n\r\nlight.on('turnOn', function () {\r\n  sendTxt('My light is on');\r\n});\r\n\r\nhub.connect(...);\r\n```\r\n\r\nThere are several event's that could tell you your lights are on.  You may want the text for all of them (again crazy).\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\nvar light = hub.light('112233');\r\n\r\nlight.on('turnOn', sendOnTxt);\r\nlight.on('turnOnFast', sendOnTxt);\r\nlight.on('brightened', sendOnTxt);\r\n\r\nfunction sendOnTxt() {\r\n  sendTxt('My light is on');\r\n}\r\n\r\nhub.connect(...);\r\n```\r\n\r\n\r\n#### Event: 'turnOn'\r\n\r\nEvent emitted when a light's on button is tapped once\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n- `level` if provided, the level to which the light was turned on. Not provided for device trigged events.\r\n\r\n#### Event: 'turnOnFast'\r\n\r\nEvent emitted when a light's on button is tapped twice\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'turnOff'\r\n\r\nEvent emitted when a light's off button is tapped once\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'turnOffFast'\r\n\r\nEvent emitted when a light's off button is tapped twice\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'brightening'\r\n\r\nEvent emitted when a light's on button is held\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'brightened'\r\n\r\nEvent emitted when a light's on button is released\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'dimming'\r\n\r\nEvent emitted when a light's off button is held\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'dimmed'\r\n\r\nEvent emitted when a light's off button is released\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n\r\n#### Event: 'command'\r\n\r\nGeneric event emitted when a device generates a command\r\n\r\nOnly needed if you want direct access to the command data.\r\n\r\n**Callback arguments**\r\n\r\n- `group` the group/button for which the command was sent\r\n- `command1` the first command (the command type)\r\n- `command2` the second command (the command options)\r\n\r\n\r\n### Thermostat Functions\r\n\r\n#### insteon.thermostat(id)\r\n\r\nCreates a Thermostat object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the thermostat.\r\n\r\n#### thermostat.tempUp([change,] [callback])\r\n\r\nIncreases the set point by `change`\r\n\r\nIf `change` is not provided, increases the set point by 1 degree.\r\n\r\n`change` is the number of degrees to increase the set point. Defaults to 1.\r\n\r\n#### thermostat.tempDown([change,] [callback])\r\n\r\nDecreases the set point by `change`\r\n\r\nIf `change` is not provided, decreases the set point by 1 degree.\r\n\r\n`change` is the number of degrees to decrease the set point. Defaults to 1.\r\n\r\n#### thermostat.temp([zone,] [callback])\r\n\r\nGets the current air temperature for the `zone`\r\n\r\nIf no `zone` is provided, the default zone (0) is assumed.\r\n\r\n`zone` is the zone number. Defaults to 0.\r\n\r\n#### thermostat.setpoints([zone,] [callback])\r\n\r\nGets the current set points for the `zone`\r\n\r\nIf no `zone` is provided, the default zone (0) is assumed. Set points are provided as an array of either one or two set points depending on the mode.\r\n\r\n`zone` is the zone number. Defaults to 0.\r\n\r\n#### thermostat.mode([mode,] [callback])\r\n\r\nGets or sets the mode\r\n\r\nIf no `mode` parameter is provided, then the current mode is returned.\r\n\r\n`mode` can be one of the following: 'off', 'heat', 'cool', 'auto', 'fan', 'program', 'program heat', 'program cool', or 'fan auto'.  \r\n\r\n*Note: Not all thermostats support all modes.*\r\n\r\n#### thermostat.coolTemp(temperature, [callback])\r\n\r\nSets the cool temperature set point to `temperature`\r\n\r\n`temperature` is the integer value to set the cool set point to.\r\n\r\n#### thermostat.heatTemp(temperature, [callback])\r\n\r\nSets the heat temperature set point to `temperature`\r\n\r\n`temperature` is the integer value to set the heat set point to.\r\n\r\n#### thermostat.highHumidity(level, [callback])\r\n\r\nSets the high humidity to `level`\r\n\r\n`level` is the integer value from 1 to 100.\r\n\r\n#### thermostat.lowHumidity(level, [callback])\r\n\r\nSets the low humidity to `level`\r\n\r\n`level` is the integer value from 1 to 100.\r\n\r\n#### thermostat.backlight(delay, [callback])\r\n\r\nSets how long the back light will stay lit to `delay` in seconds\r\n\r\n`delay` is the integer value in seconds for how long the back light should stay lite. A value of 0 turns off the back light.\r\n\r\n#### thermostat.cycleDelay(delay, [callback])\r\n\r\nSets how long to delay between cycles\r\n\r\n`delay` is the integer value in minutes for how long to delay between cycles.\r\n\r\n#### thermostat.energyChange(change, [callback])\r\n\r\nSets how many degrees change should be applied when the thermostat is in energy saving mode\r\n\r\n`change` is the integer value in degrees of change.\r\n\r\n#### thermostat.date(date, [callback])\r\n\r\nSets the date (day of week, hour, minute, seconds)\r\n\r\n`date` is the Date object to set the thermostat to.  If `date` is not a Date object, it is converged to a Date object with `new Date(date)`.  The default value is `new Date()`.\r\n\r\n#### thermostat.details([callback])\r\n\r\nGets all the details about the thermostat\r\n\r\nThe returned details object is described below:\r\n\r\n```js\r\n{\r\n  date: {\r\n    day: Number, // 0-6 (0=Sunday, 1=Monday, ...)\r\n    hour: Number, // 0-23\r\n    minute: Number, // 0-59\r\n    seconds: Number, // 0-59\r\n  },\r\n  mode: String, // 'off', 'auto', 'heat', 'cool', 'program'\r\n  fan: Boolean, // if fan mode is on, true; if fan mode is auto, false\r\n  setpoints: {\r\n    cool: Number,\r\n    heat: Number,\r\n    highHumidity: Number,\r\n    lowHumidity: Number\r\n  },\r\n  humidity: Number, // Current air humidity\r\n  temperature: Number, // Current air temperature\r\n  unit: String, // 'F' or 'C'\r\n  cooling: Boolean, // true if the system is currently cooling\r\n  heating: Boolean, // true if the system is currently heating\r\n  energySaving: Boolean, // true if energy saving mode is active\r\n  hold: Boolean, // true if hold is enabled\r\n  backlight: Number, // Backlight delay before turning off\r\n  delay: Number, // Delay between cycles\r\n  energyOffset: Number // Number of degree to change the temperature by in energy mode\r\n}\r\n```\r\n\r\n#### thermostat.status([callback])\r\n\r\nGets the status of the thermostat. This is a subset of `.details()`, but it only requires a single Insteon command (i.e. faster).  The returned status object (subset of details object) is described below:\r\n\r\n```js\r\n{\r\n  date: {\r\n    day: Number, // 0-6 (0=Sunday, 1=Monday, ...)\r\n    hour: Number, // 0-23\r\n    minute: Number, // 0-59\r\n    seconds: Number, // 0-59\r\n  },\r\n  mode: String, // 'off', 'auto', 'heat', 'cool', 'program'\r\n  fan: Boolean, // if fan mode is on, true; if fan mode is auto, false\r\n  setpoints: {\r\n    cool: Number,\r\n    heat: Number\r\n  },\r\n  humidity: Number, // Current air humidity\r\n  temperature: Number, // Current air temperature\r\n  unit: String, // 'F' or 'C'\r\n  cooling: Boolean, // true if the system is currently cooling\r\n  heating: Boolean, // true if the system is currently heating\r\n  energySaving: Boolean, // true if energy saving mode is active\r\n  hold: Boolean, // true if hold is enabled\r\n}\r\n```\r\n\r\n\r\n### Thermostat Events\r\n\r\n#### Events Overview\r\n\r\nThe thermostat object allows you to trigger on events from the device. If you want to know how many times a day your AC turns on, you can count the 'cooling' events.\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\nvar thermostat = hub.thermostat('112233');\r\n\r\nvar count = 0;\r\nthermostat.on('cooling', function () {\r\n  console.log('AC turned count:' ++count);\r\n});\r\n\r\nhub.connect(...);\r\n```\r\n\r\n#### thermostat.monitor([enable,] [next])\r\n\r\nBy default, the thermostat will not send events to the hub.  You must enable this functionality.  This can be done with the `.monitor()` function.  This only needs to be done once.\r\n\r\n`enable` is a boolean flag that can be used to control if monitoring is enabled or disabled by the function.  Passing a value of `false` disables monitoring. The default value is `true`.\r\n\r\n**Example:**\r\n```js\r\nvar hub = new Insteon();\r\nvar thermostat = hub.thermostat('112233');\r\n\r\nhub.connect(host, function () {\r\n  thermostat.monitor();\r\n});\r\n```\r\n\r\n\r\n#### Event: 'cooling'\r\n\r\nEvent emitted when the thermostat starts cooling\r\n\r\n#### Event: 'heating'\r\n\r\nEvent emitted when the thermostat starts heating\r\n\r\n#### Event: 'off'\r\n\r\nEvent emitted when the thermostat stops heating or cooling (i.e. System is off.)\r\n\r\n#### Event: 'highHumidity'\r\n\r\nEvent emitted when humidity goes above the high humidity set point\r\n\r\n#### Event: 'lowHumidity'\r\n\r\nEvent emitted when humidity goes below the low humidity set point\r\n\r\n#### Event: 'normalHumidity'\r\n\r\nEvent emitted when humidity returns to normal levels (i.e. Humidity is between high and low set points.)\r\n\r\n**Important note:** in order to get the above events working, Thermostat must be properly linked to the PLM/Hub: as a controller on groups 1 through 5. For example, 'heating' event message will be sent by Thermostat with group 2. Therefore if you are not properly linked, PLM/Hub will discard the message.\r\n\r\n### Motion Sensor Functions\r\n\r\n#### insteon.motion(id)\r\n\r\nCreates a Motion object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the motion sensor.\r\n\r\n#### `wait` parameter\r\n\r\nAll function for the motion sensor have an optional `wait` parameter.  This parameter is used to control when the command is sent to the sensor.  The sensor is normally sleeping and cannot receive commands.  \r\n\r\nIf `wait` is true, then the command will not be sent until activity is detected (i.e. the sensor is awake). **Default Behavior**\r\n\r\nIf `wait` is false, the command will be sent immediately and the sensor must be in an active state.  Typically, this is done by setting the sensor into linking mode (Hold the set button until LED flashes. Then tap set button. The LED should be double blinking.)\r\n\r\n#### motion.status([wait], [callback])\r\n\r\nGets the status of the motion sensor\r\n\r\nThe returned status object is described below:\r\n\r\n```js\r\n{\r\n  ledLevel: Number, // 0 to 100\r\n  clearTimer: Number, // seconds in 30 second increments\r\n  duskThreshold: Number, // 0 to 100 - light level at to trigger dawn/dusk\r\n  options: {\r\n    occupancyMode: Boolean, // 'motion' event every ~4 sec\r\n    ledOn: Boolean, // turn on or off the LED when motion is detected\r\n    nightMode: Boolean, // Only send events when light level is below threshold\r\n    onOnlyMode: Boolean // Only send 'motion' events - no 'clear' event\r\n  },\r\n  jumpers: {\r\n    j1: Boolean,\r\n    j2: Boolean,\r\n    j3: Boolean,\r\n    j4: Boolean,\r\n    j5: Boolean\r\n  },\r\n  lightLevel: Number, // 0 to 100 - Current light level\r\n  batteryLevel: Number, // Approximate voltage\r\n}\r\n```\r\n\r\n#### motion.options(options, [wait], [callback])\r\n\r\nSets the configurable motion sensor options\r\n\r\n`options` is the options object.  Below are the defaults:\r\n\r\n```js\r\n{\r\n  occupancyMode: false,\r\n  ledOn: true,\r\n  nightMode: false,\r\n  onOnlyMode: false\r\n}\r\n```\r\n\r\n#### motion.clearTimer(timeout, [wait], [callback])\r\n\r\nSets the clear timer timeout for the motion sensor\r\n\r\n`timeout` is the timeout value in seconds (rounded up to nearest 30 second interval).  Defaults to 30 seconds (minimum value)\r\n\r\n\r\n#### motion.duskThreshold(threshold, [wait], [callback])\r\n\r\nSets the dusk light level threshold for the motion sensor\r\n\r\n`threshold` is the light level (0 to 100) to trigger the dawn/dusk event.\r\n\r\n### Motion Sensor Events\r\n\r\n#### Events Overview\r\n\r\nThe motion object allows you to trigger on events from the device.\r\n\r\n#### Event: 'motion'\r\n\r\nEvent emitted when motion is detected\r\n\r\n#### Event: 'clear'\r\n\r\nEvent emitted when clear timer expires after motion was detected\r\n\r\n#### Event: 'dawn'\r\n\r\nEvent emitted when the light level crosses the dusk threshold from night to day\r\n\r\n#### Event: 'dusk'\r\n\r\nEvent emitted when the light level crosses the dusk threshold from day to night\r\n\r\n#### Event: 'battery'\r\n\r\nEvent emitted when the battery is low\r\n\r\n\r\n### Door (Open/Close) Sensor Functions\r\n\r\n#### insteon.door(id)\r\n\r\nCreates a Door object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the door sensor.\r\n\r\n### Door Sensor Events\r\n\r\n#### Event: 'opened'\r\n\r\nEvent emitted when the sensor is opened\r\n\r\n#### Event: 'closed'\r\n\r\nEvent emitted when the sensor is closed\r\n\r\n#### Event: 'heartbeat'\r\n\r\nEvent emitted every 24 hours by the sensor to inform you it is alive\r\n\r\nA 'opened' or 'closed' event is also emitted depending on the state provided by the heartbeat event.\r\n\r\n### Leak Sensor Functions\r\n\r\n#### insteon.leak(id)\r\n\r\nCreates a Leak object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the motion sensor.\r\n\r\n### Leak Sensor Events\r\n\r\n#### Event: 'dry'\r\n\r\nEvent emitted when the sensor no longer detects moisture\r\n\r\n#### Event: 'wet'\r\n\r\nEvent emitted when the sensor detects moisture\r\n\r\nThe event is emitted every 15 seconds while water is present\r\n\r\n#### Event: 'heartbeat'\r\n\r\nEvent emitted every 24 hours by the sensor to inform you it is alive\r\n\r\nA 'wet' or 'dry' event is also emitted depending on the state provided by the heartbeat event.\r\n\r\n\r\n\r\n### Meter Functions\r\n\r\nFunctions to control Insteon's iMeter.\r\n\r\n#### insteon.meter(id)\r\n\r\nCreates a Meter object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the meter.\r\n\r\n#### meter.status([callback])\r\n\r\nGets the status of the meter\r\n\r\nThe returned status object is described below:\r\n\r\n```js\r\n{\r\n  energy: Number, // Accumulated energy in kW-hours\r\n  power: Number // Current power in watts\r\n}\r\n```\r\n\r\n#### meter.reset([callback])\r\n\r\nResets the energy accumulation\r\n\r\n#### meter.statusAndReset([callback])\r\n\r\nCombines the status and reset commands\r\n\r\n\r\n### IO Linc Functions\r\n\r\nFunctions to control an IO Linc.\r\n\r\n**Note:** The meaning of \"ON\" and \"OFF\" varies based on the IO Linc configurations. See Insteon documentation for details.\r\n\r\n#### insteon.ioLinc(id)\r\n\r\nCreates a IO Linc object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the IO Linc.\r\n\r\n#### ioLinc.relayOn(id)\r\n\r\nSend ON command to IO Linc\r\n\r\n`id` is the id (6 digit hex String) of the IO Linc.\r\n\r\n#### ioLinc.relayOff(id)\r\n\r\nSend OFF command to IO Linc\r\n\r\n`id` is the id (6 digit hex String) of the IO Linc.\r\n\r\n#### ioLinc.status([callback])\r\n\r\nGet the status of the IO Linc\r\n\r\nThe returned status object is described below:\r\n\r\n```js\r\n{\r\n  relay: String, // either \"on\" or \"off\"\r\n  sensor: String // either \"on\" or \"off\"\r\n}\r\n```\r\n\r\n### IO Linc Events\r\n\r\n#### Event: 'relayOn'\r\n\r\nEvent emitted when the relay is in the \"ON\" state.  \r\n\r\n#### Event: 'relayOff'\r\n\r\nEvent emitted when the relay is in the \"OFF\" state.  \r\n\r\n#### Event: 'sensorOn'\r\n\r\nEvent emitted when the sensor is in the \"ON\" state.  \r\n\r\n#### Event: 'sensorOff'\r\n\r\nEvent emitted when the sensor is in the \"OFF\" state.\r\n\r\n### EZ IO Sensor and Actuator Functions\r\n\r\n#### insteon.io(id)\r\n\r\nCreates an IO object with the Insteon id\r\n\r\n`id` is the id (6 digit hex String) of the IO sensor/actuator.\r\n\r\n#### io.on(port)\r\n\r\nTurns on the actuator port.  For a relay device like the EZIO4O, this command activates the relay numbered `port`.\r\n\r\n#### io.off(port)\r\n\r\nTurns off the actuator port.  For a relay device like the EZIO4O, this command resets the relay numbered `port`.\r\n\r\n#### io.set(data)\r\n\r\nSets all actuator ports based on the data number. Each port is represented by one bit in the data.  E.G. the data value `13` will clear all ports except ports 0, 1, and 4, which will be set.\r\n\r\n\r\n### X10 Functions\r\n\r\n#### insteon.x10(house, unit)\r\n\r\nCreates an X10 object with the house and unit code\r\n\r\n`house` is the house code ('A' - 'P')\r\n`unit` is the unit/device code (1-16)\r\n\r\n#### x10.turnOn()\r\n\r\nTurns on the device.\r\n\r\n#### x10.turnOff()\r\n\r\nTurns off the device.\r\n\r\n### Core Functions\r\n\r\n*For advanced users only.  These function are leveraged by the higher level functions.*\r\n\r\n#### insteon.sendCommand(command, [timeout,] [callback])\r\n\r\nSends command to PLM function on the gateway\r\n\r\n`command` can either be the String (hex byte) for the PLM command or the Command Object with a raw property.\r\n\r\nCommand Object:\r\n\r\n```js\r\n{\r\n  raw: String,\r\n  type: String\r\n}\r\n```\r\n\r\n`timeout` is the number of milliseconds to wait before checking the status.  If `timeout` is omitted or null, the command doesn't check the status.  `timeout` should be set to zero to check immediately.\r\n\r\n##### Status Object\r\n\r\nA Status Object will be returned in the callback.  The Status Object format depends on the response type.\r\n\r\n\r\nGet Modem Info Response (0x60) Status Object:\r\n\r\n```js\r\n{\r\n  command: Object,\r\n  ack: Boolean,\r\n  response: {\r\n    raw: String,\r\n    type: String,\r\n    id: String,\r\n    deviceCategory: {\r\n      id: Number,\r\n      name: String\r\n    },\r\n    deviceSubcategory: {\r\n      id: Number\r\n    },\r\n    firewareVersion: String\r\n  }\r\n}\r\n```\r\nSend Message Response (0x62) Status Object:\r\n\r\n```js\r\n{\r\n  command: Object,\r\n  ack: Boolean,\r\n  response: {\r\n    raw: String,\r\n    type: String,\r\n    id: String,\r\n    standard: {\r\n      id: String,\r\n      gatewayId: String,\r\n      extended: false,\r\n      messageType: Number,\r\n      hopsLeft: Number,\r\n      maxHops: Number,\r\n      command1: String,\r\n      command2: String,\r\n      raw: String\r\n    },\r\n    extended: {\r\n      id: String,\r\n      gatewayId: String,\r\n      extended: true,\r\n      messageType: Number,\r\n      hopsLeft: Number,\r\n      maxHops: Number,\r\n      command1: String,\r\n      command2: String,\r\n      userData: Array(14),\r\n      raw: String\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nAll-Linking Response (0x64) Status Object:\r\n\r\n```js\r\n{\r\n  command: Object,\r\n  ack: Boolean,\r\n  response: {\r\n    raw: String,\r\n    type: String,\r\n    controller: Boolean,\r\n    wasDeleted: Boolean,\r\n    group: Number,\r\n    id: String,\r\n    deviceCategory: {\r\n      id: Number,\r\n      name: String\r\n    },\r\n    deviceSubcategory: {\r\n      id: Number\r\n    },\r\n    firmwareVersion: String\r\n  }\r\n}\r\n```\r\n\r\nGet All-Link Record Response (0x69 & 0x6A) Status Object:\r\n\r\n```js\r\n{\r\n  command: Object,\r\n  ack: Boolean,\r\n  response: {\r\n    raw: String,\r\n    type: String,\r\n    link: {\r\n      controller: Boolean,\r\n      isInUse: Boolean,\r\n      hasBeenUsed: Boolean,\r\n      isLast: Boolean,\r\n      group: Number,\r\n      id: String,\r\n      data: Array(3)\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n#### insteon.directCommand(id, command, [param,] [timeout,] [callback])\r\n\r\nSends direct command to Insteon device\r\n\r\n`id` is the id (6 digit hex String) of the device.\r\n\r\n`command` can either be a hex String (length 2) or an Object. The String must be a standard direct command. If command is a String, then `param` can also be passed. The `param` will be defaulted to `'00'`.  If the command is an extended command, it must be passed as an Object with the extended property.\r\n\r\nStandard Command Object:\r\n\r\n```js\r\n{\r\n  cmd1: String,\r\n  cmd2: String\r\n}\r\n```\r\n\r\nExtended Command Object:\r\n\r\n```js\r\n{\r\n  extended: true,\r\n  cmd1: String,\r\n  cmd2: String,\r\n  userData: Array\r\n}\r\n```\r\n\r\n\r\n\r\nTesting\r\n-------\r\n\r\nTo test the package run:\r\n\r\n\tgrunt test\r\n\r\nReferences\r\n----------\r\n\r\n- [Insteon Details](http://www.insteon.com/pdf/insteondetails.pdf)\r\n- [Insteon Developer's Guide](http://www.insteon.com/pdf/insteon_developers_guide_20070816a.pdf)\r\n- [Insteon Command Tables](http://www.insteon.com/pdf/INSTEON_Command_Tables_20070925a.pdf)\r\n- [Insteon Device Categories](http://www.insteon.com/pdf/insteon_devcats_and_product_keys_20081008.pdf)\r\n- [Ramp Rates](http://www.madreporite.com/insteon/ramprate.htm)\r\n- [Automate Green Blog](http://blog.automategreen.com)\r\n","maintainers":[{"name":"brandongoode","email":"brandon@automategreen.com"},{"name":"siburny","email":"siburny+npmjs@gmail.com"}],"time":{"modified":"2022-06-18T21:07:06.862Z","created":"2013-09-02T22:00:36.426Z","0.1.0":"2013-09-02T22:00:38.498Z","0.2.0":"2013-11-21T03:07:34.808Z","0.3.0":"2014-01-11T02:26:34.830Z","0.3.1":"2014-03-20T01:22:53.432Z","0.3.2":"2014-03-24T12:38:47.265Z","0.3.4":"2014-05-02T12:39:32.910Z","0.3.5":"2014-05-03T12:04:40.982Z","0.4.0":"2014-05-10T14:07:05.030Z","0.4.1":"2014-05-14T18:18:23.255Z","0.4.2":"2014-05-15T11:42:14.524Z","0.4.3":"2014-05-29T11:28:29.944Z","0.5.0":"2014-07-15T01:32:39.185Z","0.5.1":"2014-07-17T01:58:32.153Z","0.5.2":"2014-07-18T19:44:49.398Z","0.6.0":"2015-04-22T02:35:40.059Z","0.7.0":"2017-03-30T11:02:31.574Z","0.8.0":"2017-08-04T13:34:33.721Z","0.8.2":"2018-06-25T12:20:46.708Z","0.9.0":"2020-05-11T22:56:01.604Z","0.9.2":"2021-05-19T15:01:11.577Z"},"author":{"name":"Brandon Goode","email":"brandon@automategreen.com"},"repository":{"type":"git","url":"git+https://github.com/automategreen/home-controller.git"},"homepage":"https://github.com/automategreen/home-controller","keywords":["automation","insteon"],"bugs":{"url":"https://github.com/automategreen/home-controller/issues","email":"support@automategreen.com"},"license":"MIT","readmeFilename":"Readme.md","users":{"nateowen1977":true,"l8niteowl":true}}