mirror of
				https://github.com/KevinMidboe/homebridge-examples.git
				synced 2025-10-29 17:40:26 +00:00 
			
		
		
		
	Initial commit
This commit is contained in:
		
							
								
								
									
										50
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| # homebridge-examples | ||||
|  | ||||
| This repo bundles some example implementations for homebridge plugins. They provide some example code to get  | ||||
| started with. They are also published on npm like regular plugins, so you can easily run them in your local | ||||
| homebridge instance. Refer to the respective `package.json` for the plugin name and install them as usual. | ||||
|  | ||||
| The examples are all written in Typescript and thus require at least homebridge `v1.0.0`.   | ||||
| To build a plugin run the following commands in the respective plugin directory. | ||||
|  | ||||
| Run this command once to install all dependencies required by the plugin: | ||||
| ``` | ||||
| npm install | ||||
| ```  | ||||
|  | ||||
| After that run the following command to compile the Typescript files into Javascript | ||||
| (repeat this step every time you change something in the code). | ||||
| ``` | ||||
| npm run build | ||||
| ``` | ||||
|  | ||||
| If you need inspiration for a plugin written in Javascript you can just run the above commands and look at the  | ||||
| generated Javascript code located in the `./dist` folder. You may need to ignore some code at the beginning of the file  | ||||
| generated by the Typescript compiler. | ||||
|  | ||||
| ## Examples for different homebridge plugin types | ||||
|  | ||||
| #### Accessory Plugins | ||||
|  | ||||
| Accessory plugins are the most basic and simplest plugins for homebridge. They should be used if you only want to  | ||||
| expose a single accessory and don't require any special functionality. | ||||
|  | ||||
| * [Accessory Plugin](./accessory-example-typescript): A simple Switch accessory. | ||||
|  | ||||
| #### Platform Plugins: | ||||
|  | ||||
| Platform plugins are able to expose multiple accessories. Additionally, they are required if you want to use the  | ||||
| Controller API.  | ||||
|  | ||||
| * [Static Platform Plugin](./static-platform-example-typescript): Static platforms know which accessories they want to  | ||||
| expose on start up. The set of accessories cannot change over the lifespan of the plugin. | ||||
| * [Dynamic Platform Plugin](./dynamic-platform-example-typescript): Dynamic platforms can dynamically add or remove  | ||||
| accessories at runtime. Accessories are fully stored to disk by homebridge, and the exact state is reconstructed on | ||||
| a reboot. The plugin can store additional context as well.  | ||||
| * [Independent Platform Plugin](./independent-platform-example-typescript): Independent platforms are typically used | ||||
| when the platform intends to only expose external accessories or provides other functionality while not exposing | ||||
| an accessory at all. | ||||
|  | ||||
| ## Other example plugins | ||||
|  | ||||
| * [Bridged Camera Platform](./bridged-camera-example-typescript) | ||||
							
								
								
									
										205
									
								
								accessory-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								accessory-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # Created by .ignore support plugin (hsz.mobi) | ||||
| ### HAP-NodeJS files | ||||
| persist | ||||
|  | ||||
| ### Node template | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| # Diagnostic reports (https://nodejs.org/api/report.html) | ||||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | ||||
|  | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
|  | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
|  | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| *.lcov | ||||
|  | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
|  | ||||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
|  | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
|  | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
|  | ||||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
|  | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| jspm_packages/ | ||||
|  | ||||
| # Snowpack dependency directory (https://snowpack.dev/) | ||||
| web_modules/ | ||||
|  | ||||
| # TypeScript cache | ||||
| *.tsbuildinfo | ||||
|  | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
|  | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
|  | ||||
| # Microbundle cache | ||||
| .rpt2_cache/ | ||||
| .rts2_cache_cjs/ | ||||
| .rts2_cache_es/ | ||||
| .rts2_cache_umd/ | ||||
|  | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
|  | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
|  | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
|  | ||||
| # dotenv environment variables file | ||||
| .env | ||||
| .env.test | ||||
|  | ||||
| # parcel-bundler cache (https://parceljs.org/) | ||||
| .cache | ||||
| .parcel-cache | ||||
|  | ||||
| # Next.js build output | ||||
| .next | ||||
|  | ||||
| # Nuxt.js build / generate output | ||||
| .nuxt | ||||
| dist | ||||
|  | ||||
| # Gatsby files | ||||
| .cache/ | ||||
| # Comment in the public line in if your project uses Gatsby and not Next.js | ||||
| # https://nextjs.org/blog/next-9-1#public-directory-support | ||||
| # public | ||||
|  | ||||
| # vuepress build output | ||||
| .vuepress/dist | ||||
|  | ||||
| # Serverless directories | ||||
| .serverless/ | ||||
|  | ||||
| # FuseBox cache | ||||
| .fusebox/ | ||||
|  | ||||
| # DynamoDB Local files | ||||
| .dynamodb/ | ||||
|  | ||||
| # TernJS port file | ||||
| .tern-port | ||||
|  | ||||
| # Stores VSCode versions used for testing VSCode extensions | ||||
| .vscode-test | ||||
|  | ||||
| # yarn v2 | ||||
|  | ||||
| .yarn/cache | ||||
| .yarn/unplugged | ||||
| .yarn/build-state.yml | ||||
| .pnp.* | ||||
|  | ||||
| ### VisualStudioCode template | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| ### JetBrains template | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
|  | ||||
| # User-specific stuff | ||||
| .idea/**/workspace.xml | ||||
| .idea/**/tasks.xml | ||||
| .idea/**/usage.statistics.xml | ||||
| .idea/**/dictionaries | ||||
| .idea/**/shelf | ||||
|  | ||||
| # Generated files | ||||
| .idea/**/contentModel.xml | ||||
|  | ||||
| # Sensitive or high-churn files | ||||
| .idea/**/dataSources/ | ||||
| .idea/**/dataSources.ids | ||||
| .idea/**/dataSources.local.xml | ||||
| .idea/**/sqlDataSources.xml | ||||
| .idea/**/dynamic.xml | ||||
| .idea/**/uiDesigner.xml | ||||
| .idea/**/dbnavigator.xml | ||||
|  | ||||
| # Gradle | ||||
| .idea/**/gradle.xml | ||||
| .idea/**/libraries | ||||
|  | ||||
| # Gradle and Maven with auto-import | ||||
| # When using Gradle or Maven with auto-import, you should exclude module files, | ||||
| # since they will be recreated, and may cause churn.  Uncomment if using | ||||
| # auto-import. | ||||
| # .idea/artifacts | ||||
| # .idea/compiler.xml | ||||
| # .idea/jarRepositories.xml | ||||
| # .idea/modules.xml | ||||
| # .idea/*.iml | ||||
| # .idea/modules | ||||
| # *.iml | ||||
| # *.ipr | ||||
|  | ||||
| # CMake | ||||
| cmake-build-*/ | ||||
|  | ||||
| # Mongo Explorer plugin | ||||
| .idea/**/mongoSettings.xml | ||||
|  | ||||
| # File-based project format | ||||
| *.iws | ||||
|  | ||||
| # IntelliJ | ||||
| out/ | ||||
|  | ||||
| # mpeltonen/sbt-idea plugin | ||||
| .idea_modules/ | ||||
|  | ||||
| # JIRA plugin | ||||
| atlassian-ide-plugin.xml | ||||
|  | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
|  | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| crashlytics-build.properties | ||||
| fabric.properties | ||||
|  | ||||
| # Editor-based Rest Client | ||||
| .idea/httpRequests | ||||
|  | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
|  | ||||
							
								
								
									
										14
									
								
								accessory-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								accessory-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ISC License (ISC) | ||||
| Copyright (c) 2020 Andreas Bauer | ||||
|  | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||||
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||||
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||||
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||||
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||
| PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										588
									
								
								accessory-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								accessory-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | ||||
