@switchbot/homebridge-switchbot 1.9.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.eslintrc +14 -45
  2. package/.github/ISSUE_TEMPLATE/bug-report.yml +3 -3
  3. package/.github/ISSUE_TEMPLATE/feature-request.yml +2 -2
  4. package/.github/ISSUE_TEMPLATE/support-request.yml +3 -3
  5. package/.github/labeler.yml +1 -1
  6. package/.github/workflows/codeql-analysis.yml +29 -29
  7. package/.github/workflows/nodejs-beta.yml +1 -1
  8. package/.github/workflows/prerelease-beta.js +1 -1
  9. package/.github/workflows/stale.yml +1 -1
  10. package/.prettierrc +9 -0
  11. package/.vscode/extensions.json +2 -4
  12. package/.vscode/settings.json +13 -1
  13. package/CHANGELOG.md +16 -0
  14. package/README.md +100 -99
  15. package/SECURITY.md +2 -2
  16. package/config.schema.json +8 -0
  17. package/dist/devices/bots.d.ts +2 -2
  18. package/dist/devices/bots.d.ts.map +1 -1
  19. package/dist/devices/bots.js +91 -86
  20. package/dist/devices/bots.js.map +1 -1
  21. package/dist/devices/colorbulb.d.ts +15 -15
  22. package/dist/devices/colorbulb.d.ts.map +1 -1
  23. package/dist/devices/colorbulb.js +60 -71
  24. package/dist/devices/colorbulb.js.map +1 -1
  25. package/dist/devices/contact.d.ts +2 -2
  26. package/dist/devices/contact.d.ts.map +1 -1
  27. package/dist/devices/contact.js +33 -31
  28. package/dist/devices/contact.js.map +1 -1
  29. package/dist/devices/curtains.d.ts +2 -2
  30. package/dist/devices/curtains.d.ts.map +1 -1
  31. package/dist/devices/curtains.js +71 -71
  32. package/dist/devices/curtains.js.map +1 -1
  33. package/dist/devices/humidifiers.d.ts +2 -2
  34. package/dist/devices/humidifiers.d.ts.map +1 -1
  35. package/dist/devices/humidifiers.js +74 -76
  36. package/dist/devices/humidifiers.js.map +1 -1
  37. package/dist/devices/meters.d.ts +2 -2
  38. package/dist/devices/meters.d.ts.map +1 -1
  39. package/dist/devices/meters.js +29 -27
  40. package/dist/devices/meters.js.map +1 -1
  41. package/dist/devices/motion.d.ts +2 -2
  42. package/dist/devices/motion.d.ts.map +1 -1
  43. package/dist/devices/motion.js +34 -32
  44. package/dist/devices/motion.js.map +1 -1
  45. package/dist/devices/plugs.d.ts +7 -7
  46. package/dist/devices/plugs.d.ts.map +1 -1
  47. package/dist/devices/plugs.js +18 -23
  48. package/dist/devices/plugs.js.map +1 -1
  49. package/dist/irdevices/airconditioners.d.ts +5 -2
  50. package/dist/irdevices/airconditioners.d.ts.map +1 -1
  51. package/dist/irdevices/airconditioners.js +61 -56
  52. package/dist/irdevices/airconditioners.js.map +1 -1
  53. package/dist/irdevices/airpurifiers.d.ts +2 -2
  54. package/dist/irdevices/airpurifiers.d.ts.map +1 -1
  55. package/dist/irdevices/airpurifiers.js +12 -17
  56. package/dist/irdevices/airpurifiers.js.map +1 -1
  57. package/dist/irdevices/cameras.d.ts +2 -2
  58. package/dist/irdevices/cameras.d.ts.map +1 -1
  59. package/dist/irdevices/cameras.js +10 -13
  60. package/dist/irdevices/cameras.js.map +1 -1
  61. package/dist/irdevices/fans.d.ts +2 -2
  62. package/dist/irdevices/fans.d.ts.map +1 -1
  63. package/dist/irdevices/fans.js +15 -17
  64. package/dist/irdevices/fans.js.map +1 -1
  65. package/dist/irdevices/lights.d.ts +2 -2
  66. package/dist/irdevices/lights.d.ts.map +1 -1
  67. package/dist/irdevices/lights.js +10 -13
  68. package/dist/irdevices/lights.js.map +1 -1
  69. package/dist/irdevices/others.d.ts +2 -2
  70. package/dist/irdevices/others.d.ts.map +1 -1
  71. package/dist/irdevices/others.js +10 -13
  72. package/dist/irdevices/others.js.map +1 -1
  73. package/dist/irdevices/tvs.d.ts +2 -2
  74. package/dist/irdevices/tvs.d.ts.map +1 -1
  75. package/dist/irdevices/tvs.js +22 -30
  76. package/dist/irdevices/tvs.js.map +1 -1
  77. package/dist/irdevices/vacuumcleaners.d.ts +2 -2
  78. package/dist/irdevices/vacuumcleaners.d.ts.map +1 -1
  79. package/dist/irdevices/vacuumcleaners.js +11 -13
  80. package/dist/irdevices/vacuumcleaners.js.map +1 -1
  81. package/dist/irdevices/waterheaters.d.ts +2 -2
  82. package/dist/irdevices/waterheaters.d.ts.map +1 -1
  83. package/dist/irdevices/waterheaters.js +10 -13
  84. package/dist/irdevices/waterheaters.js.map +1 -1
  85. package/dist/platform.d.ts +3 -3
  86. package/dist/platform.d.ts.map +1 -1
  87. package/dist/platform.js +13 -14
  88. package/dist/platform.js.map +1 -1
  89. package/dist/settings.d.ts +1 -0
  90. package/dist/settings.d.ts.map +1 -1
  91. package/dist/settings.js.map +1 -1
  92. package/homebridge-ui/public/index.html +231 -245
  93. package/homebridge-ui/server.js +2 -4
  94. package/nodemon.json +2 -4
  95. package/package.json +15 -9
  96. package/src/devices/bots.ts +217 -186
  97. package/src/devices/colorbulb.ts +90 -84
  98. package/src/devices/contact.ts +85 -78
  99. package/src/devices/curtains.ts +152 -135
  100. package/src/devices/humidifiers.ts +162 -137
  101. package/src/devices/meters.ts +76 -73
  102. package/src/devices/motion.ts +87 -78
  103. package/src/devices/plugs.ts +27 -31
  104. package/src/irdevices/airconditioners.ts +91 -59
  105. package/src/irdevices/airpurifiers.ts +22 -23
  106. package/src/irdevices/cameras.ts +18 -19
  107. package/src/irdevices/fans.ts +27 -25
  108. package/src/irdevices/lights.ts +18 -20
  109. package/src/irdevices/others.ts +18 -19
  110. package/src/irdevices/tvs.ts +33 -41
  111. package/src/irdevices/vacuumcleaners.ts +19 -19
  112. package/src/irdevices/waterheaters.ts +21 -31
  113. package/src/platform.ts +32 -33
  114. package/src/settings.ts +9 -19
  115. package/tsconfig.json +5 -14
  116. package/.github/PULL_REQUEST_TEMPLATE/pull_requests.md +0 -27
