@switchbot/homebridge-switchbot 3.5.0-beta.28 → 3.5.0-beta.29

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 (132) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/config.schema.json +67 -1
  3. package/dist/device/blindtilt.d.ts.map +1 -1
  4. package/dist/device/blindtilt.js +8 -3
  5. package/dist/device/blindtilt.js.map +1 -1
  6. package/dist/device/bot.d.ts.map +1 -1
  7. package/dist/device/bot.js +8 -3
  8. package/dist/device/bot.js.map +1 -1
  9. package/dist/device/ceilinglight.d.ts.map +1 -1
  10. package/dist/device/ceilinglight.js +31 -5
  11. package/dist/device/ceilinglight.js.map +1 -1
  12. package/dist/device/colorbulb.d.ts.map +1 -1
  13. package/dist/device/colorbulb.js +23 -4
  14. package/dist/device/colorbulb.js.map +1 -1
  15. package/dist/device/contact.d.ts.map +1 -1
  16. package/dist/device/contact.js +7 -2
  17. package/dist/device/contact.js.map +1 -1
  18. package/dist/device/curtain.d.ts.map +1 -1
  19. package/dist/device/curtain.js +7 -2
  20. package/dist/device/curtain.js.map +1 -1
  21. package/dist/device/device.d.ts.map +1 -1
  22. package/dist/device/device.js +13 -3
  23. package/dist/device/device.js.map +1 -1
  24. package/dist/device/fan.d.ts +51 -0
  25. package/dist/device/fan.d.ts.map +1 -0
  26. package/dist/device/fan.js +499 -0
  27. package/dist/device/fan.js.map +1 -0
  28. package/dist/device/hub.d.ts.map +1 -1
  29. package/dist/device/hub.js +32 -24
  30. package/dist/device/hub.js.map +1 -1
  31. package/dist/device/humidifier.d.ts.map +1 -1
  32. package/dist/device/humidifier.js +7 -2
  33. package/dist/device/humidifier.js.map +1 -1
  34. package/dist/device/iosensor.d.ts.map +1 -1
  35. package/dist/device/iosensor.js +25 -17
  36. package/dist/device/iosensor.js.map +1 -1
  37. package/dist/device/lightstrip.d.ts.map +1 -1
  38. package/dist/device/lightstrip.js +41 -4
  39. package/dist/device/lightstrip.js.map +1 -1
  40. package/dist/device/lock.d.ts.map +1 -1
  41. package/dist/device/lock.js +7 -2
  42. package/dist/device/lock.js.map +1 -1
  43. package/dist/device/meter.d.ts.map +1 -1
  44. package/dist/device/meter.js +25 -17
  45. package/dist/device/meter.js.map +1 -1
  46. package/dist/device/meterplus.d.ts.map +1 -1
  47. package/dist/device/meterplus.js +7 -2
  48. package/dist/device/meterplus.js.map +1 -1
  49. package/dist/device/motion.d.ts.map +1 -1
  50. package/dist/device/motion.js +7 -2
  51. package/dist/device/motion.js.map +1 -1
  52. package/dist/device/plug.d.ts.map +1 -1
  53. package/dist/device/plug.js +7 -2
  54. package/dist/device/plug.js.map +1 -1
  55. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  56. package/dist/device/robotvacuumcleaner.js +8 -3
  57. package/dist/device/robotvacuumcleaner.js.map +1 -1
  58. package/dist/device/waterdetector.d.ts.map +1 -1
  59. package/dist/device/waterdetector.js +14 -7
  60. package/dist/device/waterdetector.js.map +1 -1
  61. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  62. package/dist/irdevice/airconditioner.js +2 -1
  63. package/dist/irdevice/airconditioner.js.map +1 -1
  64. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  65. package/dist/irdevice/airpurifier.js +2 -1
  66. package/dist/irdevice/airpurifier.js.map +1 -1
  67. package/dist/irdevice/camera.d.ts.map +1 -1
  68. package/dist/irdevice/camera.js +2 -1
  69. package/dist/irdevice/camera.js.map +1 -1
  70. package/dist/irdevice/fan.d.ts +1 -1
  71. package/dist/irdevice/fan.d.ts.map +1 -1
  72. package/dist/irdevice/fan.js +3 -2
  73. package/dist/irdevice/fan.js.map +1 -1
  74. package/dist/irdevice/irdevice.js.map +1 -1
  75. package/dist/irdevice/light.d.ts.map +1 -1
  76. package/dist/irdevice/light.js +2 -1
  77. package/dist/irdevice/light.js.map +1 -1
  78. package/dist/irdevice/other.d.ts.map +1 -1
  79. package/dist/irdevice/other.js +2 -1
  80. package/dist/irdevice/other.js.map +1 -1
  81. package/dist/irdevice/tv.d.ts.map +1 -1
  82. package/dist/irdevice/tv.js +2 -1
  83. package/dist/irdevice/tv.js.map +1 -1
  84. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  85. package/dist/irdevice/vacuumcleaner.js +2 -1
  86. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  87. package/dist/irdevice/waterheater.d.ts.map +1 -1
  88. package/dist/irdevice/waterheater.js +2 -1
  89. package/dist/irdevice/waterheater.js.map +1 -1
  90. package/dist/platform.d.ts +2 -1
  91. package/dist/platform.d.ts.map +1 -1
  92. package/dist/platform.js +68 -5
  93. package/dist/platform.js.map +1 -1
  94. package/dist/settings.d.ts +22 -4
  95. package/dist/settings.d.ts.map +1 -1
  96. package/dist/utils.d.ts +10 -5
  97. package/dist/utils.d.ts.map +1 -1
  98. package/dist/utils.js +23 -9
  99. package/dist/utils.js.map +1 -1
  100. package/package.json +3 -3
  101. package/src/device/blindtilt.ts +8 -3
  102. package/src/device/bot.ts +8 -3
  103. package/src/device/ceilinglight.ts +31 -5
  104. package/src/device/colorbulb.ts +25 -6
  105. package/src/device/contact.ts +9 -4
  106. package/src/device/curtain.ts +21 -16
  107. package/src/device/device.ts +13 -3
  108. package/src/device/fan.ts +548 -0
  109. package/src/device/hub.ts +30 -22
  110. package/src/device/humidifier.ts +8 -3
  111. package/src/device/iosensor.ts +27 -19
  112. package/src/device/lightstrip.ts +40 -6
  113. package/src/device/lock.ts +12 -7
  114. package/src/device/meter.ts +29 -21
  115. package/src/device/meterplus.ts +11 -6
  116. package/src/device/motion.ts +8 -3
  117. package/src/device/plug.ts +8 -3
  118. package/src/device/robotvacuumcleaner.ts +13 -8
  119. package/src/device/waterdetector.ts +14 -7
  120. package/src/irdevice/airconditioner.ts +4 -3
  121. package/src/irdevice/airpurifier.ts +4 -3
  122. package/src/irdevice/camera.ts +3 -2
  123. package/src/irdevice/fan.ts +3 -2
  124. package/src/irdevice/irdevice.ts +1 -1
  125. package/src/irdevice/light.ts +2 -1
  126. package/src/irdevice/other.ts +46 -45
  127. package/src/irdevice/tv.ts +2 -1
  128. package/src/irdevice/vacuumcleaner.ts +2 -1
  129. package/src/irdevice/waterheater.ts +2 -1
  130. package/src/platform.ts +71 -5
  131. package/src/settings.ts +34 -9
  132. package/src/utils.ts +24 -9