| { | ||||
|   "name": "homebridge-accessory-example", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/color-name": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | ||||
|       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "10.17.19", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", | ||||
|       "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||
|       "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/color-name": "^1.1.1", | ||||
|         "color-convert": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", | ||||
|       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "bonjour-hap": { | ||||
|       "version": "3.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", | ||||
|       "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "array-flatten": "^2.1.0", | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "dns-equal": "^1.0.0", | ||||
|         "dns-txt": "^2.0.2", | ||||
|         "multicast-dns": "^7.2.0", | ||||
|         "multicast-dns-service-types": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "buffer-from": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "buffer-indexof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", | ||||
|       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||
|       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^4.1.0", | ||||
|         "supports-color": "^7.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
|       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "~1.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||
|       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", | ||||
|       "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ms": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "decimal.js": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", | ||||
|       "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", | ||||
|       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-arguments": "^1.0.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-regex": "^1.0.4", | ||||
|         "object-is": "^1.0.1", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "regexp.prototype.flags": "^1.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "dns-equal": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", | ||||
|       "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "dns-packet": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", | ||||
|       "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ip": "^1.1.5", | ||||
|         "safe-buffer": "^5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "dns-txt": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", | ||||
|       "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-indexof": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.17.5", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", | ||||
|       "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.2.1", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has": "^1.0.3", | ||||
|         "has-symbols": "^1.0.1", | ||||
|         "is-callable": "^1.1.5", | ||||
|         "is-regex": "^1.0.5", | ||||
|         "object-inspect": "^1.7.0", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "object.assign": "^4.1.0", | ||||
|         "string.prototype.trimleft": "^2.1.1", | ||||
|         "string.prototype.trimright": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", | ||||
|       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-srp-hap": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", | ||||
|       "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | ||||
|       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "glob": { | ||||
|       "version": "7.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | ||||
|       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fs.realpath": "^1.0.0", | ||||
|         "inflight": "^1.0.4", | ||||
|         "inherits": "2", | ||||
|         "minimatch": "^3.0.4", | ||||
|         "once": "^1.3.0", | ||||
|         "path-is-absolute": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "hap-nodejs": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.6.2.tgz", | ||||
|       "integrity": "sha512-/LlRaYCtcwC4jBUKRJeBUdUfKEp8w/NK3PNYXaAOngQL9uVnqsvQ0Gce/mUhSXPhsxfdnxbHVT870W9OEnV6+A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "bonjour-hap": "3.5.4", | ||||
|         "debug": "^4.1.1", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "fast-srp-hap": "2.0.1", | ||||
|         "ip": "^1.1.3", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "tweetnacl": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", | ||||
|       "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "homebridge": { | ||||
|       "version": "0.4.54-beta.51", | ||||
|       "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.54-beta.51.tgz", | ||||
|       "integrity": "sha512-WycAihWBzWu+8ZBnVrU4wqdU0bq/cT43iKdk2+6ODhbGh/xlaxIFpMdSGX++YqwGpu7cNEL0L45Woj9sEfFYNw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "chalk": "^3.0.0", | ||||
|         "commander": "5.0.0", | ||||
|         "hap-nodejs": "0.6.2", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "qrcode-terminal": "^0.12.0", | ||||
|         "semver": "^7.1.3", | ||||
|         "source-map-support": "^0.5.16" | ||||
|       } | ||||
|     }, | ||||
|     "inflight": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||
|       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "once": "^1.3.0", | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", | ||||
|       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-arguments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", | ||||
|       "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", | ||||
|       "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", | ||||
|       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", | ||||
|       "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "minimist": { | ||||
|       "version": "1.2.5", | ||||
|       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | ||||
|       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "mkdirp": { | ||||
|       "version": "0.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | ||||
|       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "minimist": "^1.2.5" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "multicast-dns": { | ||||
|       "version": "7.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", | ||||
|       "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "dns-packet": "^4.0.0", | ||||
|         "thunky": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "multicast-dns-service-types": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", | ||||
|       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node-persist": { | ||||
|       "version": "0.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", | ||||
|       "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mkdirp": "~0.5.1", | ||||
|         "q": "~1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "object-inspect": { | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", | ||||
|       "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object-is": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", | ||||
|       "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "object-keys": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", | ||||
|       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object.assign": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", | ||||
|       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.2", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has-symbols": "^1.0.0", | ||||
|         "object-keys": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "once": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||||
|       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
|       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "q": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", | ||||
|       "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "qrcode-terminal": { | ||||
|       "version": "0.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", | ||||
|       "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "regexp.prototype.flags": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", | ||||
|       "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.0-next.1" | ||||
|       } | ||||
|     }, | ||||
|     "rimraf": { | ||||
|       "version": "3.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", | ||||
|       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob": "^7.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", | ||||
|       "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "7.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", | ||||
|       "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.16", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", | ||||
|       "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimend": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", | ||||
|       "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimleft": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", | ||||
|       "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimstart": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimright": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", | ||||
|       "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimend": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimstart": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", | ||||
|       "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||
|       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "thunky": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", | ||||
|       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "tweetnacl": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", | ||||
|       "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "3.8.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", | ||||
|       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "wrappy": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||||
|       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								accessory-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								accessory-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| { | ||||
|   "name": "homebridge-accessory-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "An example accessory plugin for homebridge written in Typescript", | ||||
|   "main": "dist/accessory.js", | ||||
|   "scripts": { | ||||
|     "clean": "rimraf ./dist", | ||||
|     "build": "rimraf ./dist && tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postpublish": "npm run clean", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Andreas Bauer <mail@anderl-bauer.de>", | ||||
|   "engines": { | ||||
|     "homebridge": ">=1.0.0" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "homebridge-plugin" | ||||
|   ], | ||||
|   "license": "ISC", | ||||
|   "files": [ | ||||
|     "LICENSE", | ||||
|     "dist" | ||||
|   ], | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/homebridge/homebridge-examples.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "http://github.com/homebridge/homebridge-examples/issues" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "10.17.19", | ||||
|     "typescript": "^3.8.3", | ||||
|     "rimraf": "^3.0.2", | ||||
|     "homebridge": "^0.4.54-beta.51" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										77
									
								
								accessory-example-typescript/src/accessory.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								accessory-example-typescript/src/accessory.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| import { | ||||
|   AccessoryConfig, | ||||
|   AccessoryPlugin, | ||||
|   API, | ||||
|   CharacteristicGetCallback, | ||||
|   CharacteristicSetCallback, | ||||
|   CharacteristicValue, | ||||
|   HAP, | ||||
|   Logging, | ||||
|   Service | ||||
| } from "homebridge"; | ||||
|  | ||||
| /** | ||||
|  * TODO explain | ||||
|  */ | ||||
| let hap: HAP; | ||||
|  | ||||
| /* | ||||
|  * Initializer function called when the plugin is loaded. | ||||
|  */ | ||||
| export = (api: API) => { | ||||
|   hap = api.hap; | ||||
|   api.registerAccessory("ExampleSwitch", ExampleSwitch); | ||||
| }; | ||||
|  | ||||
| class ExampleSwitch implements AccessoryPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|   private readonly name: string; | ||||
|   private switchOn = false; | ||||
|  | ||||
|   private readonly switchService: Service; | ||||
|   private readonly informationService: Service; | ||||
|  | ||||
|   constructor(log: Logging, config: AccessoryConfig, api: API) { | ||||
|     this.log = log; | ||||
|     this.name = config.name; | ||||
|  | ||||
|     this.switchService = new hap.Service.Switch(this.name); | ||||
|     this.switchService.getCharacteristic(hap.Characteristic.On) | ||||
|       .on(hap.CharacteristicEventTypes.GET, (callback: CharacteristicGetCallback) => { | ||||
|         log.info("Current state of the switch was returned: " + (this.switchOn? "ON": "OFF")); | ||||
|         callback(undefined, this.switchOn); | ||||
|       }) | ||||
|       .on(hap.CharacteristicEventTypes.SET, (value: CharacteristicValue, callback: CharacteristicSetCallback) => { | ||||
|         this.switchOn = value as boolean; | ||||
|         log.info("Switch state was set to: " + (this.switchOn? "ON": "OFF")); | ||||
|         callback(); | ||||
|       }); | ||||
|  | ||||
|     this.informationService = new hap.Service.AccessoryInformation() | ||||
|       .setCharacteristic(hap.Characteristic.Manufacturer, "Custom Manufacturer") | ||||
|       .setCharacteristic(hap.Characteristic.Model, "Custom Model"); | ||||
|  | ||||
|     log.info("Switch finished initializing!"); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This method is optional to implement. It is called when HomeKit ask to identify the accessory. | ||||
|    * Typical this only ever happens at the pairing process. | ||||
|    */ | ||||
|   identify(): void { | ||||
|     this.log("Identify!"); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This method is called directly after creation of this instance. | ||||
|    * It should return all services which should be added to the accessory. | ||||
|    */ | ||||
|   getServices(): Service[] { | ||||
|     return [ | ||||
|       this.informationService, | ||||
|       this.switchService, | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								accessory-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								accessory-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ES2018", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "ES2015", | ||||
|       "ES2016", | ||||
|       "ES2017", | ||||
|       "ES2018" | ||||
|     ], | ||||
|     "sourceMap": true, | ||||
|     "rootDir": "src", | ||||
|     "outDir": "dist", | ||||
|  | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true | ||||
|   }, | ||||
|   "include": [ | ||||
|     "src" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										205
									
								
								bridged-camera-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								bridged-camera-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # Created by .ignore support plugin (hsz.mobi) | ||||
| ### HAP-NodeJS files | ||||
| persist | ||||
|  | ||||
| ### Node template | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| # Diagnostic reports (https://nodejs.org/api/report.html) | ||||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | ||||
|  | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
|  | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
|  | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| *.lcov | ||||
|  | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
|  | ||||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
|  | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
|  | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
|  | ||||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
|  | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| jspm_packages/ | ||||
|  | ||||
| # Snowpack dependency directory (https://snowpack.dev/) | ||||
| web_modules/ | ||||
|  | ||||
| # TypeScript cache | ||||
| *.tsbuildinfo | ||||
|  | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
|  | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
|  | ||||
| # Microbundle cache | ||||
| .rpt2_cache/ | ||||
| .rts2_cache_cjs/ | ||||
| .rts2_cache_es/ | ||||
| .rts2_cache_umd/ | ||||
|  | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
|  | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
|  | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
|  | ||||
| # dotenv environment variables file | ||||
| .env | ||||
| .env.test | ||||
|  | ||||
| # parcel-bundler cache (https://parceljs.org/) | ||||
| .cache | ||||
| .parcel-cache | ||||
|  | ||||
| # Next.js build output | ||||
| .next | ||||
|  | ||||
| # Nuxt.js build / generate output | ||||
| .nuxt | ||||
| dist | ||||
|  | ||||
| # Gatsby files | ||||
| .cache/ | ||||
| # Comment in the public line in if your project uses Gatsby and not Next.js | ||||
| # https://nextjs.org/blog/next-9-1#public-directory-support | ||||
| # public | ||||
|  | ||||
| # vuepress build output | ||||
| .vuepress/dist | ||||
|  | ||||
| # Serverless directories | ||||
| .serverless/ | ||||
|  | ||||
| # FuseBox cache | ||||
| .fusebox/ | ||||
|  | ||||
| # DynamoDB Local files | ||||
| .dynamodb/ | ||||
|  | ||||
| # TernJS port file | ||||
| .tern-port | ||||
|  | ||||
| # Stores VSCode versions used for testing VSCode extensions | ||||
| .vscode-test | ||||
|  | ||||
| # yarn v2 | ||||
|  | ||||
| .yarn/cache | ||||
| .yarn/unplugged | ||||
| .yarn/build-state.yml | ||||
| .pnp.* | ||||
|  | ||||
| ### VisualStudioCode template | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| ### JetBrains template | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
|  | ||||
| # User-specific stuff | ||||
| .idea/**/workspace.xml | ||||
| .idea/**/tasks.xml | ||||
| .idea/**/usage.statistics.xml | ||||
| .idea/**/dictionaries | ||||
| .idea/**/shelf | ||||
|  | ||||
| # Generated files | ||||
| .idea/**/contentModel.xml | ||||
|  | ||||
| # Sensitive or high-churn files | ||||
| .idea/**/dataSources/ | ||||
| .idea/**/dataSources.ids | ||||
| .idea/**/dataSources.local.xml | ||||
| .idea/**/sqlDataSources.xml | ||||
| .idea/**/dynamic.xml | ||||
| .idea/**/uiDesigner.xml | ||||
| .idea/**/dbnavigator.xml | ||||
|  | ||||
| # Gradle | ||||
| .idea/**/gradle.xml | ||||
| .idea/**/libraries | ||||
|  | ||||
| # Gradle and Maven with auto-import | ||||
| # When using Gradle or Maven with auto-import, you should exclude module files, | ||||
| # since they will be recreated, and may cause churn.  Uncomment if using | ||||
| # auto-import. | ||||
| # .idea/artifacts | ||||
| # .idea/compiler.xml | ||||
| # .idea/jarRepositories.xml | ||||
| # .idea/modules.xml | ||||
| # .idea/*.iml | ||||
| # .idea/modules | ||||
| # *.iml | ||||
| # *.ipr | ||||
|  | ||||
| # CMake | ||||
| cmake-build-*/ | ||||
|  | ||||
| # Mongo Explorer plugin | ||||
| .idea/**/mongoSettings.xml | ||||
|  | ||||
| # File-based project format | ||||
| *.iws | ||||
|  | ||||
| # IntelliJ | ||||
| out/ | ||||
|  | ||||
| # mpeltonen/sbt-idea plugin | ||||
| .idea_modules/ | ||||
|  | ||||
| # JIRA plugin | ||||
| atlassian-ide-plugin.xml | ||||
|  | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
|  | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| crashlytics-build.properties | ||||
| fabric.properties | ||||
|  | ||||
| # Editor-based Rest Client | ||||
| .idea/httpRequests | ||||
|  | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
|  | ||||
							
								
								
									
										14
									
								
								bridged-camera-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								bridged-camera-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ISC License (ISC) | ||||
| Copyright (c) 2020 Andreas Bauer | ||||
|  | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||||
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||||
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||||
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||||
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||
| PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										596
									
								
								bridged-camera-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										596
									
								
								bridged-camera-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,596 @@ | ||||
| { | ||||
|   "name": "homebridge-bridged-camera-example", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/color-name": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | ||||
|       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/ip": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.0.tgz", | ||||
|       "integrity": "sha512-dwNe8gOoF70VdL6WJBwVHtQmAX4RMd62M+mAB9HQFjG1/qiCLM/meRy95Pd14FYBbEDwCq7jgJs89cHpLBu4HQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "10.17.19", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", | ||||
|       "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||
|       "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/color-name": "^1.1.1", | ||||
|         "color-convert": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", | ||||
|       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "bonjour-hap": { | ||||
|       "version": "3.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", | ||||
|       "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "array-flatten": "^2.1.0", | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "dns-equal": "^1.0.0", | ||||
|         "dns-txt": "^2.0.2", | ||||
|         "multicast-dns": "^7.2.0", | ||||
|         "multicast-dns-service-types": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "buffer-from": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "buffer-indexof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", | ||||
|       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||
|       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^4.1.0", | ||||
|         "supports-color": "^7.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
|       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "~1.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||
|       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", | ||||
|       "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ms": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "decimal.js": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", | ||||
|       "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", | ||||
|       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-arguments": "^1.0.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-regex": "^1.0.4", | ||||
|         "object-is": "^1.0.1", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "regexp.prototype.flags": "^1.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "dns-equal": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", | ||||
|       "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "dns-packet": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", | ||||
|       "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ip": "^1.1.5", | ||||
|         "safe-buffer": "^5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "dns-txt": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", | ||||
|       "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-indexof": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.17.5", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", | ||||
|       "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.2.1", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has": "^1.0.3", | ||||
|         "has-symbols": "^1.0.1", | ||||
|         "is-callable": "^1.1.5", | ||||
|         "is-regex": "^1.0.5", | ||||
|         "object-inspect": "^1.7.0", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "object.assign": "^4.1.0", | ||||
|         "string.prototype.trimleft": "^2.1.1", | ||||
|         "string.prototype.trimright": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", | ||||
|       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-srp-hap": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", | ||||
|       "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | ||||
|       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "glob": { | ||||
|       "version": "7.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | ||||
|       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fs.realpath": "^1.0.0", | ||||
|         "inflight": "^1.0.4", | ||||
|         "inherits": "2", | ||||
|         "minimatch": "^3.0.4", | ||||
|         "once": "^1.3.0", | ||||
|         "path-is-absolute": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "hap-nodejs": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.6.2.tgz", | ||||
|       "integrity": "sha512-/LlRaYCtcwC4jBUKRJeBUdUfKEp8w/NK3PNYXaAOngQL9uVnqsvQ0Gce/mUhSXPhsxfdnxbHVT870W9OEnV6+A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "bonjour-hap": "3.5.4", | ||||
|         "debug": "^4.1.1", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "fast-srp-hap": "2.0.1", | ||||
|         "ip": "^1.1.3", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "tweetnacl": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", | ||||
|       "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "homebridge": { | ||||
|       "version": "0.4.54-beta.51", | ||||
|       "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.54-beta.51.tgz", | ||||
|       "integrity": "sha512-WycAihWBzWu+8ZBnVrU4wqdU0bq/cT43iKdk2+6ODhbGh/xlaxIFpMdSGX++YqwGpu7cNEL0L45Woj9sEfFYNw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "chalk": "^3.0.0", | ||||
|         "commander": "5.0.0", | ||||
|         "hap-nodejs": "0.6.2", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "qrcode-terminal": "^0.12.0", | ||||
|         "semver": "^7.1.3", | ||||
|         "source-map-support": "^0.5.16" | ||||
|       } | ||||
|     }, | ||||
|     "inflight": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||
|       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "once": "^1.3.0", | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", | ||||
|       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" | ||||
|     }, | ||||
|     "is-arguments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", | ||||
|       "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", | ||||
|       "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", | ||||
|       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", | ||||
|       "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "minimist": { | ||||
|       "version": "1.2.5", | ||||
|       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | ||||
|       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "mkdirp": { | ||||
|       "version": "0.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | ||||
|       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "minimist": "^1.2.5" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "multicast-dns": { | ||||
|       "version": "7.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", | ||||
|       "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "dns-packet": "^4.0.0", | ||||
|         "thunky": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "multicast-dns-service-types": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", | ||||
|       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node-persist": { | ||||
|       "version": "0.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", | ||||
|       "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mkdirp": "~0.5.1", | ||||
|         "q": "~1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "object-inspect": { | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", | ||||
|       "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object-is": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", | ||||
|       "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "object-keys": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", | ||||
|       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object.assign": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", | ||||
|       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.2", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has-symbols": "^1.0.0", | ||||
|         "object-keys": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "once": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||||
|       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
|       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "q": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", | ||||
|       "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "qrcode-terminal": { | ||||
|       "version": "0.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", | ||||
|       "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "regexp.prototype.flags": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", | ||||
|       "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.0-next.1" | ||||
|       } | ||||
|     }, | ||||
|     "rimraf": { | ||||
|       "version": "3.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", | ||||
|       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob": "^7.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", | ||||
|       "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "7.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", | ||||
|       "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.16", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", | ||||
|       "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimend": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", | ||||
|       "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimleft": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", | ||||
|       "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimstart": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimright": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", | ||||
|       "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimend": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimstart": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", | ||||
|       "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||
|       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "thunky": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", | ||||
|       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "tweetnacl": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", | ||||
|       "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "3.8.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", | ||||
|       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "wrappy": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||||
|       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										42
									
								
								bridged-camera-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								bridged-camera-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| { | ||||
|   "name": "homebridge-bridged-camera-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "An example dynamic platform plugin exposing cameras behind a bridge for homebridge written in Typescript", | ||||
|   "main": "dist/dynamic-camera-platform.js", | ||||
|   "scripts": { | ||||
|     "clean": "rimraf ./dist", | ||||
|     "build": "rimraf ./dist && tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postpublish": "npm run clean", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Andreas Bauer <mail@anderl-bauer.de>", | ||||
|   "engines": { | ||||
|     "homebridge": ">=1.0.0" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "homebridge-plugin" | ||||
|   ], | ||||
|   "license": "ISC", | ||||
|   "files": [ | ||||
|     "LICENSE", | ||||
|     "dist" | ||||
|   ], | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/homebridge/homebridge-examples.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "http://github.com/homebridge/homebridge-examples/issues" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "ip": "^1.1.5" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "10.17.19", | ||||
|     "@types/ip": "^1.1.0", | ||||
|     "typescript": "^3.8.3", | ||||
|     "rimraf": "^3.0.2", | ||||
|     "homebridge": "^0.4.54-beta.51" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										164
									
								
								bridged-camera-example-typescript/src/dynamic-camera-platform.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								bridged-camera-example-typescript/src/dynamic-camera-platform.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| import http, {IncomingMessage, Server, ServerResponse} from "http"; | ||||
| import { | ||||
|   API, | ||||
|   APIEvent, | ||||
|   CameraControllerOptions, | ||||
|   DynamicPlatformPlugin, | ||||
|   HAP, | ||||
|   Logging, | ||||
|   PlatformAccessory, | ||||
|   PlatformAccessoryEvent, | ||||
|   PlatformConfig, | ||||
| } from "homebridge"; | ||||
| import {ExampleFFMPEGStreamingDelegate} from "./streamingDelegate"; | ||||
|  | ||||
| const PLUGIN_NAME = "homebridge-bridged-camera-example"; | ||||
| const PLATFORM_NAME = "ExampleDynamicCameraPlatform"; | ||||
|  | ||||
| /** | ||||
|  * TODO explain | ||||
|  */ | ||||
| let hap: HAP; | ||||
| let Accessory: typeof PlatformAccessory; | ||||
|  | ||||
| export = (api: API) => { | ||||
|   hap = api.hap; | ||||
|   Accessory = api.platformAccessory; | ||||
|  | ||||
|   api.registerPlatform(PLATFORM_NAME, ExampleDynamicPlatform); | ||||
| }; | ||||
|  | ||||
| class ExampleDynamicPlatform implements DynamicPlatformPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|   private readonly api: API; | ||||
|  | ||||
|   private requestServer?: Server; | ||||
|  | ||||
|   private readonly accessories: PlatformAccessory[] = []; | ||||
|  | ||||
|   constructor(log: Logging, config: PlatformConfig, api: API) { | ||||
|     this.log = log; | ||||
|     this.api = api; | ||||
|  | ||||
|     // probably parse config or something here | ||||
|  | ||||
|     log.info("Example platform finished initializing!"); | ||||
|  | ||||
|     /* | ||||
|      * When this event is fired, homebridge restored all cached accessories from disk and did call their respective | ||||
|      * `configureAccessory` method for all of them. Dynamic Platform plugins should only register new accessories | ||||
|      * after this event was fired, in order to ensure they weren't added to homebridge already. | ||||
|      * This event can also be used to start discovery of new accessories. | ||||
|      */ | ||||
|     api.on(APIEvent.DID_FINISH_LAUNCHING, () => { | ||||
|       log.info("Example platform 'didFinishLaunching'"); | ||||
|  | ||||
|       // The idea of this plugin is that we open a http service which exposes api calls to add or remove accessories | ||||
|       this.createHttpService(); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This function is invoked when homebridge restores cached accessories from disk at startup. | ||||
|    * It should be used to setup event handlers for characteristics and update respective values. | ||||
|    */ | ||||
|   configureAccessory(accessory: PlatformAccessory): void { | ||||
|     this.log("Configuring accessory %s", accessory.displayName); | ||||
|  | ||||
|     accessory.on(PlatformAccessoryEvent.IDENTIFY, () => { | ||||
|       this.log("%s identified!", accessory.displayName); | ||||
|     }); | ||||
|  | ||||
|     const streamingDelegate = new ExampleFFMPEGStreamingDelegate(hap); | ||||
|     const options: CameraControllerOptions = { | ||||
|       cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine | ||||
|       delegate: streamingDelegate, | ||||
|  | ||||
|       streamingOptions: { | ||||
|         // srtp: true, // legacy option which will just enable AES_CM_128_HMAC_SHA1_80 (can still be used though) | ||||
|         supportedCryptoSuites: [hap.SRTPCryptoSuites.NONE, hap.SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80], // NONE is not supported by iOS just there for testing with Wireshark for example | ||||
|         video: { | ||||
|           codec: { | ||||
|             profiles: [hap.H264Profile.BASELINE, hap.H264Profile.MAIN, hap.H264Profile.HIGH], | ||||
|             levels: [hap.H264Level.LEVEL3_1, hap.H264Level.LEVEL3_2, hap.H264Level.LEVEL4_0], | ||||
|           }, | ||||
|           resolutions: [ | ||||
|             [1920, 1080, 30], // width, height, framerate | ||||
|             [1280, 960, 30], | ||||
|             [1280, 720, 30], | ||||
|             [1024, 768, 30], | ||||
|             [640, 480, 30], | ||||
|             [640, 360, 30], | ||||
|             [480, 360, 30], | ||||
|             [480, 270, 30], | ||||
|             [320, 240, 30], | ||||
|             [320, 240, 15], // Apple Watch requires this configuration (Apple Watch also seems to required OPUS @16K) | ||||
|             [320, 180, 30], | ||||
|           ], | ||||
|         }, | ||||
|         /* audio option is omitted, as it is not supported in this example; HAP-NodeJS will fake an appropriate audio codec | ||||
|         audio: { | ||||
|             comfort_noise: false, // optional, default false | ||||
|             codecs: [ | ||||
|                 { | ||||
|                     type: AudioStreamingCodecType.OPUS, | ||||
|                     audioChannels: 1, // optional, default 1 | ||||
|                     samplerate: [AudioStreamingSamplerate.KHZ_16, AudioStreamingSamplerate.KHZ_24], // 16 and 24 must be present for AAC-ELD or OPUS | ||||
|                 }, | ||||
|             ], | ||||
|         }, | ||||
|         // */ | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     const cameraController = new hap.CameraController(options); | ||||
|     streamingDelegate.controller = cameraController; | ||||
|  | ||||
|     accessory.configureController(cameraController); | ||||
|  | ||||
|     this.accessories.push(accessory); | ||||
|   } | ||||
|  | ||||
|   // --------------------------- CUSTOM METHODS --------------------------- | ||||
|  | ||||
|   addAccessory(name: string) { | ||||
|     this.log.info("Adding new accessory with name %s", name); | ||||
|  | ||||
|     // uuid must be generated from a unique but not changing data source, name should not be used in the most cases. But works in this specific example. | ||||
|     const uuid = hap.uuid.generate(name); | ||||
|     const accessory = new Accessory(name, uuid); | ||||
|  | ||||
|     this.configureAccessory(accessory); // abusing the configureAccessory here | ||||
|  | ||||
|     this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]); | ||||
|   } | ||||
|  | ||||
|   removeAccessories() { | ||||
|     // we don't have any special identifiers, we just remove all our accessories | ||||
|  | ||||
|     this.log.info("Removing all accessories"); | ||||
|  | ||||
|     this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, this.accessories); | ||||
|     this.accessories.splice(0, this.accessories.length); // clear out the array | ||||
|   } | ||||
|  | ||||
|   createHttpService() { | ||||
|     this.requestServer = http.createServer(this.handleRequest.bind(this)); | ||||
|     this.requestServer.listen(18081, () => this.log.info("Http server listening on 18081...")); | ||||
|   } | ||||
|  | ||||
|   private handleRequest(request: IncomingMessage, response: ServerResponse) { | ||||
|     if (request.url === "/add") { | ||||
|       this.addAccessory(new Date().toISOString()); | ||||
|     } else if (request.url === "/remove") { | ||||
|       this.removeAccessories(); | ||||
|     } | ||||
|  | ||||
|     response.writeHead(204); // 204 No content | ||||
|     response.end(); | ||||
|   } | ||||
|  | ||||
|   // ---------------------------------------------------------------------- | ||||
|  | ||||
| } | ||||
							
								
								
									
										235
									
								
								bridged-camera-example-typescript/src/streamingDelegate.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								bridged-camera-example-typescript/src/streamingDelegate.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| import ip from "ip"; | ||||
| import {ChildProcess, spawn} from "child_process"; | ||||
| import { | ||||
|   CameraController, | ||||
|   CameraStreamingDelegate, HAP, | ||||
|   PrepareStreamCallback, | ||||
|   PrepareStreamRequest, | ||||
|   PrepareStreamResponse, | ||||
|   SnapshotRequest, | ||||
|   SnapshotRequestCallback, | ||||
|   SRTPCryptoSuites, | ||||
|   StreamingRequest, | ||||
|   StreamRequestCallback, | ||||
|   StreamRequestTypes, | ||||
|   StreamSessionIdentifier, | ||||
|   VideoInfo | ||||
| } from "homebridge"; | ||||
|  | ||||
| type SessionInfo = { | ||||
|   address: string, // address of the HAP controller | ||||
|  | ||||
|   videoPort: number, | ||||
|   videoCryptoSuite: SRTPCryptoSuites, // should be saved if multiple suites are supported | ||||
|   videoSRTP: Buffer, // key and salt concatenated | ||||
|   videoSSRC: number, // rtp synchronisation source | ||||
|  | ||||
|   /* Won't be save as audio is not supported by this example | ||||
|   audioPort: number, | ||||
|   audioCryptoSuite: SRTPCryptoSuites, | ||||
|   audioSRTP: Buffer, | ||||
|   audioSSRC: number, | ||||
|    */ | ||||
| } | ||||
|  | ||||
| const FFMPEGH264ProfileNames = [ | ||||
|   "baseline", | ||||
|   "main", | ||||
|   "high" | ||||
| ]; | ||||
| const FFMPEGH264LevelNames = [ | ||||
|   "3.1", | ||||
|   "3.2", | ||||
|   "4.0" | ||||
| ]; | ||||
|  | ||||
| export class ExampleFFMPEGStreamingDelegate implements CameraStreamingDelegate { | ||||
|  | ||||
|   private ffmpegDebugOutput: boolean = false; | ||||
|  | ||||
|   private readonly hap: HAP; | ||||
|   controller?: CameraController; | ||||
|  | ||||
|   // keep track of sessions | ||||
|   pendingSessions: Record<string, SessionInfo> = {}; | ||||
|   ongoingSessions: Record<string, ChildProcess> = {}; | ||||
|  | ||||
|   constructor(hap: HAP) { | ||||
|     this.hap = hap; | ||||
|   } | ||||
|  | ||||
|   handleSnapshotRequest(request: SnapshotRequest, callback: SnapshotRequestCallback): void { | ||||
|     const ffmpegCommand = `-f lavfi -i testsrc=s=${request.width}x${request.height} -vframes 1 -f mjpeg -`; | ||||
|     const ffmpeg = spawn("ffmpeg", ffmpegCommand.split(" "), {env: process.env}); | ||||
|  | ||||
|     const snapshotBuffers: Buffer[] = []; | ||||
|  | ||||
|     ffmpeg.stdout.on('data', data => snapshotBuffers.push(data)); | ||||
|     ffmpeg.stderr.on('data', data => { | ||||
|       if (this.ffmpegDebugOutput) { | ||||
|         console.log("SNAPSHOT: " + String(data)); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     ffmpeg.on('exit', (code, signal) => { | ||||
|       if (signal) { | ||||
|         console.log("Snapshot process was killed with signal: " + signal); | ||||
|         callback(new Error("killed with signal " + signal)); | ||||
|       } else if (code === 0) { | ||||
|         console.log(`Successfully captured snapshot at ${request.width}x${request.height}`); | ||||
|         callback(undefined, Buffer.concat(snapshotBuffers)); | ||||
|       } else { | ||||
|         console.log("Snapshot process exited with code " + code); | ||||
|         callback(new Error("Snapshot process exited with code " + code)); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   // called when iOS request rtp setup | ||||
|   prepareStream(request: PrepareStreamRequest, callback: PrepareStreamCallback): void { | ||||
|     const sessionId: StreamSessionIdentifier = request.sessionID; | ||||
|     const targetAddress = request.targetAddress; | ||||
|  | ||||
|     const video = request.video; | ||||
|     const videoPort = video.port; | ||||
|  | ||||
|     const videoCryptoSuite = video.srtpCryptoSuite; // could be used to support multiple crypto suite (or support no suite for debugging) | ||||
|     const videoSrtpKey = video.srtp_key; | ||||
|     const videoSrtpSalt = video.srtp_salt; | ||||
|  | ||||
|     const videoSSRC = this.hap.CameraController.generateSynchronisationSource(); | ||||
|  | ||||
|     const sessionInfo: SessionInfo = { | ||||
|       address: targetAddress, | ||||
|  | ||||
|       videoPort: videoPort, | ||||
|       videoCryptoSuite: videoCryptoSuite, | ||||
|       videoSRTP: Buffer.concat([videoSrtpKey, videoSrtpSalt]), | ||||
|       videoSSRC: videoSSRC, | ||||
|     }; | ||||
|  | ||||
|     const currentAddress = ip.address("public", request.addressVersion); // ipAddress version must match | ||||
|     const response: PrepareStreamResponse = { | ||||
|       address: currentAddress, | ||||
|       video: { | ||||
|         port: videoPort, | ||||
|         ssrc: videoSSRC, | ||||
|  | ||||
|         srtp_key: videoSrtpKey, | ||||
|         srtp_salt: videoSrtpSalt, | ||||
|       }, | ||||
|       // audio is omitted as we do not support audio in this example | ||||
|     }; | ||||
|  | ||||
|     this.pendingSessions[sessionId] = sessionInfo; | ||||
|     callback(undefined, response); | ||||
|   } | ||||
|  | ||||
|   // called when iOS device asks stream to start/stop/reconfigure | ||||
|   handleStreamRequest(request: StreamingRequest, callback: StreamRequestCallback): void { | ||||
|     const sessionId = request.sessionID; | ||||
|  | ||||
|     switch (request.type) { | ||||
|       case this.hap.StreamRequestTypes.START: | ||||
|         const sessionInfo = this.pendingSessions[sessionId]; | ||||
|  | ||||
|         const video: VideoInfo = request.video; | ||||
|  | ||||
|         const profile = FFMPEGH264ProfileNames[video.profile]; | ||||
|         const level = FFMPEGH264LevelNames[video.level]; | ||||
|         const width = video.width; | ||||
|         const height = video.height; | ||||
|         const fps = video.fps; | ||||
|  | ||||
|         const payloadType = video.pt; | ||||
|         const maxBitrate = video.max_bit_rate; | ||||
|         const rtcpInterval = video.rtcp_interval; // usually 0.5 | ||||
|         const mtu = video.mtu; // maximum transmission unit | ||||
|  | ||||
|         const address = sessionInfo.address; | ||||
|         const videoPort = sessionInfo.videoPort; | ||||
|         const ssrc = sessionInfo.videoSSRC; | ||||
|         const cryptoSuite = sessionInfo.videoCryptoSuite; | ||||
|         const videoSRTP = sessionInfo.videoSRTP.toString("base64"); | ||||
|  | ||||
|         console.log(`Starting video stream (${width}x${height}, ${fps} fps, ${maxBitrate} kbps, ${mtu} mtu)...`); | ||||
|  | ||||
|         let videoffmpegCommand = `-f lavfi -i testsrc=size=${width}x${height}:rate=${fps} -map 0:0 ` + | ||||
|           `-c:v libx264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k -bufsize ${2*maxBitrate}k -maxrate ${maxBitrate}k ` + | ||||
|           `-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `; // -profile:v ${profile} -level:v ${level} | ||||
|  | ||||
|         if (cryptoSuite !== this.hap.SRTPCryptoSuites.NONE) { // actually ffmpeg just supports AES_CM_128_HMAC_SHA1_80 | ||||
|           videoffmpegCommand += `-srtp_out_suite ${this.hap.SRTPCryptoSuites[cryptoSuite]} -srtp_out_params ${videoSRTP} s`; | ||||
|         } | ||||
|  | ||||
|         videoffmpegCommand += `rtp://${address}:${videoPort}?rtcpport=${videoPort}&localrtcpport=${videoPort}&pkt_size=${mtu}`; | ||||
|  | ||||
|         if (this.ffmpegDebugOutput) { | ||||
|           console.log("FFMPEG command: ffmpeg " + videoffmpegCommand); | ||||
|         } | ||||
|  | ||||
|         const ffmpegVideo = spawn('ffmpeg', videoffmpegCommand.split(' '), {env: process.env}); | ||||
|  | ||||
|         let started = false; | ||||
|         ffmpegVideo.stderr.on('data', data => { | ||||
|           if (!started) { | ||||
|             started = true; | ||||
|             console.log("FFMPEG: received first frame"); | ||||
|  | ||||
|             callback(); // do not forget to execute callback once set up | ||||
|           } | ||||
|  | ||||
|           if (this.ffmpegDebugOutput) { | ||||
|             console.log("VIDEO: " + String(data)); | ||||
|           } | ||||
|         }); | ||||
|         ffmpegVideo.on('error', error => { | ||||
|           console.log("[Video] Failed to start video stream: " + error.message); | ||||
|           callback(new Error("ffmpeg process creation failed!")); | ||||
|         }); | ||||
|         ffmpegVideo.on('exit', (code, signal) => { | ||||
|           const message = "[Video] ffmpeg exited with code: " + code + " and signal: " + signal; | ||||
|  | ||||
|           if (code == null || code === 255) { | ||||
|             console.log(message + " (Video stream stopped!)"); | ||||
|           } else { | ||||
|             console.log(message + " (error)"); | ||||
|  | ||||
|             if (!started) { | ||||
|               callback(new Error(message)); | ||||
|             } else { | ||||
|               this.controller!.forceStopStreamingSession(sessionId); | ||||
|             } | ||||
|           } | ||||
|         }); | ||||
|  | ||||
|         this.ongoingSessions[sessionId] = ffmpegVideo; | ||||
|         delete this.pendingSessions[sessionId]; | ||||
|  | ||||
|         break; | ||||
|       case this.hap.StreamRequestTypes.RECONFIGURE: | ||||
|         // not supported by this example | ||||
|         console.log("Received (unsupported) request to reconfigure to: " + JSON.stringify(request.video)); | ||||
|         callback(); | ||||
|         break; | ||||
|       case this.hap.StreamRequestTypes.STOP: | ||||
|         const ffmpegProcess = this.ongoingSessions[sessionId]; | ||||
|  | ||||
|         try { | ||||
|           if (ffmpegProcess) { | ||||
|             ffmpegProcess.kill('SIGKILL'); | ||||
|           } | ||||
|         } catch (e) { | ||||
|           console.log("Error occurred terminating the video process!"); | ||||
|           console.log(e); | ||||
|         } | ||||
|  | ||||
|         delete this.ongoingSessions[sessionId]; | ||||
|  | ||||
|         console.log("Stopped streaming session!"); | ||||
|         callback(); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								bridged-camera-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								bridged-camera-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ES2018", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "ES2015", | ||||
|       "ES2016", | ||||
|       "ES2017", | ||||
|       "ES2018" | ||||
|     ], | ||||
|     "sourceMap": true, | ||||
|     "rootDir": "src", | ||||
|     "outDir": "dist", | ||||
|  | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true | ||||
|   }, | ||||
|   "include": [ | ||||
|     "src" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										205
									
								
								dynamic-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								dynamic-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # Created by .ignore support plugin (hsz.mobi) | ||||
| ### HAP-NodeJS files | ||||
| persist | ||||
|  | ||||
| ### Node template | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| # Diagnostic reports (https://nodejs.org/api/report.html) | ||||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | ||||
|  | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
|  | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
|  | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| *.lcov | ||||
|  | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
|  | ||||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
|  | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
|  | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
|  | ||||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
|  | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| jspm_packages/ | ||||
|  | ||||
| # Snowpack dependency directory (https://snowpack.dev/) | ||||
| web_modules/ | ||||
|  | ||||
| # TypeScript cache | ||||
| *.tsbuildinfo | ||||
|  | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
|  | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
|  | ||||
| # Microbundle cache | ||||
| .rpt2_cache/ | ||||
| .rts2_cache_cjs/ | ||||
| .rts2_cache_es/ | ||||
| .rts2_cache_umd/ | ||||
|  | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
|  | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
|  | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
|  | ||||
| # dotenv environment variables file | ||||
| .env | ||||
| .env.test | ||||
|  | ||||
| # parcel-bundler cache (https://parceljs.org/) | ||||
| .cache | ||||
| .parcel-cache | ||||
|  | ||||
| # Next.js build output | ||||
| .next | ||||
|  | ||||
| # Nuxt.js build / generate output | ||||
| .nuxt | ||||
| dist | ||||
|  | ||||
| # Gatsby files | ||||
| .cache/ | ||||
| # Comment in the public line in if your project uses Gatsby and not Next.js | ||||
| # https://nextjs.org/blog/next-9-1#public-directory-support | ||||
| # public | ||||
|  | ||||
| # vuepress build output | ||||
| .vuepress/dist | ||||
|  | ||||
| # Serverless directories | ||||
| .serverless/ | ||||
|  | ||||
| # FuseBox cache | ||||
| .fusebox/ | ||||
|  | ||||
| # DynamoDB Local files | ||||
| .dynamodb/ | ||||
|  | ||||
| # TernJS port file | ||||
| .tern-port | ||||
|  | ||||
| # Stores VSCode versions used for testing VSCode extensions | ||||
| .vscode-test | ||||
|  | ||||
| # yarn v2 | ||||
|  | ||||
| .yarn/cache | ||||
| .yarn/unplugged | ||||
| .yarn/build-state.yml | ||||
| .pnp.* | ||||
|  | ||||
| ### VisualStudioCode template | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| ### JetBrains template | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
|  | ||||
| # User-specific stuff | ||||
| .idea/**/workspace.xml | ||||
| .idea/**/tasks.xml | ||||
| .idea/**/usage.statistics.xml | ||||
| .idea/**/dictionaries | ||||
| .idea/**/shelf | ||||
|  | ||||
| # Generated files | ||||
| .idea/**/contentModel.xml | ||||
|  | ||||
| # Sensitive or high-churn files | ||||
| .idea/**/dataSources/ | ||||
| .idea/**/dataSources.ids | ||||
| .idea/**/dataSources.local.xml | ||||
| .idea/**/sqlDataSources.xml | ||||
| .idea/**/dynamic.xml | ||||
| .idea/**/uiDesigner.xml | ||||
| .idea/**/dbnavigator.xml | ||||
|  | ||||
| # Gradle | ||||
| .idea/**/gradle.xml | ||||
| .idea/**/libraries | ||||
|  | ||||
| # Gradle and Maven with auto-import | ||||
| # When using Gradle or Maven with auto-import, you should exclude module files, | ||||
| # since they will be recreated, and may cause churn.  Uncomment if using | ||||
| # auto-import. | ||||
| # .idea/artifacts | ||||
| # .idea/compiler.xml | ||||
| # .idea/jarRepositories.xml | ||||
| # .idea/modules.xml | ||||
| # .idea/*.iml | ||||
| # .idea/modules | ||||
| # *.iml | ||||
| # *.ipr | ||||
|  | ||||
| # CMake | ||||
| cmake-build-*/ | ||||
|  | ||||
| # Mongo Explorer plugin | ||||
| .idea/**/mongoSettings.xml | ||||
|  | ||||
| # File-based project format | ||||
| *.iws | ||||
|  | ||||
| # IntelliJ | ||||
| out/ | ||||
|  | ||||
| # mpeltonen/sbt-idea plugin | ||||
| .idea_modules/ | ||||
|  | ||||
| # JIRA plugin | ||||
| atlassian-ide-plugin.xml | ||||
|  | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
|  | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| crashlytics-build.properties | ||||
| fabric.properties | ||||
|  | ||||
| # Editor-based Rest Client | ||||
| .idea/httpRequests | ||||
|  | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
|  | ||||
							
								
								
									
										14
									
								
								dynamic-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								dynamic-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ISC License (ISC) | ||||
| Copyright (c) 2020 Andreas Bauer | ||||
|  | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||||
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||||
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||||
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||||
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||
| PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										588
									
								
								dynamic-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								dynamic-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | ||||
| { | ||||
|   "name": "homebridge-dynamic-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/color-name": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | ||||
|       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "10.17.19", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", | ||||
|       "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||
|       "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/color-name": "^1.1.1", | ||||
|         "color-convert": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", | ||||
|       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "bonjour-hap": { | ||||
|       "version": "3.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", | ||||
|       "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "array-flatten": "^2.1.0", | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "dns-equal": "^1.0.0", | ||||
|         "dns-txt": "^2.0.2", | ||||
|         "multicast-dns": "^7.2.0", | ||||
|         "multicast-dns-service-types": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "buffer-from": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "buffer-indexof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", | ||||
|       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||
|       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^4.1.0", | ||||
|         "supports-color": "^7.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
|       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "~1.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||
|       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", | ||||
|       "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ms": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "decimal.js": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", | ||||
|       "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", | ||||
|       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-arguments": "^1.0.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-regex": "^1.0.4", | ||||
|         "object-is": "^1.0.1", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "regexp.prototype.flags": "^1.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "dns-equal": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", | ||||
|       "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "dns-packet": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", | ||||
|       "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ip": "^1.1.5", | ||||
|         "safe-buffer": "^5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "dns-txt": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", | ||||
|       "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-indexof": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.17.5", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", | ||||
|       "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.2.1", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has": "^1.0.3", | ||||
|         "has-symbols": "^1.0.1", | ||||
|         "is-callable": "^1.1.5", | ||||
|         "is-regex": "^1.0.5", | ||||
|         "object-inspect": "^1.7.0", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "object.assign": "^4.1.0", | ||||
|         "string.prototype.trimleft": "^2.1.1", | ||||
|         "string.prototype.trimright": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", | ||||
|       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-srp-hap": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", | ||||
|       "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | ||||
|       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "glob": { | ||||
|       "version": "7.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | ||||
|       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fs.realpath": "^1.0.0", | ||||
|         "inflight": "^1.0.4", | ||||
|         "inherits": "2", | ||||
|         "minimatch": "^3.0.4", | ||||
|         "once": "^1.3.0", | ||||
|         "path-is-absolute": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "hap-nodejs": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.6.2.tgz", | ||||
|       "integrity": "sha512-/LlRaYCtcwC4jBUKRJeBUdUfKEp8w/NK3PNYXaAOngQL9uVnqsvQ0Gce/mUhSXPhsxfdnxbHVT870W9OEnV6+A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "bonjour-hap": "3.5.4", | ||||
|         "debug": "^4.1.1", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "fast-srp-hap": "2.0.1", | ||||
|         "ip": "^1.1.3", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "tweetnacl": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", | ||||
|       "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "homebridge": { | ||||
|       "version": "0.4.54-beta.51", | ||||
|       "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.54-beta.51.tgz", | ||||
|       "integrity": "sha512-WycAihWBzWu+8ZBnVrU4wqdU0bq/cT43iKdk2+6ODhbGh/xlaxIFpMdSGX++YqwGpu7cNEL0L45Woj9sEfFYNw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "chalk": "^3.0.0", | ||||
|         "commander": "5.0.0", | ||||
|         "hap-nodejs": "0.6.2", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "qrcode-terminal": "^0.12.0", | ||||
|         "semver": "^7.1.3", | ||||
|         "source-map-support": "^0.5.16" | ||||
|       } | ||||
|     }, | ||||
|     "inflight": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||
|       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "once": "^1.3.0", | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", | ||||
|       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-arguments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", | ||||
|       "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", | ||||
|       "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", | ||||
|       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", | ||||
|       "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "minimist": { | ||||
|       "version": "1.2.5", | ||||
|       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | ||||
|       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "mkdirp": { | ||||
|       "version": "0.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | ||||
|       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "minimist": "^1.2.5" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "multicast-dns": { | ||||
|       "version": "7.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", | ||||
|       "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "dns-packet": "^4.0.0", | ||||
|         "thunky": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "multicast-dns-service-types": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", | ||||
|       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node-persist": { | ||||
|       "version": "0.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", | ||||
|       "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mkdirp": "~0.5.1", | ||||
|         "q": "~1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "object-inspect": { | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", | ||||
|       "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object-is": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", | ||||
|       "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "object-keys": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", | ||||
|       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object.assign": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", | ||||
|       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.2", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has-symbols": "^1.0.0", | ||||
|         "object-keys": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "once": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||||
|       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
|       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "q": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", | ||||
|       "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "qrcode-terminal": { | ||||
|       "version": "0.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", | ||||
|       "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "regexp.prototype.flags": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", | ||||
|       "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.0-next.1" | ||||
|       } | ||||
|     }, | ||||
|     "rimraf": { | ||||
|       "version": "3.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", | ||||
|       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob": "^7.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", | ||||
|       "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "7.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", | ||||
|       "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.16", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", | ||||
|       "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimend": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", | ||||
|       "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimleft": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", | ||||
|       "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimstart": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimright": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", | ||||
|       "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimend": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimstart": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", | ||||
|       "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||
|       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "thunky": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", | ||||
|       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "tweetnacl": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", | ||||
|       "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "3.8.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", | ||||
|       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "wrappy": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||||
|       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										35
									
								
								dynamic-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								dynamic-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| { | ||||
|   "name": "homebridge-dynamic-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "An example dynamic platform plugin for homebridge written in Typescript", | ||||
|   "main": "dist/dynamic-platform.js", | ||||
|   "scripts": { | ||||
|     "clean": "rimraf ./dist", | ||||
|     "build": "rimraf ./dist && tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postpublish": "npm run clean", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Andreas Bauer <mail@anderl-bauer.de>", | ||||
|   "engines": { | ||||
|     "homebridge": ">=1.0.0" | ||||
|   }, | ||||
|   "license": "ISC", | ||||
|   "files": [ | ||||
|     "LICENSE", | ||||
|     "dist" | ||||
|   ], | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/homebridge/homebridge-examples.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "http://github.com/homebridge/homebridge-examples/issues" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "10.17.19", | ||||
|     "typescript": "^3.8.3", | ||||
|     "rimraf": "^3.0.2", | ||||
|     "homebridge": "^0.4.54-beta.51" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										126
									
								
								dynamic-platform-example-typescript/src/dynamic-platform.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								dynamic-platform-example-typescript/src/dynamic-platform.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| import http, {IncomingMessage, Server, ServerResponse} from "http"; | ||||
| import { | ||||
|   API, | ||||
|   APIEvent, | ||||
|   CharacteristicSetCallback, | ||||
|   CharacteristicValue, | ||||
|   DynamicPlatformPlugin, | ||||
|   HAP, | ||||
|   Logging, | ||||
|   PlatformAccessory, | ||||
|   PlatformAccessoryEvent, | ||||
|   PlatformConfig, | ||||
|   Service, | ||||
| } from "homebridge"; | ||||
|  | ||||
| const PLUGIN_NAME = "homebridge-dynamic-platform-example"; | ||||
| const PLATFORM_NAME = "ExampleDynamicPlatform"; | ||||
|  | ||||
| /** | ||||
|  * TODO explain | ||||
|  */ | ||||
| let hap: HAP; | ||||
| let Accessory: typeof PlatformAccessory; | ||||
|  | ||||
| export = (api: API) => { | ||||
|   hap = api.hap; | ||||
|   Accessory = api.platformAccessory; | ||||
|  | ||||
|   api.registerPlatform(PLATFORM_NAME, ExampleDynamicPlatform); | ||||
| }; | ||||
|  | ||||
| class ExampleDynamicPlatform implements DynamicPlatformPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|   private readonly api: API; | ||||
|  | ||||
|   private requestServer?: Server; | ||||
|  | ||||
|   private readonly accessories: PlatformAccessory[] = []; | ||||
|  | ||||
|   constructor(log: Logging, config: PlatformConfig, api: API) { | ||||
|     this.log = log; | ||||
|     this.api = api; | ||||
|  | ||||
|     // probably parse config or something here | ||||
|  | ||||
|     log.info("Example platform finished initializing!"); | ||||
|  | ||||
|     /* | ||||
|      * When this event is fired, homebridge restored all cached accessories from disk and did call their respective | ||||
|      * `configureAccessory` method for all of them. Dynamic Platform plugins should only register new accessories | ||||
|      * after this event was fired, in order to ensure they weren't added to homebridge already. | ||||
|      * This event can also be used to start discovery of new accessories. | ||||
|      */ | ||||
|     api.on(APIEvent.DID_FINISH_LAUNCHING, () => { | ||||
|       log.info("Example platform 'didFinishLaunching'"); | ||||
|  | ||||
|       // The idea of this plugin is that we open a http service which exposes api calls to add or remove accessories | ||||
|       this.createHttpService(); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This function is invoked when homebridge restores cached accessories from disk at startup. | ||||
|    * It should be used to setup event handlers for characteristics and update respective values. | ||||
|    */ | ||||
|   configureAccessory(accessory: PlatformAccessory): void { | ||||
|     this.log("Configuring accessory %s", accessory.displayName); | ||||
|  | ||||
|     accessory.on(PlatformAccessoryEvent.IDENTIFY, () => { | ||||
|       this.log("%s identified!", accessory.displayName); | ||||
|     }); | ||||
|  | ||||
|     accessory.getService(hap.Service.Lightbulb)!.getCharacteristic(hap.Characteristic.On) | ||||
|       .on(hap.CharacteristicEventTypes.SET, (value: CharacteristicValue, callback: CharacteristicSetCallback) => { | ||||
|         this.log.info("%s Light was set to: " + value); | ||||
|         callback(); | ||||
|       }); | ||||
|  | ||||
|     this.accessories.push(accessory); | ||||
|   } | ||||
|  | ||||
|   // --------------------------- CUSTOM METHODS --------------------------- | ||||
|  | ||||
|   addAccessory(name: string) { | ||||
|     this.log.info("Adding new accessory with name %s", name); | ||||
|  | ||||
|     // uuid must be generated from a unique but not changing data source, name should not be used in the most cases. But works in this specific example. | ||||
|     const uuid = hap.uuid.generate(name); | ||||
|     const accessory = new Accessory(name, uuid); | ||||
|  | ||||
|     accessory.addService(hap.Service.Lightbulb, "Test Light"); | ||||
|  | ||||
|     this.configureAccessory(accessory); // abusing the configureAccessory here | ||||
|  | ||||
|     this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]); | ||||
|   } | ||||
|  | ||||
|   removeAccessories() { | ||||
|     // we don't have any special identifiers, we just remove all our accessories | ||||
|  | ||||
|     this.log.info("Removing all accessories"); | ||||
|  | ||||
|     this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, this.accessories); | ||||
|     this.accessories.splice(0, this.accessories.length); // clear out the array | ||||
|   } | ||||
|  | ||||
|   createHttpService() { | ||||
|     this.requestServer = http.createServer(this.handleRequest.bind(this)); | ||||
|     this.requestServer.listen(18081, () => this.log.info("Http server listening on 18081...")); | ||||
|   } | ||||
|  | ||||
|   private handleRequest(request: IncomingMessage, response: ServerResponse) { | ||||
|     if (request.url === "/add") { | ||||
|       this.addAccessory(new Date().toISOString()); | ||||
|     } else if (request.url === "/remove") { | ||||
|       this.removeAccessories(); | ||||
|     } | ||||
|  | ||||
|     response.writeHead(204); // 204 No content | ||||
|     response.end(); | ||||
|   } | ||||
|  | ||||
|   // ---------------------------------------------------------------------- | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								dynamic-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								dynamic-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ES2018", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "ES2015", | ||||
|       "ES2016", | ||||
|       "ES2017", | ||||
|       "ES2018" | ||||
|     ], | ||||
|     "sourceMap": true, | ||||
|     "rootDir": "src", | ||||
|     "outDir": "dist", | ||||
|  | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true | ||||
|   }, | ||||
|   "include": [ | ||||
|     "src" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										205
									
								
								independent-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								independent-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # Created by .ignore support plugin (hsz.mobi) | ||||
| ### HAP-NodeJS files | ||||
| persist | ||||
|  | ||||
| ### Node template | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| # Diagnostic reports (https://nodejs.org/api/report.html) | ||||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | ||||
|  | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
|  | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
|  | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| *.lcov | ||||
|  | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
|  | ||||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
|  | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
|  | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
|  | ||||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
|  | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| jspm_packages/ | ||||
|  | ||||
| # Snowpack dependency directory (https://snowpack.dev/) | ||||
| web_modules/ | ||||
|  | ||||
| # TypeScript cache | ||||
| *.tsbuildinfo | ||||
|  | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
|  | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
|  | ||||
| # Microbundle cache | ||||
| .rpt2_cache/ | ||||
| .rts2_cache_cjs/ | ||||
| .rts2_cache_es/ | ||||
| .rts2_cache_umd/ | ||||
|  | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
|  | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
|  | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
|  | ||||
| # dotenv environment variables file | ||||
| .env | ||||
| .env.test | ||||
|  | ||||
| # parcel-bundler cache (https://parceljs.org/) | ||||
| .cache | ||||
| .parcel-cache | ||||
|  | ||||
| # Next.js build output | ||||
| .next | ||||
|  | ||||
| # Nuxt.js build / generate output | ||||
| .nuxt | ||||
| dist | ||||
|  | ||||
| # Gatsby files | ||||
| .cache/ | ||||
| # Comment in the public line in if your project uses Gatsby and not Next.js | ||||
| # https://nextjs.org/blog/next-9-1#public-directory-support | ||||
| # public | ||||
|  | ||||
| # vuepress build output | ||||
| .vuepress/dist | ||||
|  | ||||
| # Serverless directories | ||||
| .serverless/ | ||||
|  | ||||
| # FuseBox cache | ||||
| .fusebox/ | ||||
|  | ||||
| # DynamoDB Local files | ||||
| .dynamodb/ | ||||
|  | ||||
| # TernJS port file | ||||
| .tern-port | ||||
|  | ||||
| # Stores VSCode versions used for testing VSCode extensions | ||||
| .vscode-test | ||||
|  | ||||
| # yarn v2 | ||||
|  | ||||
| .yarn/cache | ||||
| .yarn/unplugged | ||||
| .yarn/build-state.yml | ||||
| .pnp.* | ||||
|  | ||||
| ### VisualStudioCode template | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| ### JetBrains template | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
|  | ||||
| # User-specific stuff | ||||
| .idea/**/workspace.xml | ||||
| .idea/**/tasks.xml | ||||
| .idea/**/usage.statistics.xml | ||||
| .idea/**/dictionaries | ||||
| .idea/**/shelf | ||||
|  | ||||
| # Generated files | ||||
| .idea/**/contentModel.xml | ||||
|  | ||||
| # Sensitive or high-churn files | ||||
| .idea/**/dataSources/ | ||||
| .idea/**/dataSources.ids | ||||
| .idea/**/dataSources.local.xml | ||||
| .idea/**/sqlDataSources.xml | ||||
| .idea/**/dynamic.xml | ||||
| .idea/**/uiDesigner.xml | ||||
| .idea/**/dbnavigator.xml | ||||
|  | ||||
| # Gradle | ||||
| .idea/**/gradle.xml | ||||
| .idea/**/libraries | ||||
|  | ||||
| # Gradle and Maven with auto-import | ||||
| # When using Gradle or Maven with auto-import, you should exclude module files, | ||||
| # since they will be recreated, and may cause churn.  Uncomment if using | ||||
| # auto-import. | ||||
| # .idea/artifacts | ||||
| # .idea/compiler.xml | ||||
| # .idea/jarRepositories.xml | ||||
| # .idea/modules.xml | ||||
| # .idea/*.iml | ||||
| # .idea/modules | ||||
| # *.iml | ||||
| # *.ipr | ||||
|  | ||||
| # CMake | ||||
| cmake-build-*/ | ||||
|  | ||||
| # Mongo Explorer plugin | ||||
| .idea/**/mongoSettings.xml | ||||
|  | ||||
| # File-based project format | ||||
| *.iws | ||||
|  | ||||
| # IntelliJ | ||||
| out/ | ||||
|  | ||||
| # mpeltonen/sbt-idea plugin | ||||
| .idea_modules/ | ||||
|  | ||||
| # JIRA plugin | ||||
| atlassian-ide-plugin.xml | ||||
|  | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
|  | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| crashlytics-build.properties | ||||
| fabric.properties | ||||
|  | ||||
| # Editor-based Rest Client | ||||
| .idea/httpRequests | ||||
|  | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
|  | ||||
							
								
								
									
										14
									
								
								independent-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								independent-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ISC License (ISC) | ||||
| Copyright (c) 2020 Andreas Bauer | ||||
|  | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||||
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||||
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||||
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||||
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||
| PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										588
									
								
								independent-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								independent-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | ||||
| { | ||||
|   "name": "homebridge-independent-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/color-name": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | ||||
|       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "10.17.19", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", | ||||
|       "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||
|       "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/color-name": "^1.1.1", | ||||
|         "color-convert": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", | ||||
|       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "bonjour-hap": { | ||||
|       "version": "3.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", | ||||
|       "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "array-flatten": "^2.1.0", | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "dns-equal": "^1.0.0", | ||||
|         "dns-txt": "^2.0.2", | ||||
|         "multicast-dns": "^7.2.0", | ||||
|         "multicast-dns-service-types": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "buffer-from": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "buffer-indexof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", | ||||
|       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||
|       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^4.1.0", | ||||
|         "supports-color": "^7.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
|       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "~1.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||
|       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", | ||||
|       "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ms": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "decimal.js": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", | ||||
|       "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", | ||||
|       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-arguments": "^1.0.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-regex": "^1.0.4", | ||||
|         "object-is": "^1.0.1", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "regexp.prototype.flags": "^1.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "dns-equal": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", | ||||
|       "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "dns-packet": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", | ||||
|       "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ip": "^1.1.5", | ||||
|         "safe-buffer": "^5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "dns-txt": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", | ||||
|       "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-indexof": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.17.5", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", | ||||
|       "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.2.1", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has": "^1.0.3", | ||||
|         "has-symbols": "^1.0.1", | ||||
|         "is-callable": "^1.1.5", | ||||
|         "is-regex": "^1.0.5", | ||||
|         "object-inspect": "^1.7.0", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "object.assign": "^4.1.0", | ||||
|         "string.prototype.trimleft": "^2.1.1", | ||||
|         "string.prototype.trimright": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", | ||||
|       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-srp-hap": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", | ||||
|       "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | ||||
|       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "glob": { | ||||
|       "version": "7.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | ||||
|       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fs.realpath": "^1.0.0", | ||||
|         "inflight": "^1.0.4", | ||||
|         "inherits": "2", | ||||
|         "minimatch": "^3.0.4", | ||||
|         "once": "^1.3.0", | ||||
|         "path-is-absolute": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "hap-nodejs": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.6.2.tgz", | ||||
|       "integrity": "sha512-/LlRaYCtcwC4jBUKRJeBUdUfKEp8w/NK3PNYXaAOngQL9uVnqsvQ0Gce/mUhSXPhsxfdnxbHVT870W9OEnV6+A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "bonjour-hap": "3.5.4", | ||||
|         "debug": "^4.1.1", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "fast-srp-hap": "2.0.1", | ||||
|         "ip": "^1.1.3", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "tweetnacl": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", | ||||
|       "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "homebridge": { | ||||
|       "version": "0.4.54-beta.51", | ||||
|       "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.54-beta.51.tgz", | ||||
|       "integrity": "sha512-WycAihWBzWu+8ZBnVrU4wqdU0bq/cT43iKdk2+6ODhbGh/xlaxIFpMdSGX++YqwGpu7cNEL0L45Woj9sEfFYNw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "chalk": "^3.0.0", | ||||
|         "commander": "5.0.0", | ||||
|         "hap-nodejs": "0.6.2", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "qrcode-terminal": "^0.12.0", | ||||
|         "semver": "^7.1.3", | ||||
|         "source-map-support": "^0.5.16" | ||||
|       } | ||||
|     }, | ||||
|     "inflight": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||
|       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "once": "^1.3.0", | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", | ||||
|       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-arguments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", | ||||
|       "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", | ||||
|       "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", | ||||
|       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", | ||||
|       "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "minimist": { | ||||
|       "version": "1.2.5", | ||||
|       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | ||||
|       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "mkdirp": { | ||||
|       "version": "0.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | ||||
|       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "minimist": "^1.2.5" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "multicast-dns": { | ||||
|       "version": "7.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", | ||||
|       "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "dns-packet": "^4.0.0", | ||||
|         "thunky": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "multicast-dns-service-types": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", | ||||
|       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node-persist": { | ||||
|       "version": "0.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", | ||||
|       "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mkdirp": "~0.5.1", | ||||
|         "q": "~1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "object-inspect": { | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", | ||||
|       "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object-is": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", | ||||
|       "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "object-keys": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", | ||||
|       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object.assign": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", | ||||
|       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.2", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has-symbols": "^1.0.0", | ||||
|         "object-keys": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "once": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||||
|       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
|       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "q": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", | ||||
|       "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "qrcode-terminal": { | ||||
|       "version": "0.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", | ||||
|       "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "regexp.prototype.flags": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", | ||||
|       "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.0-next.1" | ||||
|       } | ||||
|     }, | ||||
|     "rimraf": { | ||||
|       "version": "3.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", | ||||
|       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob": "^7.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", | ||||
|       "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "7.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", | ||||
|       "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.16", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", | ||||
|       "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimend": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", | ||||
|       "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimleft": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", | ||||
|       "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimstart": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimright": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", | ||||
|       "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimend": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimstart": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", | ||||
|       "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||
|       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "thunky": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", | ||||
|       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "tweetnacl": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", | ||||
|       "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "3.8.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", | ||||
|       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "wrappy": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||||
|       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								independent-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								independent-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| { | ||||
|   "name": "homebridge-independent-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "An example independent platform plugin for homebridge written in Typescript", | ||||
|   "main": "dist/dynamic-platform.js", | ||||
|   "scripts": { | ||||
|     "clean": "rimraf ./dist", | ||||
|     "build": "rimraf ./dist && tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postpublish": "npm run clean", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Andreas Bauer <mail@anderl-bauer.de>", | ||||
|   "engines": { | ||||
|     "homebridge": ">=1.0.0" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "homebridge-plugin" | ||||
|   ], | ||||
|   "license": "ISC", | ||||
|   "files": [ | ||||
|     "LICENSE", | ||||
|     "dist" | ||||
|   ], | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/homebridge/homebridge-examples.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "http://github.com/homebridge/homebridge-examples/issues" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "10.17.19", | ||||
|     "typescript": "^3.8.3", | ||||
|     "rimraf": "^3.0.2", | ||||
|     "homebridge": "^0.4.54-beta.51" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,73 @@ | ||||
| import { | ||||
|   API, | ||||
|   CharacteristicGetCallback, | ||||
|   CharacteristicSetCallback, | ||||
|   CharacteristicValue, | ||||
|   HAP, | ||||
|   IndependentPlatformPlugin, | ||||
|   Logging, | ||||
|   PlatformAccessory, | ||||
|   PlatformConfig, | ||||
| } from "homebridge"; | ||||
|  | ||||
| const PLUGIN_NAME = "homebridge-independent-platform-example"; | ||||
| const PLATFORM_NAME = "ExampleIndependentPlatform"; | ||||
|  | ||||
| /** | ||||
|  * TODO explain | ||||
|  */ | ||||
| let hap: HAP; | ||||
| let Accessory: typeof PlatformAccessory; | ||||
|  | ||||
| export = (api: API) => { | ||||
|   hap = api.hap; | ||||
|   Accessory = api.platformAccessory; | ||||
|  | ||||
|   api.registerPlatform(PLATFORM_NAME, ExampleIndependentPlatform); | ||||
| }; | ||||
|  | ||||
| class ExampleIndependentPlatform implements IndependentPlatformPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|   private readonly api: API; | ||||
|  | ||||
|   constructor(log: Logging, config: PlatformConfig, api: API) { | ||||
|     this.log = log; | ||||
|     this.api = api; | ||||
|  | ||||
|     // probably parse config or something here | ||||
|  | ||||
|     this.publishExampleExternalAccessory("MySwitch 1"); | ||||
|  | ||||
|     log.info("Example platform finished initializing!"); | ||||
|   } | ||||
|  | ||||
|   publishExampleExternalAccessory(name: string) { | ||||
|     let switchOn = false; | ||||
|  | ||||
|     const uuid = hap.uuid.generate("homebridge:examples:external-switch:" + name); | ||||
|     const accessory = new Accessory("External Switch", uuid); | ||||
|  | ||||
|     const switchService = new hap.Service.Switch(name); | ||||
|     switchService.getCharacteristic(hap.Characteristic.On) | ||||
|       .on(hap.CharacteristicEventTypes.GET, (callback: CharacteristicGetCallback) => { | ||||
|         this.log.info("Current state of the switch was returned: " + (switchOn? "ON": "OFF")); | ||||
|         callback(undefined, switchOn); | ||||
|       }) | ||||
|       .on(hap.CharacteristicEventTypes.SET, (value: CharacteristicValue, callback: CharacteristicSetCallback) => { | ||||
|         switchOn = value as boolean; | ||||
|         this.log.info("Switch state was set to: " + (switchOn? "ON": "OFF")); | ||||
|         callback(); | ||||
|       }); | ||||
|  | ||||
|     accessory.getService(hap.Service.AccessoryInformation)! | ||||
|       .setCharacteristic(hap.Characteristic.Manufacturer, "Custom Manufacturer") | ||||
|       .setCharacteristic(hap.Characteristic.Model, "External Switch"); | ||||
|  | ||||
|     accessory.addService(switchService); | ||||
|  | ||||
|     // will be exposed as an additional accessory and must be paired separately with the pincode of homebridge | ||||
|     this.api.publishExternalAccessories(PLUGIN_NAME, [accessory]); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								independent-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								independent-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ES2018", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "ES2015", | ||||
|       "ES2016", | ||||
|       "ES2017", | ||||
|       "ES2018" | ||||
|     ], | ||||
|     "sourceMap": true, | ||||
|     "rootDir": "src", | ||||
|     "outDir": "dist", | ||||
|  | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true | ||||
|   }, | ||||
|   "include": [ | ||||
|     "src" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										205
									
								
								static-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								static-platform-example-typescript/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # Created by .ignore support plugin (hsz.mobi) | ||||
| ### HAP-NodeJS files | ||||
| persist | ||||
|  | ||||
| ### Node template | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| # Diagnostic reports (https://nodejs.org/api/report.html) | ||||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | ||||
|  | ||||
| # Runtime data | ||||
| pids | ||||
| *.pid | ||||
| *.seed | ||||
| *.pid.lock | ||||
|  | ||||
| # Directory for instrumented libs generated by jscoverage/JSCover | ||||
| lib-cov | ||||
|  | ||||
| # Coverage directory used by tools like istanbul | ||||
| coverage | ||||
| *.lcov | ||||
|  | ||||
| # nyc test coverage | ||||
| .nyc_output | ||||
|  | ||||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | ||||
| .grunt | ||||
|  | ||||
| # Bower dependency directory (https://bower.io/) | ||||
| bower_components | ||||
|  | ||||
| # node-waf configuration | ||||
| .lock-wscript | ||||
|  | ||||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | ||||
| build/Release | ||||
|  | ||||
| # Dependency directories | ||||
| node_modules/ | ||||
| jspm_packages/ | ||||
|  | ||||
| # Snowpack dependency directory (https://snowpack.dev/) | ||||
| web_modules/ | ||||
|  | ||||
| # TypeScript cache | ||||
| *.tsbuildinfo | ||||
|  | ||||
| # Optional npm cache directory | ||||
| .npm | ||||
|  | ||||
| # Optional eslint cache | ||||
| .eslintcache | ||||
|  | ||||
| # Microbundle cache | ||||
| .rpt2_cache/ | ||||
| .rts2_cache_cjs/ | ||||
| .rts2_cache_es/ | ||||
| .rts2_cache_umd/ | ||||
|  | ||||
| # Optional REPL history | ||||
| .node_repl_history | ||||
|  | ||||
| # Output of 'npm pack' | ||||
| *.tgz | ||||
|  | ||||
| # Yarn Integrity file | ||||
| .yarn-integrity | ||||
|  | ||||
| # dotenv environment variables file | ||||
| .env | ||||
| .env.test | ||||
|  | ||||
| # parcel-bundler cache (https://parceljs.org/) | ||||
| .cache | ||||
| .parcel-cache | ||||
|  | ||||
| # Next.js build output | ||||
| .next | ||||
|  | ||||
| # Nuxt.js build / generate output | ||||
| .nuxt | ||||
| dist | ||||
|  | ||||
| # Gatsby files | ||||
| .cache/ | ||||
| # Comment in the public line in if your project uses Gatsby and not Next.js | ||||
| # https://nextjs.org/blog/next-9-1#public-directory-support | ||||
| # public | ||||
|  | ||||
| # vuepress build output | ||||
| .vuepress/dist | ||||
|  | ||||
| # Serverless directories | ||||
| .serverless/ | ||||
|  | ||||
| # FuseBox cache | ||||
| .fusebox/ | ||||
|  | ||||
| # DynamoDB Local files | ||||
| .dynamodb/ | ||||
|  | ||||
| # TernJS port file | ||||
| .tern-port | ||||
|  | ||||
| # Stores VSCode versions used for testing VSCode extensions | ||||
| .vscode-test | ||||
|  | ||||
| # yarn v2 | ||||
|  | ||||
| .yarn/cache | ||||
| .yarn/unplugged | ||||
| .yarn/build-state.yml | ||||
| .pnp.* | ||||
|  | ||||
| ### VisualStudioCode template | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| ### JetBrains template | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
|  | ||||
| # User-specific stuff | ||||
| .idea/**/workspace.xml | ||||
| .idea/**/tasks.xml | ||||
| .idea/**/usage.statistics.xml | ||||
| .idea/**/dictionaries | ||||
| .idea/**/shelf | ||||
|  | ||||
| # Generated files | ||||
| .idea/**/contentModel.xml | ||||
|  | ||||
| # Sensitive or high-churn files | ||||
| .idea/**/dataSources/ | ||||
| .idea/**/dataSources.ids | ||||
| .idea/**/dataSources.local.xml | ||||
| .idea/**/sqlDataSources.xml | ||||
| .idea/**/dynamic.xml | ||||
| .idea/**/uiDesigner.xml | ||||
| .idea/**/dbnavigator.xml | ||||
|  | ||||
| # Gradle | ||||
| .idea/**/gradle.xml | ||||
| .idea/**/libraries | ||||
|  | ||||
| # Gradle and Maven with auto-import | ||||
| # When using Gradle or Maven with auto-import, you should exclude module files, | ||||
| # since they will be recreated, and may cause churn.  Uncomment if using | ||||
| # auto-import. | ||||
| # .idea/artifacts | ||||
| # .idea/compiler.xml | ||||
| # .idea/jarRepositories.xml | ||||
| # .idea/modules.xml | ||||
| # .idea/*.iml | ||||
| # .idea/modules | ||||
| # *.iml | ||||
| # *.ipr | ||||
|  | ||||
| # CMake | ||||
| cmake-build-*/ | ||||
|  | ||||
| # Mongo Explorer plugin | ||||
| .idea/**/mongoSettings.xml | ||||
|  | ||||
| # File-based project format | ||||
| *.iws | ||||
|  | ||||
| # IntelliJ | ||||
| out/ | ||||
|  | ||||
| # mpeltonen/sbt-idea plugin | ||||
| .idea_modules/ | ||||
|  | ||||
| # JIRA plugin | ||||
| atlassian-ide-plugin.xml | ||||
|  | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
|  | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| crashlytics-build.properties | ||||
| fabric.properties | ||||
|  | ||||
| # Editor-based Rest Client | ||||
| .idea/httpRequests | ||||
|  | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
|  | ||||
							
								
								
									
										14
									
								
								static-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								static-platform-example-typescript/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ISC License (ISC) | ||||
| Copyright (c) 2020 Andreas Bauer | ||||
|  | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||||
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||||
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||||
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||||
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||
| PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										588
									
								
								static-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								static-platform-example-typescript/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | ||||
| { | ||||
|   "name": "homebridge-static-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/color-name": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | ||||
|       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "10.17.19", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", | ||||
|       "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||
|       "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/color-name": "^1.1.1", | ||||
|         "color-convert": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", | ||||
|       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "bonjour-hap": { | ||||
|       "version": "3.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", | ||||
|       "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "array-flatten": "^2.1.0", | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "dns-equal": "^1.0.0", | ||||
|         "dns-txt": "^2.0.2", | ||||
|         "multicast-dns": "^7.2.0", | ||||
|         "multicast-dns-service-types": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "buffer-from": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "buffer-indexof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", | ||||
|       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||
|       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^4.1.0", | ||||
|         "supports-color": "^7.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
|       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "~1.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||
|       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", | ||||
|       "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ms": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "decimal.js": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", | ||||
|       "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", | ||||
|       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-arguments": "^1.0.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-regex": "^1.0.4", | ||||
|         "object-is": "^1.0.1", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "regexp.prototype.flags": "^1.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "dns-equal": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", | ||||
|       "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "dns-packet": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", | ||||
|       "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ip": "^1.1.5", | ||||
|         "safe-buffer": "^5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "dns-txt": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", | ||||
|       "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-indexof": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.17.5", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", | ||||
|       "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.2.1", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has": "^1.0.3", | ||||
|         "has-symbols": "^1.0.1", | ||||
|         "is-callable": "^1.1.5", | ||||
|         "is-regex": "^1.0.5", | ||||
|         "object-inspect": "^1.7.0", | ||||
|         "object-keys": "^1.1.1", | ||||
|         "object.assign": "^4.1.0", | ||||
|         "string.prototype.trimleft": "^2.1.1", | ||||
|         "string.prototype.trimright": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", | ||||
|       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-srp-hap": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", | ||||
|       "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | ||||
|       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "glob": { | ||||
|       "version": "7.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | ||||
|       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fs.realpath": "^1.0.0", | ||||
|         "inflight": "^1.0.4", | ||||
|         "inherits": "2", | ||||
|         "minimatch": "^3.0.4", | ||||
|         "once": "^1.3.0", | ||||
|         "path-is-absolute": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "hap-nodejs": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.6.2.tgz", | ||||
|       "integrity": "sha512-/LlRaYCtcwC4jBUKRJeBUdUfKEp8w/NK3PNYXaAOngQL9uVnqsvQ0Gce/mUhSXPhsxfdnxbHVT870W9OEnV6+A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "bonjour-hap": "3.5.4", | ||||
|         "debug": "^4.1.1", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "fast-srp-hap": "2.0.1", | ||||
|         "ip": "^1.1.3", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "tweetnacl": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", | ||||
|       "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "homebridge": { | ||||
|       "version": "0.4.54-beta.51", | ||||
|       "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.54-beta.51.tgz", | ||||
|       "integrity": "sha512-WycAihWBzWu+8ZBnVrU4wqdU0bq/cT43iKdk2+6ODhbGh/xlaxIFpMdSGX++YqwGpu7cNEL0L45Woj9sEfFYNw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "chalk": "^3.0.0", | ||||
|         "commander": "5.0.0", | ||||
|         "hap-nodejs": "0.6.2", | ||||
|         "node-persist": "^0.0.11", | ||||
|         "qrcode-terminal": "^0.12.0", | ||||
|         "semver": "^7.1.3", | ||||
|         "source-map-support": "^0.5.16" | ||||
|       } | ||||
|     }, | ||||
|     "inflight": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||
|       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "once": "^1.3.0", | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", | ||||
|       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-arguments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", | ||||
|       "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", | ||||
|       "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", | ||||
|       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", | ||||
|       "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "minimist": { | ||||
|       "version": "1.2.5", | ||||
|       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | ||||
|       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "mkdirp": { | ||||
|       "version": "0.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | ||||
|       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "minimist": "^1.2.5" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "multicast-dns": { | ||||
|       "version": "7.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", | ||||
|       "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "dns-packet": "^4.0.0", | ||||
|         "thunky": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "multicast-dns-service-types": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", | ||||
|       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node-persist": { | ||||
|       "version": "0.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", | ||||
|       "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mkdirp": "~0.5.1", | ||||
|         "q": "~1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "object-inspect": { | ||||
|       "version": "1.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", | ||||
|       "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object-is": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", | ||||
|       "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "object-keys": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", | ||||
|       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "object.assign": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", | ||||
|       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.2", | ||||
|         "function-bind": "^1.1.1", | ||||
|         "has-symbols": "^1.0.0", | ||||
|         "object-keys": "^1.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "once": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||||
|       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "wrappy": "1" | ||||
|       } | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
|       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "q": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", | ||||
|       "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "qrcode-terminal": { | ||||
|       "version": "0.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", | ||||
|       "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "regexp.prototype.flags": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", | ||||
|       "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.0-next.1" | ||||
|       } | ||||
|     }, | ||||
|     "rimraf": { | ||||
|       "version": "3.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", | ||||
|       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob": "^7.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", | ||||
|       "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "7.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", | ||||
|       "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.16", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", | ||||
|       "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimend": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", | ||||
|       "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimleft": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", | ||||
|       "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimstart": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimright": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", | ||||
|       "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5", | ||||
|         "string.prototype.trimend": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "string.prototype.trimstart": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", | ||||
|       "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "define-properties": "^1.1.3", | ||||
|         "es-abstract": "^1.17.5" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||
|       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "thunky": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", | ||||
|       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "tweetnacl": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", | ||||
|       "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "3.8.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", | ||||
|       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "wrappy": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||||
|       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								static-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								static-platform-example-typescript/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| { | ||||
|   "name": "homebridge-static-platform-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "An example static platform plugin for homebridge written in Typescript", | ||||
|   "main": "dist/static-platform.js", | ||||
|   "scripts": { | ||||
|     "clean": "rimraf ./dist", | ||||
|     "build": "rimraf ./dist && tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postpublish": "npm run clean", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Andreas Bauer <mail@anderl-bauer.de>", | ||||
|   "engines": { | ||||
|     "homebridge": ">=1.0.0" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "homebridge-plugin" | ||||
|   ], | ||||
|   "license": "ISC", | ||||
|   "files": [ | ||||
|     "LICENSE", | ||||
|     "dist" | ||||
|   ], | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/homebridge/homebridge-examples.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "http://github.com/homebridge/homebridge-examples/issues" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "10.17.19", | ||||
|     "typescript": "^3.8.3", | ||||
|     "rimraf": "^3.0.2", | ||||
|     "homebridge": "^0.4.54-beta.51" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										42
									
								
								static-platform-example-typescript/src/static-platform.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								static-platform-example-typescript/src/static-platform.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| import {AccessoryPlugin, API, HAP, Logging, PlatformConfig, StaticPlatformPlugin,} from "homebridge"; | ||||
| import {ExampleSwitch} from "./switch-accessory"; | ||||
|  | ||||
| const PLATFORM_NAME = "ExampleStaticPlatform"; | ||||
|  | ||||
| /** | ||||
|  * TODO explain | ||||
|  */ | ||||
| let hap: HAP; | ||||
|  | ||||
| export = (api: API) => { | ||||
|   hap = api.hap; | ||||
|  | ||||
|   api.registerPlatform(PLATFORM_NAME, ExampleStaticPlatform); | ||||
| }; | ||||
|  | ||||
| class ExampleStaticPlatform implements StaticPlatformPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|  | ||||
|   constructor(log: Logging, config: PlatformConfig, api: API) { | ||||
|     this.log = log; | ||||
|  | ||||
|     // probably parse config or something here | ||||
|  | ||||
|     log.info("Example platform finished initializing!"); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This method is called to retrieve all accessories exposed by the platform. | ||||
|    * The Platform can delay the response my invoking the callback at a later time, | ||||
|    * it will delay the bridge startup though, so keep it to a minimum. | ||||
|    * The set of exposed accessories CANNOT change over the lifetime of the plugin! | ||||
|    */ | ||||
|   accessories(callback: (foundAccessories: AccessoryPlugin[]) => void): void { | ||||
|     callback([ | ||||
|       new ExampleSwitch(hap, this.log, "Switch 1"), | ||||
|       new ExampleSwitch(hap, this.log, "Switch 2"), | ||||
|     ]); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										65
									
								
								static-platform-example-typescript/src/switch-accessory.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								static-platform-example-typescript/src/switch-accessory.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| import { | ||||
|   AccessoryPlugin, | ||||
|   CharacteristicGetCallback, | ||||
|   CharacteristicSetCallback, | ||||
|   CharacteristicValue, | ||||
|   HAP, | ||||
|   Logging, | ||||
|   Service | ||||
| } from "homebridge"; | ||||
|  | ||||
| export class ExampleSwitch implements AccessoryPlugin { | ||||
|  | ||||
|   private readonly log: Logging; | ||||
|  | ||||
|   private switchOn = false; | ||||
|  | ||||
|   // This property must be existent!! | ||||
|   name: string; | ||||
|  | ||||
|   private readonly switchService: Service; | ||||
|   private readonly informationService: Service; | ||||
|  | ||||
|   constructor(hap: HAP, log: Logging, name: string) { | ||||
|     this.log = log; | ||||
|     this.name = name; | ||||
|  | ||||
|     this.switchService = new hap.Service.Switch(name); | ||||
|     this.switchService.getCharacteristic(hap.Characteristic.On) | ||||
|       .on(hap.CharacteristicEventTypes.GET, (callback: CharacteristicGetCallback) => { | ||||
|         log.info("Current state of the switch was returned: " + (this.switchOn? "ON": "OFF")); | ||||
|         callback(undefined, this.switchOn); | ||||
|       }) | ||||
|       .on(hap.CharacteristicEventTypes.SET, (value: CharacteristicValue, callback: CharacteristicSetCallback) => { | ||||
|         this.switchOn = value as boolean; | ||||
|         log.info("Switch state was set to: " + (this.switchOn? "ON": "OFF")); | ||||
|         callback(); | ||||
|       }); | ||||
|  | ||||
|     this.informationService = new hap.Service.AccessoryInformation() | ||||
|       .setCharacteristic(hap.Characteristic.Manufacturer, "Custom Manufacturer") | ||||
|       .setCharacteristic(hap.Characteristic.Model, "Custom Model"); | ||||
|  | ||||
|     log.info("Example switch '%s' created!", name); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This method is optional to implement. It is called when HomeKit ask to identify the accessory. | ||||
|    * Typical this only ever happens at the pairing process. | ||||
|    */ | ||||
|   identify(): void { | ||||
|     this.log("Identify!"); | ||||
|   } | ||||
|  | ||||
|   /* | ||||
|    * This method is called directly after creation of this instance. | ||||
|    * It should return all services which should be added to the accessory. | ||||
|    */ | ||||
|   getServices(): Service[] { | ||||
|     return [ | ||||
|       this.informationService, | ||||
|       this.switchService, | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								static-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								static-platform-example-typescript/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ES2018", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "ES2015", | ||||
|       "ES2016", | ||||
|       "ES2017", | ||||
|       "ES2018" | ||||
|     ], | ||||
|     "sourceMap": true, | ||||
|     "rootDir": "src", | ||||
|     "outDir": "dist", | ||||
|  | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true | ||||
|   }, | ||||
|   "include": [ | ||||
|     "src" | ||||
|   ] | ||||
| } | ||||
		Reference in New Issue
	
	Block a user