@@ -1,253 +1,239 @@
1
1
  <p class="text-center">
2
- <img src="https://raw.githubusercontent.com/OpenWonderLabs/homebridge-switchbot/latest/switchbot/Homebridge_x_SwitchBot.svg"
3
- alt="homebridge-switchbot logo" style="width: 60%;" />
2
+ <img
3
+ src="https://raw.githubusercontent.com/OpenWonderLabs/homebridge-switchbot/latest/switchbot/Homebridge_x_SwitchBot.svg"
4
+ alt="homebridge-switchbot logo"
5
+ style="width: 60%" />
4
6
  </p>
5
- <div id="pageIntro" style="display: none;">
6
- <p class="lead text-center">Thank you for installing <strong>homebridge-switchbot</strong></p>
7
- <p class="lead text-center">Before continuing:</p>
8
- <ol>
9
- <li class="mb-3">Download the SwitchBot App from either the <a href="https://apps.apple.com/us/app/switchbot/id1087374760" target="_blank"
10
- rel="noreferrer noopener">App Store</a> or the <a href="https://play.google.com/store/apps/details?id=com.theswitchbot.switchbot&hl=en_US&gl=US" target="_blank"
11
- rel="noreferrer noopener">Play Store</a>.</li>
12
- <li class="mb-3">Select <strong> Profile</strong>.</li>
13
- <li class="mb-3">Select <strong> Preference</strong>.</li>
14
- <li class="mb-3">Tap the <strong> App verion</strong> 10 times, this will enable Developer Options</li>
15
- <li class="mb-3">Select <strong> Developer Options</strong>.</li>
16
- <li class="mb-3">Copy your token by hitting <strong> Copy to Clipboard</strong>.</li>
17
- <li class="mb-3">Paste the Token into the Token paramter on the next page.</li>
18
- </ol>
19
- <div class="text-center">
20
- <button type="button" class="btn btn-primary" id="introLink">Continue &rarr;</button>
21
- </div>
22
- </div>
23
- <div id="menuWrapper" class="btn-group w-100 mb-0" role="group" aria-label="UI Menu" style="display: none;">
24
- <button type="button" class="btn btn-primary" id="menuSettings">
25
- Settings
26
- </button>
27
- <button type="button" class="btn btn-primary" id="menuDevices">
28
- Devices
29
- </button>
30
- <button type="button" class="btn btn-primary mr-0" id="menuHome">
31
- Support
32
- </button>
7
+ <div id="pageIntro" style="display: none">
8
+ <p class="lead text-center">Thank you for installing<strong> homebridge-switchbot</strong></p>
9
+ <p class="lead text-center">Before continuing:</p>
10
+ <ol>
11
+ <li class="mb-3">
12
+ Download the SwitchBot App from either the
13
+ <a href="https://apps.apple.com/us/app/switchbot/id1087374760" target="_blank" rel="noreferrer noopener">App Store</a> or the
14
+ <a href="https://play.google.com/store/apps/details?id=com.theswitchbot.switchbot&hl=en_US&gl=US" target="_blank" rel="noreferrer noopener"
15
+ >Play Store</a
16
+ >.
17
+ </li>
18
+ <li class="mb-3">Select <strong>Profile</strong>.</li>
19
+ <li class="mb-3">Select <strong>Preferences</strong>.</li>
20
+ <li class="mb-3">Tap the <strong>App version</strong> 10 times, this will enable Developer Options.</li>
21
+ <li class="mb-3">Select <strong>Developer Options</strong>.</li>
22
+ <li class="mb-3">Copy your token by hitting <strong>Copy to Clipboard</strong>.</li>
23
+ <li class="mb-3">Paste the Token into the Token parameter on the next page.</li>
24
+ </ol>
25
+ <div class="text-center">
26
+ <button type="button" class="btn btn-primary" id="introLink">Continue &rarr;</button>
27
+ </div>
33
28
  </div>
