@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.61

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