@@ -0,0 +1,499 @@
1
+ /* eslint-disable max-len */
2
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
3
+ *
4
+ * plug.ts: @switchbot/homebridge-switchbot.
5
+ */
6
+ import { request } from 'undici';
7
+ import { deviceBase } from './device.js';
8
+ import { Subject, debounceTime, interval, skipWhile, take, tap } from 'rxjs';
9
+ import { Devices } from '../settings.js';
10
+ export class Fan extends deviceBase {
11
+ platform;
12
+ // Services
13
+ Fan;
14
+ Battery;
15
+ // Updates
16
+ plugUpdateInProgress;
17
+ doPlugUpdate;
18
+ constructor(platform, accessory, device) {
19
+ super(platform, accessory, device);
20
+ this.platform = platform;
21
+ // this is subject we use to track when we need to POST changes to the SwitchBot API
22
+ this.doPlugUpdate = new Subject();
23
+ this.plugUpdateInProgress = false;
24
+ // Initialize Fan property
25
+ this.Fan = {
26
+ Service: accessory.getService(this.hap.Service.Fanv2),
27
+ Active: accessory.context.Active || this.hap.Characteristic.Active.INACTIVE,
28
+ SwingMode: accessory.context.SwingMode || this.hap.Characteristic.SwingMode.SWING_DISABLED,
29
+ RotationSpeed: accessory.context.RotationSpeed || 0,
30
+ };
31
+ // Initialize Battery property
32
+ this.Battery = {
33
+ Service: accessory.getService(this.hap.Service.Battery),
34
+ BatteryLevel: accessory.context.BatteryLevel || 100,
35
+ StatusLowBattery: accessory.context.StatusLowBattery || this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
36
+ ChargingState: accessory.context.ChargingState || this.hap.Characteristic.ChargingState.NOT_CHARGING,
37
+ };
38
+ // Retrieve initial values and updateHomekit
39
+ this.refreshStatus();
40
+ // get the Fan service if it exists, otherwise create a new Fanv2 service
41
+ // you can create multiple services for each accessory
42
+ const FanService = `${accessory.displayName} ${device.deviceType}`;
43
+ (this.Fan.Service = accessory.getService(this.hap.Service.Fanv2)
44
+ || accessory.addService(this.hap.Service.Fanv2)), FanService;
45
+ this.Fan.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
46
+ // each service must implement at-minimum the "required characteristics" for the given service type
47
+ // see https://developers.homebridge.io/#/service/Fanv2
48
+ // create handlers for required characteristics
49
+ this.Fan.Service.getCharacteristic(this.hap.Characteristic.Active).onSet(this.ActiveSet.bind(this));
50
+ // create handlers for required characteristics
51
+ this.Fan.Service.getCharacteristic(this.hap.Characteristic.RotationSpeed).onSet(this.RotationSpeedSet.bind(this));
52
+ // create handlers for required characteristics
53
+ this.Fan.Service.getCharacteristic(this.hap.Characteristic.SwingMode).onSet(this.SwingModeSet.bind(this));
54
+ // Update Homekit
55
+ this.updateHomeKitCharacteristics();
56
+ // Start an update interval
57
+ interval(this.deviceRefreshRate * 1000)
58
+ .pipe(skipWhile(() => this.plugUpdateInProgress))
59
+ .subscribe(async () => {
60
+ await this.refreshStatus();
61
+ });
62
+ //regisiter webhook event handler
63
+ if (device.webhook) {
64
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
65
+ this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
66
+ try {
67
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
68
+ const { version, battery, powerState, oscillation, chargingStatus, fanSpeed } = context;
69
+ const { Active, SwingMode, RotationSpeed } = this.Fan;
70
+ const { BatteryLevel, ChargingState } = this.Battery;
71
+ const { FirmwareRevision } = this.accessory.context;
72
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
73
+ '(version, battery, powerState, oscillation, chargingStatus, fanSpeed) = '
74
+ + `Webhook:(${version}, ${battery}, ${powerState}, ${oscillation}, ${chargingStatus}, ${fanSpeed}), `
75
+ + `current:(${FirmwareRevision}, ${BatteryLevel}, ${Active}, ${SwingMode}, ${ChargingState}, ${RotationSpeed})`);
76
+ // Active
77
+ this.Fan.Active = powerState === 'ON' ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
78
+ // SwingMode
79
+ this.Fan.SwingMode = oscillation === 'on' ?
80
+ this.hap.Characteristic.SwingMode.SWING_ENABLED : this.hap.Characteristic.SwingMode.SWING_DISABLED;
81
+ // RotationSpeed
82
+ this.Fan.RotationSpeed = fanSpeed;
83
+ // ChargingState
84
+ this.Battery.ChargingState = chargingStatus === 'charging' ?
85
+ this.hap.Characteristic.ChargingState.CHARGING : this.hap.Characteristic.ChargingState.NOT_CHARGING;
86
+ // BatteryLevel
87
+ this.Battery.BatteryLevel = battery;
88
+ // FirmwareRevision
89
+ this.accessory.context.FirmwareRevision = version;
90
+ this.accessory
91
+ .getService(this.hap.Service.AccessoryInformation)
92
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.FirmwareRevision)
93
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
94
+ .updateValue(this.accessory.context.FirmwareRevision);
95
+ this.updateHomeKitCharacteristics();
96
+ }
97
+ catch (e) {
98
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
99
+ + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
100
+ }
101
+ };
102
+ }
103
+ // Watch for Plug change events
104
+ // We put in a debounce of 100ms so we don't make duplicate calls
105
+ this.doPlugUpdate
106
+ .pipe(tap(() => {
107
+ this.plugUpdateInProgress = true;
108
+ }), debounceTime(this.platform.config.options.pushRate * 1000))
109
+ .subscribe(async () => {
110
+ try {
111
+ await this.pushChanges();
112
+ }
113
+ catch (e) {
114
+ this.apiError(e);
115
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushChanges with ${this.device.connectionType} Connection,` +
116
+ ` Error Message: ${JSON.stringify(e.message)}`);
117
+ }
118
+ this.plugUpdateInProgress = false;
119
+ });
120
+ }
121
+ async BLEparseStatus(serviceData) {
122
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
123
+ // State
124
+ switch (serviceData.state) {
125
+ case 'on':
126
+ this.Fan.Active = true;
127
+ break;
128
+ default:
129
+ this.Fan.Active = false;
130
+ }
131
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Fan.Active}`);
132
+ }
133
+ async openAPIparseStatus(deviceStatus) {
134
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
135
+ // Active
136
+ this.Fan.Active = deviceStatus.body.power === 'on' ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
137
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Fan.Active}`);
138
+ // SwingMode
139
+ this.Fan.SwingMode = deviceStatus.body.oscillation === 'on' ?
140
+ this.hap.Characteristic.SwingMode.SWING_ENABLED : this.hap.Characteristic.SwingMode.SWING_DISABLED;
141
+ // RotationSpeed
142
+ this.Fan.RotationSpeed = deviceStatus.body.fanSpeed;
143
+ // ChargingState
144
+ this.Battery.ChargingState = deviceStatus.body.chargingStatus === 'charging' ?
145
+ this.hap.Characteristic.ChargingState.CHARGING : this.hap.Characteristic.ChargingState.NOT_CHARGING;
146
+ // BatteryLevel
147
+ this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
148
+ if (this.Battery.BatteryLevel < 10) {
149
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
150
+ }
151
+ else {
152
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
153
+ }
154
+ if (Number.isNaN(this.Battery.BatteryLevel)) {
155
+ this.Battery.BatteryLevel = 100;
156
+ }
157
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
158
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
159
+ // FirmwareRevision
160
+ this.accessory.context.FirmwareRevision = deviceStatus.body.version;
161
+ this.accessory
162
+ .getService(this.hap.Service.AccessoryInformation)
163
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.FirmwareRevision)
164
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
165
+ .updateValue(this.accessory.context.FirmwareRevision);
166
+ }
167
+ /**
168
+ * Asks the SwitchBot API for the latest device information
169
+ */
170
+ async refreshStatus() {
171
+ if (!this.device.enableCloudService && this.OpenAPI) {
172
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
173
+ }
174
+ else if (this.BLE) {
175
+ await this.BLERefreshStatus();
176
+ }
177
+ else if (this.OpenAPI && this.platform.config.credentials?.token) {
178
+ await this.openAPIRefreshStatus();
179
+ }
180
+ else {
181
+ await this.offlineOff();
182
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` +
183
+ ` ${this.device.connectionType}, refreshStatus will not happen.`);
184
+ }
185
+ }
186
+ async BLERefreshStatus() {
187
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
188
+ const switchbot = await this.platform.connectBLE();
189
+ // Convert to BLE Address
190
+ this.device.bleMac = this.device
191
+ .deviceId.match(/.{1,2}/g)
192
+ .join(':')
193
+ .toLowerCase();
194
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
195
+ this.getCustomBLEAddress(switchbot);
196
+ // Start to monitor advertisement packets
197
+ (async () => {
198
+ // Start to monitor advertisement packets
199
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
200
+ // Set an event handler
201
+ switchbot.onadvertisement = (ad) => {
202
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
203
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
204
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
205
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
206
+ }
207
+ else {
208
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
209
+ }
210
+ };
211
+ // Wait 10 seconds
212
+ await switchbot.wait(this.scanDuration * 1000);
213
+ // Stop to monitor
214
+ await switchbot.stopScan();
215
+ // Update HomeKit
216
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
217
+ await this.updateHomeKitCharacteristics();
218
+ })();
219
+ if (switchbot === undefined) {
220
+ await this.BLERefreshConnection(switchbot);
221
+ }
222
+ }
223
+ async openAPIRefreshStatus() {
224
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
225
+ try {
226
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
227
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
228
+ const deviceStatus = await body.json();
229
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
230
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
231
+ if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
232
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
233
+ + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
234
+ this.openAPIparseStatus(deviceStatus);
235
+ this.updateHomeKitCharacteristics();
236
+ }
237
+ else {
238
+ this.statusCode(statusCode);
239
+ this.statusCode(deviceStatus.statusCode);
240
+ }
241
+ }
242
+ catch (e) {
243
+ this.apiError(e);
244
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}` +
245
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
246
+ }
247
+ }
248
+ /**
249
+ * Pushes the requested changes to the SwitchBot API
250
+ * deviceType commandType Command command parameter Description
251
+ * Battery Circulator Fan - "command" "turnOff" "default" = set to OFF state
252
+ * Battery Circulator Fan - "command" "turnOn" "default" = set to ON state
253
+ * Battery Circulator Fan - "command" "setNightLightMode" "off, 1, or 2" = off, turn off nightlight, (1, bright) (2, dim)
254
+ * Battery Circulator Fan - "command" "setWindMode" "direct, natural, sleep, or baby" = Set fan mode. direct: direct mode. natural: natural mode. sleep: sleep mode. baby: ultra quiet mode
255
+ * Battery Circulator Fan - "command" "setWindSpeed" "{1-100} e.g. 10" = Set fan speed.1~100
256
+ */
257
+ async pushChanges() {
258
+ if (!this.device.enableCloudService && this.OpenAPI) {
259
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} pushChanges enableCloudService: ${this.device.enableCloudService}`);
260
+ }
261
+ else if (this.BLE) {
262
+ await this.BLEpushChanges();
263
+ }
264
+ else if (this.OpenAPI && this.platform.config.credentials?.token) {
265
+ await this.openAPIpushChanges();
266
+ }
267
+ else {
268
+ await this.offlineOff();
269
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, pushChanges will not happen.`);
270
+ }
271
+ // Refresh the status from the API
272
+ interval(15000)
273
+ .pipe(skipWhile(() => this.plugUpdateInProgress))
274
+ .pipe(take(1))
275
+ .subscribe(async () => {
276
+ await this.refreshStatus();
277
+ });
278
+ }
279
+ async BLEpushChanges() {
280
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
281
+ if (this.Fan.Active !== this.accessory.context.Active) {
282
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
283
+ + ` On: ${this.Fan.Active} OnCached: ${this.accessory.context.Active}`);
284
+ const switchbot = await this.platform.connectBLE();
285
+ // Convert to BLE Address
286
+ this.device.bleMac = this.device
287
+ .deviceId.match(/.{1,2}/g)
288
+ .join(':')
289
+ .toLowerCase();
290
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
291
+ switchbot
292
+ .discover({
293
+ model: this.device.bleModel,
294
+ id: this.device.bleMac,
295
+ })
296
+ .then(async (device_list) => {
297
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Fan.Active}`);
298
+ return await this.retryBLE({
299
+ max: await this.maxRetryBLE(),
300
+ fn: async () => {
301
+ if (this.Fan.Active) {
302
+ return await device_list[0].turnOn({ id: this.device.bleMac });
303
+ }
304
+ else {
305
+ return await device_list[0].turnOff({ id: this.device.bleMac });
306
+ }
307
+ },
308
+ });
309
+ })
310
+ .then(() => {
311
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
312
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
313
+ + `Active: ${this.Fan.Active} sent over BLE, sent successfully`);
314
+ this.Fan.Active = false;
315
+ })
316
+ .catch(async (e) => {
317
+ this.apiError(e);
318
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}` +
319
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
320
+ await this.BLEPushConnection();
321
+ });
322
+ }
323
+ else {
324
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges,`
325
+ + ` Active: ${this.Fan.Active}, ActiveCached: ${this.accessory.context.Active}`);
326
+ }
327
+ }
328
+ async openAPIpushChanges() {
329
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
330
+ if (this.Fan.Active !== this.accessory.context.Active) {
331
+ let command = '';
332
+ if (this.Fan.Active) {
333
+ command = 'turnOn';
334
+ }
335
+ else {
336
+ command = 'turnOff';
337
+ }
338
+ const bodyChange = JSON.stringify({
339
+ command: `${command}`,
340
+ parameter: 'default',
341
+ commandType: 'command',
342
+ });
343
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
344
+ try {
345
+ const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/commands`, {
346
+ body: bodyChange,
347
+ method: 'POST',
348
+ headers: this.platform.generateHeaders(),
349
+ });
350
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
351
+ const deviceStatus = await body.json();
352
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
353
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
354
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
355
+ if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
356
+ this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
357
+ + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
358
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
359
+ + `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
360
+ }
361
+ else {
362
+ this.statusCode(statusCode);
363
+ this.statusCode(deviceStatus.statusCode);
364
+ }
365
+ }
366
+ catch (e) {
367
+ this.apiError(e);
368
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
369
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
370
+ }
371
+ }
372
+ else {
373
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.`
374
+ + `On: ${this.Fan.Active}, ActiveCached: ${this.accessory.context.Active}`);
375
+ }
376
+ }
377
+ /**
378
+ * Handle requests to set the value of the "On" characteristic
379
+ */
380
+ async ActiveSet(value) {
381
+ if (this.Fan.Active === this.accessory.context.Active) {
382
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Active: ${value}`);
383
+ }
384
+ else {
385
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Active: ${value}`);
386
+ }
387
+ this.Fan.Active = value;
388
+ this.doPlugUpdate.next();
389
+ }
390
+ /**
391
+ * Handle requests to set the value of the "On" characteristic
392
+ */
393
+ async RotationSpeedSet(value) {
394
+ if (this.Fan.RotationSpeed === this.accessory.context.RotationSpeed) {
395
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set RotationSpeed: ${value}`);
396
+ }
397
+ else {
398
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set RotationSpeed: ${value}`);
399
+ }
400
+ this.Fan.RotationSpeed = value;
401
+ this.doPlugUpdate.next();
402
+ }
403
+ /**
404
+ * Handle requests to set the value of the "On" characteristic
405
+ */
406
+ async SwingModeSet(value) {
407
+ if (this.Fan.SwingMode === this.accessory.context.SwingMode) {
408
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set SwingMode: ${value}`);
409
+ }
410
+ else {
411
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set SwingMode: ${value}`);
412
+ }
413
+ this.Fan.SwingMode = value;
414
+ this.doPlugUpdate.next();
415
+ }
416
+ async updateHomeKitCharacteristics() {
417
+ // Active
418
+ if (this.Fan.Active === undefined) {
419
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Fan.Active}`);
420
+ }
421
+ else {
422
+ this.accessory.context.Active = this.Fan.Active;
423
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.Active, this.Fan.Active);
424
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Fan.Active}`);
425
+ }
426
+ // RotationSpeed
427
+ if (this.Fan.RotationSpeed === undefined) {
428
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} RotationSpeed: ${this.Fan.RotationSpeed}`);
429
+ }
430
+ else {
431
+ this.accessory.context.RotationSpeed = this.Fan.RotationSpeed;
432
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.RotationSpeed, this.Fan.RotationSpeed);
433
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic RotationSpeed: ${this.Fan.RotationSpeed}`);
434
+ }
435
+ // SwingMode
436
+ if (this.Fan.SwingMode === undefined) {
437
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} SwingMode: ${this.Fan.SwingMode}`);
438
+ }
439
+ else {
440
+ this.accessory.context.SwingMode = this.Fan.SwingMode;
441
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.SwingMode, this.Fan.SwingMode);
442
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic SwingMode: ${this.Fan.SwingMode}`);
443
+ }
444
+ // BateryLevel
445
+ if (this.Battery.BatteryLevel === undefined) {
446
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
447
+ }
448
+ else {
449
+ this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
450
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
451
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
452
+ }
453
+ // ChargingState
454
+ if (this.Battery.ChargingState === undefined) {
455
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ChargingState: ${this.Battery.ChargingState}`);
456
+ }
457
+ else {
458
+ this.accessory.context.ChargingState = this.Battery.ChargingState;
459
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.ChargingState, this.Battery.ChargingState);
460
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic ChargingState: ${this.Battery.ChargingState}`);
461
+ }
462
+ // StatusLowBattery
463
+ if (this.Battery.StatusLowBattery === undefined) {
464
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
465
+ }
466
+ else {
467
+ this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
468
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
469
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.Battery.StatusLowBattery}`);
470
+ }
471
+ }
472
+ async BLEPushConnection() {
473
+ if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
474
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
475
+ await this.openAPIpushChanges();
476
+ }
477
+ }
478
+ async BLERefreshConnection(switchbot) {
479
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
480
+ + ` ${JSON.stringify(switchbot)}`);
481
+ if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
482
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
483
+ await this.openAPIRefreshStatus();
484
+ }
485
+ }
486
+ async offlineOff() {
487
+ if (this.device.offline) {
488
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
489
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.RotationSpeed, 0);
490
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.SwingMode, this.hap.Characteristic.SwingMode.SWING_DISABLED);
491
+ }
492
+ }
493
+ async apiError(e) {
494
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
495
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.RotationSpeed, e);
496
+ this.Fan.Service.updateCharacteristic(this.hap.Characteristic.SwingMode, e);
497
+ }
498
+ }
499
+ //# sourceMappingURL=fan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.js","sourceRoot":"","sources":["../../src/device/fan.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/device/hub.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAuB,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAW,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAuB,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAEpF,qBAAa,GAAI,SAAQ,UAAU;IAsB/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB;IApBtC,OAAO,CAAC,WAAW,CAAC,CAGlB;IAEF,OAAO,CAAC,cAAc,CAAC,CAGrB;IAEF,OAAO,CAAC,iBAAiB,CAAC,CAGxB;IAGF,mBAAmB,EAAG,OAAO,CAAC;IAC9B,WAAW,EAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAGjB,QAAQ,EAAE,iBAAiB,EACpC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,MAAM,GAAG,aAAa;IAqJ1B,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC7D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C;;OAEG;IAEG,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;IA2E7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,aAAa,CAAC,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM;CAqFxG"}
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/device/hub.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAuB,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAW,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAuB,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAGpF,qBAAa,GAAI,SAAQ,UAAU;IAsB/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB;IApBtC,OAAO,CAAC,WAAW,CAAC,CAGlB;IAEF,OAAO,CAAC,cAAc,CAAC,CAGrB;IAEF,OAAO,CAAC,iBAAiB,CAAC,CAGxB;IAGF,mBAAmB,EAAG,OAAO,CAAC;IAC9B,WAAW,EAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAGjB,QAAQ,EAAE,iBAAiB,EACpC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,MAAM,GAAG,aAAa;IAuJ1B,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC7D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C;;OAEG;IAEG,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;IA2E7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,aAAa,CAAC,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM;CAqFxG"}
@@ -5,6 +5,7 @@
5
5
  import { Subject, interval, skipWhile } from 'rxjs';