34
- <div id="disabledBanner" class="alert alert-secondary mb-0 mt-3" role="alert" style="display: none;">
35
- Plugin is currently disabled
36
- <button id="disabledEnable" type="button" class="btn btn-link p-0 m-0 float-right">
37
- Enable
38
- </button>
29
+ <div id="menuWrapper" class="btn-group w-100 mb-0" role="group" aria-label="UI Menu" style="display: none">
30
+ <button type="button" class="btn btn-primary" id="menuSettings">Settings</button>
31
+ <button type="button" class="btn btn-primary" id="menuDevices">Devices</button>
32
+ <button type="button" class="btn btn-primary mr-0" id="menuHome">Support</button>
39
33
  </div>
40
- <div id="pageDevices" class="mt-4" style="display: none;">
41
- <div id="deviceInfo">
42
- <form>
43
- <div class="form-group">
44
- <select class="form-control" id="deviceSelect"></select>
45
- </div>
46
- </form>
47
- <table class="table w-100" id="deviceTable" style="display: none;">
48
- <thead>
49
- <tr class="table-active">
50
- <th scope="col" style="width: 40%;">Device Name</th>
51
- <th scope="col" style="width: 60%;" id="displayName"></th>
52
- </tr>
53
- </thead>
54
- <tbody>
55
- <tr>
56
- <th scope="row">Device ID</th>
57
- <td id="deviceID"></td>
58
- </tr>
59
- <tr>
60
- <th scope="row">Model</th>
61
- <td id="model"></td>
62
- </tr>
63
- <tr>
64
- <th scope="row">Firmware Version</th>
65
- <td id="firmwareRevision"></td>
66
- </tr>
67
- <tr>
68
- <th scope="row">Device Type</th>
69
- <td id="deviceType"></td>
70
- </tr>
71
- <tr>
72
- <th scope="row">Connection Type</th>
73
- <td id="connectionType"></td>
74
- </tr>
75
- </tbody>
76
- </table>
77
- </div>
34
+ <div id="disabledBanner" class="alert alert-secondary mb-0 mt-3" role="alert" style="display: none">
35
+ Plugin is currently disabled
36
+ <button id="disabledEnable" type="button" class="btn btn-link p-0 m-0 float-right">Enable</button>
78
37
  </div>
79
- <div id="pageSupport" class="mt-4" style="display: none;">
80
- <p class="text-center lead">Thank you for using <strong>homebridge-switchbot</strong></p>
81
- <p class="text-center">The links below will take you to our GitHub wiki</p>
82
- <h5>Setup</h5>
83
- <ul>
84
- <li>
85
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki" target="_blank">Wiki Home</a>
86
- </li>
87
- <li>
88
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Configuration"
89
- target="_blank">Configuration</a>
90
- </li>
91
- <li>
92
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Beta-Version" target="_blank">Beta
93
- Version</a>
94
- </li>
95
- <li>
96
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Node-Version" target="_blank">Node
97
- Version</a>
98
- </li>
99
- <li>
100
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Uninstallation"
101
- target="_blank">Uninstallation</a>
102
- </li>
103
- </ul>
104
- <h5>Features</h5>
105
- <ul>
106
- <li>
107
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Supported-Devices"
108
- target="_blank">Supported Devices</a>
109
- </li>
110
- </ul>
111
- <h5>Help/About</h5>
112
- <ul>
113
- <li>
114
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/issues/new/choose"
115
- target="_blank">Support
116
- Request</a>
117
- </li>
118
- <li>
119
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/latest/CHANGELOG.md"
120
- target="_blank">Changelog</a>
121
- </li>
122
- </ul>
38
+ <div id="pageDevices" class="mt-4" style="display: none">
39
+ <div id="deviceInfo">
40
+ <form>
41
+ <div class="form-group">
42
+ <select class="form-control" id="deviceSelect"></select>
43
+ </div>
44
+ </form>
45
+ <table class="table w-100" id="deviceTable" style="display: none">
46
+ <thead>
47
+ <tr class="table-active">
48
+ <th scope="col" style="width: 40%">Device Name</th>
49
+ <th scope="col" style="width: 60%" id="displayName"></th>
50
+ </tr>
51
+ </thead>
52
+ <tbody>
53
+ <tr>
54
+ <th scope="row">Device ID</th>
55
+ <td id="deviceID"></td>
56
+ </tr>
57
+ <tr>
58
+ <th scope="row">Model</th>
59
+ <td id="model"></td>
60
+ </tr>
61
+ <tr>
62
+ <th scope="row">Firmware Version</th>
63
+ <td id="firmwareRevision"></td>
64
+ </tr>
65
+ <tr>
66
+ <th scope="row">Device Type</th>
67
+ <td id="deviceType"></td>
68
+ </tr>
69
+ <tr>
70
+ <th scope="row">Connection Type</th>
71
+ <td id="connectionType"></td>
72
+ </tr>
73
+ </tbody>
74
+ </table>
75
+ </div>
76
+ </div>
77
+ <div id="pageSupport" class="mt-4" style="display: none">
78
+ <p class="text-center lead">Thank you for using <strong>homebridge-switchbot</strong></p>
79
+ <p class="text-center">The links below will take you to our GitHub wiki</p>
80
+ <h5>Setup</h5>
81
+ <ul>
82
+ <li>
83
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki" target="_blank">Wiki Home</a>
84
+ </li>
85
+ <li>
86
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Configuration" target="_blank">Configuration</a>
87
+ </li>
88
+ <li>
89
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Beta-Version" target="_blank">Beta Version</a>
90
+ </li>
91
+ <li>
92
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Node-Version" target="_blank">Node Version</a>
93
+ </li>
94
+ <li>
95
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Uninstallation" target="_blank">Uninstallation</a>
96
+ </li>
97
+ </ul>
98
+ <h5>Features</h5>
99
+ <ul>
100
+ <li>
101
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Supported-Devices" target="_blank">Supported Devices</a>
102
+ </li>
103
+ </ul>
104
+ <h5>Help/About</h5>
105
+ <ul>
106
+ <li>
107
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/issues/new/choose" target="_blank">Support Request</a>
108
+ </li>
109
+ <li>
110
+ <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/latest/CHANGELOG.md" target="_blank">Changelog</a>
111
+ </li>
112
+ </ul>
123
113
  </div>