6
6
  import { deviceBase } from './device.js';
7
7
  import { Devices } from '../settings.js';
8
+ import { convertUnits } from '../utils.js';
8
9
  export class Hub extends deviceBase {
9
10
  platform;
10
11
  // Services
@@ -120,34 +121,36 @@ export class Hub extends deviceBase {
120
121
  await this.refreshStatus();
121
122
  });
122
123
  //regisiter webhook event handler
123
- if (this.device.webhook) {
124
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
124
+ if (device.webhook) {
125
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
125
126
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
126
127
  try {
127
128
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
128
- if (context.scale === 'CELSIUS') {
129
- const { temperature, humidity, lightLevel } = context;
130
- const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
131
- const { CurrentAmbientLightLevel } = this.LightSensor || { CurrentAmbientLightLevel: undefined };
132
- const { CurrentRelativeHumidity } = this.HumiditySensor || { CurrentRelativeHumidity: undefined };
133
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
134
- '(temperature, humidity, lightLevel) = ' +
135
- `Webhook:(${temperature}, ${humidity}, ${lightLevel}), ` +
136
- `current:(${CurrentTemperature}, ${CurrentRelativeHumidity}, ${CurrentAmbientLightLevel})`);
137
- if (!this.device.hub?.hide_humidity) {
138
- this.HumiditySensor.CurrentRelativeHumidity = humidity;
139
- }
140
- if (!this.device.hub?.hide_temperature) {
141
- this.TemperatureSensor.CurrentTemperature = temperature;
142
- }
143
- if (!this.device.hub?.hide_lightsensor) {
144
- const set_minLux = await this.minLux();
145
- const set_maxLux = await this.maxLux();
146
- const spaceBetweenLevels = 19;
147
- await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
148
- }
149
- this.updateHomeKitCharacteristics();
129
+ const { temperature, humidity, lightLevel } = context;
130
+ const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
131
+ const { CurrentAmbientLightLevel } = this.LightSensor || { CurrentAmbientLightLevel: undefined };
132
+ const { CurrentRelativeHumidity } = this.HumiditySensor || { CurrentRelativeHumidity: undefined };
133
+ if (context.scale !== 'CELCIUS' && device.hub?.convertUnitTo === undefined) {
134
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} received a non-CELCIUS Webhook scale: `
135
+ + `${context.scale}, Use the *convertUnitsTo* config under Hub settings, if displaying incorrectly in HomeKit.`);
150
136
  }
137
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
138
+ '(scale, temperature, humidity, lightLevel) = ' +
139
+ `Webhook:(${context.scale}, ${convertUnits(temperature, context.scale, device.hub?.convertUnitTo)}, ${humidity}, ${lightLevel}), ` +
140
+ `current:(${CurrentTemperature}, ${CurrentRelativeHumidity}, ${CurrentAmbientLightLevel})`);
141
+ if (!this.device.hub?.hide_humidity) {
142
+ this.HumiditySensor.CurrentRelativeHumidity = humidity;
143
+ }
144
+ if (!this.device.hub?.hide_temperature) {
145
+ this.TemperatureSensor.CurrentTemperature = convertUnits(temperature, context.scale, device.hub?.convertUnitTo);
146
+ }
147
+ if (!this.device.hub?.hide_lightsensor) {
148
+ const set_minLux = await this.minLux();
149
+ const set_maxLux = await this.maxLux();
150
+ const spaceBetweenLevels = 19;
151
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
152
+ }
153
+ this.updateHomeKitCharacteristics();
151
154
  }
152
155
  catch (e) {
153
156
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
@@ -185,6 +188,11 @@ export class Hub extends deviceBase {
185
188
  }
186
189
  // FirmwareRevision
187
190
  this.accessory.context.FirmwareRevision = deviceStatus.body.version;
191
+ this.accessory
192
+ .getService(this.hap.Service.AccessoryInformation)
193
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.FirmwareRevision)
194
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
195
+ .updateValue(this.accessory.context.FirmwareRevision);
188
196
  }
189
197
  async refreshStatus() {
190
198
  if (this.BLE) {