124
114
  <script>
125
- ; (async () => {
126
- try {
127
- const currentConfig = await homebridge.getPluginConfig()
128
- showIntro = () => {
129
- const introLink = document.getElementById('introLink')
130
- introLink.addEventListener('click', () => {
131
- homebridge.showSpinner()
132
- document.getElementById('pageIntro').style.display = 'none'
133
- document.getElementById('menuWrapper').style.display = 'inline-flex'
134
- showSettings()
135
- homebridge.hideSpinner()
136
- })
137
- document.getElementById('pageIntro').style.display = 'block'
138
- }
139
- showDevices = async () => {
140
- homebridge.showSpinner()
141
- homebridge.hideSchemaForm()
142
- document.getElementById('menuHome').classList.remove('btn-elegant')
143
- document.getElementById('menuHome').classList.add('btn-primary')
144
- document.getElementById('menuDevices').classList.add('btn-elegant')
145
- document.getElementById('menuDevices').classList.remove('btn-primary')
146
- document.getElementById('menuSettings').classList.remove('btn-elegant')
147
- document.getElementById('menuSettings').classList.add('btn-primary')
148
- document.getElementById('pageSupport').style.display = 'none'
149
- document.getElementById('pageDevices').style.display = 'block'
150
- const cachedAccessories =
151
- typeof homebridge.getCachedAccessories === 'function'
152
- ? await homebridge.getCachedAccessories()
153
- : await homebridge.request('/getCachedAccessories')
154
- if (cachedAccessories.length > 0) {
155
- cachedAccessories.sort((a, b) => {
156
- return a.displayName.toLowerCase() > b.displayName.toLowerCase()
157
- ? 1
158
- : b.displayName.toLowerCase() > a.displayName.toLowerCase()
159
- ? -1
160
- : 0
161
- })
162
- }
163
- const deviceSelect = document.getElementById('deviceSelect')
164
- deviceSelect.innerHTML = ''
165
- cachedAccessories.forEach(a => {
166
- const option = document.createElement('option')
167
- option.text = a.displayName
168
- option.value = a.UUID
169
- deviceSelect.add(option)
170
- })
171
- showDeviceInfo = async UUID => {
172
- homebridge.showSpinner()
173
- const thisAcc = cachedAccessories.find(x => x.UUID === UUID)
174
- const context = thisAcc.context
175
- document.getElementById('displayName').innerHTML = thisAcc.displayName
176
- document.getElementById('deviceID').innerHTML = context.deviceID
177
- document.getElementById('model').innerHTML = context.model
178
- document.getElementById('firmwareRevision').innerHTML = context.firmwareRevision || 'N/A'
179
- document.getElementById('deviceType').innerHTML = context.deviceType
180
- document.getElementById('connectionType').innerHTML = context.connectionType
181
- document.getElementById('deviceTable').style.display = 'inline-table'
182
- homebridge.hideSpinner()
183
- }
184
- deviceSelect.addEventListener('change', event => showDeviceInfo(event.target.value))
185
- if (cachedAccessories.length > 0) {
186
- showDeviceInfo(cachedAccessories[0].UUID)
187
- } else {
188
- const option = document.createElement('option')
189
- option.text = 'No Devices'
190
- deviceSelect.add(option)
191
- deviceSelect.disabled = true
192
- }
193
- homebridge.hideSpinner()
194
- }
195
- showSupport = () => {
196
- homebridge.showSpinner()
197
- homebridge.hideSchemaForm()
198
- document.getElementById('menuHome').classList.add('btn-elegant')
199
- document.getElementById('menuHome').classList.remove('btn-primary')
200
- document.getElementById('menuDevices').classList.remove('btn-elegant')
201
- document.getElementById('menuDevices').classList.add('btn-primary')
202
- document.getElementById('menuSettings').classList.remove('btn-elegant')
203
- document.getElementById('menuSettings').classList.add('btn-primary')
204
- document.getElementById('pageSupport').style.display = 'block'
205
- document.getElementById('pageDevices').style.display = 'none'
206
- homebridge.hideSpinner()
207
- }
208
- showSettings = () => {
209
- homebridge.showSpinner()
210
- document.getElementById('menuHome').classList.remove('btn-elegant')
211
- document.getElementById('menuHome').classList.add('btn-primary')
212
- document.getElementById('menuDevices').classList.remove('btn-elegant')
213
- document.getElementById('menuDevices').classList.add('btn-primary')
214
- document.getElementById('menuSettings').classList.add('btn-elegant')
215
- document.getElementById('menuSettings').classList.remove('btn-primary')
216
- document.getElementById('pageSupport').style.display = 'none'
217
- document.getElementById('pageDevices').style.display = 'none'
218
- homebridge.showSchemaForm()
219
- homebridge.hideSpinner()
220
- }
221
- showDisabledBanner = () => {
222
- document.getElementById('disabledBanner').style.display = 'block'
223
- }
224
- enablePlugin = async () => {
225
- homebridge.showSpinner()
226
- document.getElementById('disabledBanner').style.display = 'none'
227
- currentConfig[0].disablePlugin = false
228
- await homebridge.updatePluginConfig(currentConfig)
229
- await homebridge.savePluginConfig()
230
- homebridge.hideSpinner()
231
- }
232
- menuHome.addEventListener('click', () => showSupport())
233
- menuDevices.addEventListener('click', () => showDevices())
234
- menuSettings.addEventListener('click', () => showSettings())
235
- disabledEnable.addEventListener('click', () => enablePlugin())
236
- if (currentConfig.length) {
237
- document.getElementById('menuWrapper').style.display = 'inline-flex'
238
- showSettings()
239
- if (currentConfig[0].disablePlugin) {
240
- showDisabledBanner()
241
- }
242
- } else {
243
- currentConfig.push({ name: 'SwitchBot' })
244
- await homebridge.updatePluginConfig(currentConfig)
245
- showIntro()
246
- }
247
- } catch (err) {
248
- homebridge.toast.error(err.message, 'Error')
249
- } finally {
250
- homebridge.hideSpinner()
115
+ (async () => {
116
+ try {
117
+ const currentConfig = await homebridge.getPluginConfig();
118
+ showIntro = () => {
119
+ const introLink = document.getElementById('introLink');
120
+ introLink.addEventListener('click', () => {
121
+ homebridge.showSpinner();
122
+ document.getElementById('pageIntro').style.display = 'none';
123
+ document.getElementById('menuWrapper').style.display = 'inline-flex';
124
+ showSettings();
125
+ homebridge.hideSpinner();
126
+ });
127
+ document.getElementById('pageIntro').style.display = 'block';
128
+ };
129
+ showDevices = async () => {
130
+ homebridge.showSpinner();
131
+ homebridge.hideSchemaForm();
132
+ document.getElementById('menuHome').classList.remove('btn-elegant');
133
+ document.getElementById('menuHome').classList.add('btn-primary');
134
+ document.getElementById('menuDevices').classList.add('btn-elegant');
135
+ document.getElementById('menuDevices').classList.remove('btn-primary');
136
+ document.getElementById('menuSettings').classList.remove('btn-elegant');
137
+ document.getElementById('menuSettings').classList.add('btn-primary');
138
+ document.getElementById('pageSupport').style.display = 'none';
139
+ document.getElementById('pageDevices').style.display = 'block';
140
+ const cachedAccessories =
141
+ typeof homebridge.getCachedAccessories === 'function'
142
+ ? await homebridge.getCachedAccessories()
143
+ : await homebridge.request('/getCachedAccessories');
144
+ if (cachedAccessories.length > 0) {
145
+ cachedAccessories.sort((a, b) => {
146
+ return a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : b.displayName.toLowerCase() > a.displayName.toLowerCase() ? -1 : 0;
147
+ });
148
+ }
149
+ const deviceSelect = document.getElementById('deviceSelect');
150
+ deviceSelect.innerHTML = '';
151
+ cachedAccessories.forEach((a) => {
152
+ const option = document.createElement('option');
153
+ option.text = a.displayName;
154
+ option.value = a.UUID;
155
+ deviceSelect.add(option);
156
+ });
157
+ showDeviceInfo = async (UUID) => {
158
+ homebridge.showSpinner();
159
+ const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
160
+ const context = thisAcc.context;
161
+ document.getElementById('displayName').innerHTML = thisAcc.displayName;
162
+ document.getElementById('deviceID').innerHTML = context.deviceID;
163
+ document.getElementById('model').innerHTML = context.model;
164
+ document.getElementById('firmwareRevision').innerHTML = context.firmwareRevision || 'N/A';
165
+ document.getElementById('deviceType').innerHTML = context.deviceType;
166
+ document.getElementById('connectionType').innerHTML = context.connectionType;
167
+ document.getElementById('deviceTable').style.display = 'inline-table';
168
+ homebridge.hideSpinner();
169
+ };
170
+ deviceSelect.addEventListener('change', (event) => showDeviceInfo(event.target.value));
171
+ if (cachedAccessories.length > 0) {
172
+ showDeviceInfo(cachedAccessories[0].UUID);
173
+ } else {
174
+ const option = document.createElement('option');
175
+ option.text = 'No Devices';
176
+ deviceSelect.add(option);
177
+ deviceSelect.disabled = true;
178
+ }
179
+ homebridge.hideSpinner();
180
+ };
181
+ showSupport = () => {
182
+ homebridge.showSpinner();
183
+ homebridge.hideSchemaForm();
184
+ document.getElementById('menuHome').classList.add('btn-elegant');
185
+ document.getElementById('menuHome').classList.remove('btn-primary');
186
+ document.getElementById('menuDevices').classList.remove('btn-elegant');
187
+ document.getElementById('menuDevices').classList.add('btn-primary');
188
+ document.getElementById('menuSettings').classList.remove('btn-elegant');
189
+ document.getElementById('menuSettings').classList.add('btn-primary');
190
+ document.getElementById('pageSupport').style.display = 'block';
191
+ document.getElementById('pageDevices').style.display = 'none';
192
+ homebridge.hideSpinner();
193
+ };
194
+ showSettings = () => {
195
+ homebridge.showSpinner();
196
+ document.getElementById('menuHome').classList.remove('btn-elegant');
197
+ document.getElementById('menuHome').classList.add('btn-primary');
198
+ document.getElementById('menuDevices').classList.remove('btn-elegant');
199
+ document.getElementById('menuDevices').classList.add('btn-primary');
200
+ document.getElementById('menuSettings').classList.add('btn-elegant');
201
+ document.getElementById('menuSettings').classList.remove('btn-primary');
202
+ document.getElementById('pageSupport').style.display = 'none';
203
+ document.getElementById('pageDevices').style.display = 'none';
204
+ homebridge.showSchemaForm();
205
+ homebridge.hideSpinner();
206
+ };
207
+ showDisabledBanner = () => {
208
+ document.getElementById('disabledBanner').style.display = 'block';
209
+ };
210
+ enablePlugin = async () => {
211
+ homebridge.showSpinner();
212
+ document.getElementById('disabledBanner').style.display = 'none';
213
+ currentConfig[0].disablePlugin = false;
214
+ await homebridge.updatePluginConfig(currentConfig);
215
+ await homebridge.savePluginConfig();
216
+ homebridge.hideSpinner();
217
+ };
218
+ menuHome.addEventListener('click', () => showSupport());
219
+ menuDevices.addEventListener('click', () => showDevices());
220
+ menuSettings.addEventListener('click', () => showSettings());
221
+ disabledEnable.addEventListener('click', () => enablePlugin());
222
+ if (currentConfig.length) {
223
+ document.getElementById('menuWrapper').style.display = 'inline-flex';
224
+ showSettings();
225
+ if (currentConfig[0].disablePlugin) {
226
+ showDisabledBanner();
251
227
  }
252
- })()
253
- </script>
228
+ } else {
229
+ currentConfig.push({ name: 'SwitchBot' });
230
+ await homebridge.updatePluginConfig(currentConfig);
231
+ showIntro();
232
+ }
233
+ } catch (err) {
234
+ homebridge.toast.error(err.message, 'Error');
235
+ } finally {
236
+ homebridge.hideSpinner();
237
+ }
238
+ })();
239
+ </script>
@@ -8,7 +8,7 @@ const { HomebridgePluginUiServer } = require('@homebridge/plugin-ui-utils');
8
8
  const fs = require('fs');
9
9
 
10
10
  class PluginUiServer extends HomebridgePluginUiServer {
11
- constructor () {
11
+ constructor() {
12
12
  super();
13
13
 
14
14
  /*
@@ -33,9 +33,7 @@ class PluginUiServer extends HomebridgePluginUiServer {
33
33
  cachedAccessories = JSON.parse(cachedAccessories);
34
34
 
35
35
  // We only want the accessories for this plugin
36
- cachedAccessories
37
- .filter(accessory => accessory.plugin === plugin)
38
- .forEach(accessory => devicesToReturn.push(accessory));
36
+ cachedAccessories.filter((accessory) => accessory.plugin === plugin).forEach((accessory) => devicesToReturn.push(accessory));
39
37
  }
40
38
 
41
39
  // Return the array
package/nodemon.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
- "watch": [
3
- "src"
4
- ],
2
+ "watch": ["src"],
5
3
  "ext": "ts",
6
4
  "ignore": [],
7
5
  "exec": "tsc && sudo hb-service restart",
@@ -9,4 +7,4 @@
9
7
  "env": {
10
8
  "NODE_OPTIONS": "--trace-warnings"
11
9
  }
12
- }
10
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "Homebridge SwitchBot",
3
3
  "name": "@switchbot/homebridge-switchbot",
4
- "version": "1.9.0",
4
+ "version": "1.10.1",
5
5
  "description": "The [Homebridge](https://homebridge.io) SwitchBot plugin allows you to access your [SwitchBot](https://www.switch-bot.com) device(s) from HomeKit.",
6
6
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
7
7
  "license": "ISC",
@@ -13,7 +13,7 @@
13
13
  "url": "https://github.com/OpenWonderLabs/homebridge-switchbot/issues"
14
14
  },
15
15
  "engines": {
16
- "homebridge": "^1.3.9",
16
+ "homebridge": "^1.4.0",
17
17
  "node": "^14.18.3 || ^16.13.2"
18
18
  },
19
19
  "main": "dist/index.js",
@@ -23,7 +23,10 @@
23
23
  "lint": "eslint src/**.ts",
24
24
  "watch": "npm run build && npm link && nodemon",
25
25
  "build": "rimraf ./dist && tsc",
26
- "prepublishOnly": "npm run lint && npm run build"
26
+ "prepublishOnly": "npm run lint && npm run build",
27
+ "postpublish": "npm run clean",
28
+ "clean": "rimraf ./dist",
29
+ "test": "eslint src/**.ts"
27
30
  },
28
31
  "funding": [
29
32
  {
@@ -56,13 +59,16 @@
56
59
  "rxjs": "^7.5.2"
57
60
  },
58
61
  "devDependencies": {
59
- "@types/node": "^17.0.10",
60
- "@typescript-eslint/eslint-plugin": "^5.10.0",
61
- "@typescript-eslint/parser": "^5.10.0",
62
+ "@types/node": "^17.0.12",
63
+ "@typescript-eslint/eslint-plugin": "^5.10.1",
64
+ "@typescript-eslint/parser": "^5.10.1",
62
65
  "eslint": "^8.7.0",
63
- "homebridge": "^1.3.9",
66
+ "eslint-config-prettier": "8.3.0",
67
+ "eslint-plugin-prettier": "4.0.0",
68
+ "homebridge": "^1.4.0",
64
69
  "nodemon": "^2.0.15",
65
- "npm-check-updates": "^12.1.0",
70
+ "npm-check-updates": "^12.2.1",
71
+ "prettier": "2.5.1",
66
72
  "rimraf": "^3.0.2",
67
73
  "ts-node": "^10.4.0",
68
74
  "typescript": "^4.5.5",
@@ -71,4 +77,4 @@
71
77
  "optionalDependencies": {
72
78
  "node-switchbot": "^1.1.2"
73
79
  }
74
- }
80
+ }