@switchbot/homebridge-switchbot 3.5.0-beta.5 → 3.5.0-beta.51

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 (169) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/config.schema.json +120 -17
  3. package/dist/device/blindtilt.d.ts +21 -94
  4. package/dist/device/blindtilt.d.ts.map +1 -1
  5. package/dist/device/blindtilt.js +352 -757
  6. package/dist/device/blindtilt.js.map +1 -1
  7. package/dist/device/bot.d.ts +25 -71
  8. package/dist/device/bot.d.ts.map +1 -1
  9. package/dist/device/bot.js +588 -761
  10. package/dist/device/bot.js.map +1 -1
  11. package/dist/device/ceilinglight.d.ts +13 -67
  12. package/dist/device/ceilinglight.d.ts.map +1 -1
  13. package/dist/device/ceilinglight.js +214 -588
  14. package/dist/device/ceilinglight.js.map +1 -1
  15. package/dist/device/colorbulb.d.ts +13 -74
  16. package/dist/device/colorbulb.d.ts.map +1 -1
  17. package/dist/device/colorbulb.js +256 -634
  18. package/dist/device/colorbulb.js.map +1 -1
  19. package/dist/device/contact.d.ts +14 -65
  20. package/dist/device/contact.d.ts.map +1 -1
  21. package/dist/device/contact.js +209 -532
  22. package/dist/device/contact.js.map +1 -1
  23. package/dist/device/curtain.d.ts +17 -86
  24. package/dist/device/curtain.d.ts.map +1 -1
  25. package/dist/device/curtain.js +340 -787
  26. package/dist/device/curtain.js.map +1 -1
  27. package/dist/device/device.d.ts +59 -0
  28. package/dist/device/device.d.ts.map +1 -0
  29. package/dist/device/device.js +682 -0
  30. package/dist/device/device.js.map +1 -0
  31. package/dist/device/fan.d.ts +51 -0
  32. package/dist/device/fan.d.ts.map +1 -0
  33. package/dist/device/fan.js +505 -0
  34. package/dist/device/fan.js.map +1 -0
  35. package/dist/device/hub.d.ts +15 -59
  36. package/dist/device/hub.d.ts.map +1 -1
  37. package/dist/device/hub.js +247 -597
  38. package/dist/device/hub.js.map +1 -1
  39. package/dist/device/humidifier.d.ts +10 -65
  40. package/dist/device/humidifier.d.ts.map +1 -1
  41. package/dist/device/humidifier.js +218 -579
  42. package/dist/device/humidifier.js.map +1 -1
  43. package/dist/device/iosensor.d.ts +11 -64
  44. package/dist/device/iosensor.d.ts.map +1 -1
  45. package/dist/device/iosensor.js +179 -585
  46. package/dist/device/iosensor.js.map +1 -1
  47. package/dist/device/lightstrip.d.ts +10 -68
  48. package/dist/device/lightstrip.d.ts.map +1 -1
  49. package/dist/device/lightstrip.js +257 -569
  50. package/dist/device/lightstrip.js.map +1 -1
  51. package/dist/device/lock.d.ts +15 -62
  52. package/dist/device/lock.d.ts.map +1 -1
  53. package/dist/device/lock.js +215 -543
  54. package/dist/device/lock.js.map +1 -1
  55. package/dist/device/meter.d.ts +13 -63
  56. package/dist/device/meter.d.ts.map +1 -1
  57. package/dist/device/meter.js +175 -578
  58. package/dist/device/meter.js.map +1 -1
  59. package/dist/device/meterplus.d.ts +13 -64
  60. package/dist/device/meterplus.d.ts.map +1 -1
  61. package/dist/device/meterplus.js +164 -578
  62. package/dist/device/meterplus.js.map +1 -1
  63. package/dist/device/motion.d.ts +13 -69
  64. package/dist/device/motion.d.ts.map +1 -1
  65. package/dist/device/motion.js +142 -520
  66. package/dist/device/motion.js.map +1 -1
  67. package/dist/device/plug.d.ts +9 -57
  68. package/dist/device/plug.d.ts.map +1 -1
  69. package/dist/device/plug.js +87 -453
  70. package/dist/device/plug.js.map +1 -1
  71. package/dist/device/robotvacuumcleaner.d.ts +11 -62
  72. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  73. package/dist/device/robotvacuumcleaner.js +145 -452
  74. package/dist/device/robotvacuumcleaner.js.map +1 -1
  75. package/dist/device/waterdetector.d.ts +9 -70
  76. package/dist/device/waterdetector.d.ts.map +1 -1
  77. package/dist/device/waterdetector.js +126 -665
  78. package/dist/device/waterdetector.js.map +1 -1
  79. package/dist/homebridge-ui/public/index.html +2 -2
  80. package/dist/index.js +1 -1
  81. package/dist/irdevice/airconditioner.d.ts +8 -48
  82. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  83. package/dist/irdevice/airconditioner.js +309 -419
  84. package/dist/irdevice/airconditioner.js.map +1 -1
  85. package/dist/irdevice/airpurifier.d.ts +7 -38
  86. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  87. package/dist/irdevice/airpurifier.js +72 -304
  88. package/dist/irdevice/airpurifier.js.map +1 -1
  89. package/dist/irdevice/camera.d.ts +6 -35
  90. package/dist/irdevice/camera.d.ts.map +1 -1
  91. package/dist/irdevice/camera.js +34 -278
  92. package/dist/irdevice/camera.js.map +1 -1
  93. package/dist/irdevice/fan.d.ts +6 -39
  94. package/dist/irdevice/fan.d.ts.map +1 -1
  95. package/dist/irdevice/fan.js +67 -311
  96. package/dist/irdevice/fan.js.map +1 -1
  97. package/dist/irdevice/irdevice.d.ts +40 -0
  98. package/dist/irdevice/irdevice.d.ts.map +1 -0
  99. package/dist/irdevice/irdevice.js +512 -0
  100. package/dist/irdevice/irdevice.js.map +1 -0
  101. package/dist/irdevice/light.d.ts +6 -34
  102. package/dist/irdevice/light.d.ts.map +1 -1
  103. package/dist/irdevice/light.js +23 -272
  104. package/dist/irdevice/light.js.map +1 -1
  105. package/dist/irdevice/other.d.ts +18 -47
  106. package/dist/irdevice/other.d.ts.map +1 -1
  107. package/dist/irdevice/other.js +352 -546
  108. package/dist/irdevice/other.js.map +1 -1
  109. package/dist/irdevice/tv.d.ts +7 -39
  110. package/dist/irdevice/tv.d.ts.map +1 -1
  111. package/dist/irdevice/tv.js +82 -321
  112. package/dist/irdevice/tv.js.map +1 -1
  113. package/dist/irdevice/vacuumcleaner.d.ts +6 -35
  114. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  115. package/dist/irdevice/vacuumcleaner.js +41 -284
  116. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  117. package/dist/irdevice/waterheater.d.ts +6 -35
  118. package/dist/irdevice/waterheater.d.ts.map +1 -1
  119. package/dist/irdevice/waterheater.js +42 -287
  120. package/dist/irdevice/waterheater.js.map +1 -1
  121. package/dist/platform.d.ts +14 -1
  122. package/dist/platform.d.ts.map +1 -1
  123. package/dist/platform.js +291 -147
  124. package/dist/platform.js.map +1 -1
  125. package/dist/settings.d.ts +41 -11
  126. package/dist/settings.d.ts.map +1 -1
  127. package/dist/settings.js +0 -552
  128. package/dist/settings.js.map +1 -1
  129. package/dist/utils.d.ts +77 -0
  130. package/dist/utils.d.ts.map +1 -1
  131. package/dist/utils.js +638 -1
  132. package/dist/utils.js.map +1 -1
  133. package/eslint.config.js +87 -0
  134. package/package.json +16 -15
  135. package/src/custom.d.ts +2 -1
  136. package/src/device/blindtilt.ts +378 -783
  137. package/src/device/bot.ts +621 -845
  138. package/src/device/ceilinglight.ts +227 -608
  139. package/src/device/colorbulb.ts +269 -657
  140. package/src/device/contact.ts +235 -555
  141. package/src/device/curtain.ts +360 -811
  142. package/src/device/device.ts +710 -0
  143. package/src/device/fan.ts +554 -0
  144. package/src/device/hub.ts +274 -625
  145. package/src/device/humidifier.ts +246 -624
  146. package/src/device/iosensor.ts +205 -611
  147. package/src/device/lightstrip.ts +278 -597
  148. package/src/device/lock.ts +252 -583
  149. package/src/device/meter.ts +200 -601
  150. package/src/device/meterplus.ts +189 -603
  151. package/src/device/motion.ts +161 -542
  152. package/src/device/plug.ts +97 -481
  153. package/src/device/robotvacuumcleaner.ts +166 -478
  154. package/src/device/waterdetector.ts +143 -689
  155. package/src/homebridge-ui/public/index.html +2 -2
  156. package/src/index.ts +1 -1
  157. package/src/irdevice/airconditioner.ts +330 -446
  158. package/src/irdevice/airpurifier.ts +89 -321
  159. package/src/irdevice/camera.ts +42 -293
  160. package/src/irdevice/fan.ts +78 -327
  161. package/src/irdevice/irdevice.ts +528 -0
  162. package/src/irdevice/light.ts +32 -287
  163. package/src/irdevice/other.ts +396 -615
  164. package/src/irdevice/tv.ts +100 -339
  165. package/src/irdevice/vacuumcleaner.ts +49 -305
  166. package/src/irdevice/waterheater.ts +50 -310
  167. package/src/platform.ts +301 -155
  168. package/src/settings.ts +57 -566
  169. package/src/utils.ts +642 -1
@@ -1,92 +1,62 @@
1
- import asyncmqtt from 'async-mqtt';
2
- import { hostname } from 'os';
3
- import { interval } from 'rxjs';
4
- import { request } from 'undici';
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * hub.ts: @switchbot/homebridge-switchbot.
4
+ */
5
+ import { Subject, interval, skipWhile } from 'rxjs';
6
+ import { deviceBase } from './device.js';
5
7
  import { Devices } from '../settings.js';
6
- export class Hub {
8
+ import { convertUnits } from '../utils.js';
9
+ export class Hub extends deviceBase {
7
10
  platform;
8
- accessory;
9
- device;
10
- api;
11
- log;
12
- config;
13
- hap;
14
11
  // Services
15
- lightSensorService;
16
- humidityService;
17
- temperatureService;
18
- // Characteristic Values
19
- FirmwareRevision;
20
- CurrentTemperature;
21
- CurrentRelativeHumidity;
22
- CurrentAmbientLightLevel;
23
- // OpenAPI Status
24
- OpenAPI_FirmwareRevision;
25
- OpenAPI_CurrentTemperature;
26
- OpenAPI_CurrentRelativeHumidity;
27
- OpenAPI_CurrentAmbientLightLevel;
28
- // OpenAPI Others
29
- spaceBetweenLevels;
30
- //MQTT stuff
31
- mqttClient = null;
32
- // EVE history service handler
33
- historyService;
34
- // Config
35
- set_minStep;
36
- updateRate;
37
- set_minLux;
38
- set_maxLux;
39
- scanDuration;
40
- deviceLogging;
41
- deviceRefreshRate;
42
- // Connection
43
- OpenAPI;
44
- BLE;
12
+ LightSensor;
13
+ HumiditySensor;
14
+ TemperatureSensor;
15
+ // Updates
16
+ hubUpdateInProgress;
17
+ doHubUpdate;
45
18
  constructor(platform, accessory, device) {
19
+ super(platform, accessory, device);
46
20
  this.platform = platform;
47
- this.accessory = accessory;
48
- this.device = device;
49
- this.api = this.platform.api;
50
- this.log = this.platform.log;
51
- this.config = this.platform.config;
52
- this.hap = this.api.hap;
53
- // Connection
54
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
55
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
56
- // default placeholders
57
- this.deviceLogs(device);
58
- this.refreshRate(device);
59
- this.deviceContext();
60
- this.setupHistoryService(device);
61
- this.setupMqtt(device);
62
- this.deviceConfig(device);
63
- this.CurrentRelativeHumidity = accessory.context.CurrentRelativeHumidity;
64
- this.CurrentTemperature = accessory.context.CurrentTemperature;
21
+ // this is subject we use to track when we need to POST changes to the SwitchBot API
22
+ this.doHubUpdate = new Subject();
23
+ this.hubUpdateInProgress = false;
24
+ // Initialize Temperature Sensor property
25
+ if (!device.hub?.hide_temperature) {
26
+ this.TemperatureSensor = {
27
+ Service: accessory.getService(this.hap.Service.TemperatureSensor),
28
+ CurrentTemperature: accessory.context.CurrentTemperature || 0,
29
+ };
30
+ }
31
+ // Initialize Humidity Sensor property
32
+ if (!device.hub?.hide_humidity) {
33
+ this.HumiditySensor = {
34
+ Service: accessory.getService(this.hap.Service.HumiditySensor),
35
+ CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity || 0,
36
+ };
37
+ }
38
+ // Initialize Light Sensor property
39
+ if (!device.hub?.hide_lightsensor) {
40
+ this.LightSensor = {
41
+ Service: accessory.getService(this.hap.Service.LightSensor),
42
+ CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel || 0.0001,
43
+ };
44
+ }
65
45
  // Retrieve initial values and updateHomekit
66
46
  this.refreshStatus();
67
- // set accessory information
68
- accessory
69
- .getService(this.hap.Service.AccessoryInformation)
70
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
71
- .setCharacteristic(this.hap.Characteristic.Model, accessory.context.model)
72
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
73
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
74
47
  // Temperature Sensor Service
75
48
  if (device.hub?.hide_temperature) {
76
49
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
77
- this.temperatureService = this.accessory.getService(this.hap.Service.TemperatureSensor);
78
- accessory.removeService(this.temperatureService);
50
+ this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor);
51
+ accessory.removeService(this.TemperatureSensor.Service);
79
52
  }
80
- else if (!this.temperatureService) {
53
+ else if (!this.TemperatureSensor?.Service) {
81
54
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Temperature Sensor Service`);
82
- const temperatureService = `${accessory.displayName} Temperature Sensor`;
83
- (this.temperatureService = this.accessory.getService(this.hap.Service.TemperatureSensor)
84
- || this.accessory.addService(this.hap.Service.TemperatureSensor)), temperatureService;
85
- this.temperatureService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Temperature Sensor`);
86
- if (!this.temperatureService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
87
- this.temperatureService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Temperature Sensor`);
88
- }
89
- this.temperatureService
55
+ const TemperatureSensorService = `${accessory.displayName} Temperature Sensor`;
56
+ (this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor)
57
+ || this.accessory.addService(this.hap.Service.TemperatureSensor)), TemperatureSensorService;
58
+ this.TemperatureSensor.Service.setCharacteristic(this.hap.Characteristic.Name, TemperatureSensorService);
59
+ this.TemperatureSensor.Service
90
60
  .getCharacteristic(this.hap.Characteristic.CurrentTemperature)
91
61
  .setProps({
92
62
  unit: "celsius" /* Units['CELSIUS'] */,
@@ -96,7 +66,7 @@ export class Hub {
96
66
  minStep: 0.1,
97
67
  })
98
68
  .onGet(() => {
99
- return this.CurrentTemperature;
69
+ return this.TemperatureSensor.CurrentTemperature;
100
70
  });
101
71
  }
102
72
  else {
@@ -105,25 +75,22 @@ export class Hub {
105
75
  // Humidity Sensor Service
106
76
  if (device.hub?.hide_humidity) {
107
77
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Humidity Sensor Service`);
108
- this.humidityService = this.accessory.getService(this.hap.Service.HumiditySensor);
109
- accessory.removeService(this.humidityService);
78
+ this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor);
79
+ accessory.removeService(this.HumiditySensor.Service);
110
80
  }
111
- else if (!this.humidityService) {
81
+ else if (!this.HumiditySensor?.Service) {
112
82
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Humidity Sensor Service`);
113
- const humidityService = `${accessory.displayName} Humidity Sensor`;
114
- (this.humidityService = this.accessory.getService(this.hap.Service.HumiditySensor)
115
- || this.accessory.addService(this.hap.Service.HumiditySensor)), humidityService;
116
- this.humidityService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Humidity Sensor`);
117
- if (!this.humidityService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
118
- this.humidityService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Humidity Sensor`);
119
- }
120
- this.humidityService
83
+ const HumiditySensorService = `${accessory.displayName} Humidity Sensor`;
84
+ (this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor)
85
+ || this.accessory.addService(this.hap.Service.HumiditySensor)), HumiditySensorService;
86
+ this.HumiditySensor.Service.setCharacteristic(this.hap.Characteristic.Name, HumiditySensorService);
87
+ this.HumiditySensor.Service
121
88
  .getCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity)
122
89
  .setProps({
123
90
  minStep: 0.1,
124
91
  })
125
92
  .onGet(() => {
126
- return this.CurrentRelativeHumidity;
93
+ return this.HumiditySensor.CurrentRelativeHumidity;
127
94
  });
128
95
  }
129
96
  else {
@@ -132,16 +99,15 @@ export class Hub {
132
99
  // Light Sensor Service
133
100
  if (device.hub?.hide_lightsensor) {
134
101
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Light Sensor Service`);
135
- this.lightSensorService = this.accessory.getService(this.hap.Service.LightSensor);
136
- accessory.removeService(this.lightSensorService);
102
+ this.LightSensor.Service = this.accessory.getService(this.hap.Service.LightSensor);
103
+ accessory.removeService(this.LightSensor.Service);
137
104
  }
138
- else if (!this.lightSensorService) {
105
+ else if (!this.LightSensor?.Service) {
139
106
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Light Sensor Service`);
140
- const lightSensorService = `${accessory.displayName} Light Sensor`;
141
- (this.lightSensorService = this.accessory.getService(this.hap.Service.LightSensor)
142
- || this.accessory.addService(this.hap.Service.LightSensor)), lightSensorService;
143
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Light Sensor`);
144
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Light Sensor`);
107
+ const LightSensorService = `${accessory.displayName} Light Sensor`;
108
+ (this.LightSensor.Service = this.accessory.getService(this.hap.Service.LightSensor)
109
+ || this.accessory.addService(this.hap.Service.LightSensor)), LightSensorService;
110
+ this.LightSensor.Service.setCharacteristic(this.hap.Characteristic.Name, LightSensorService);
145
111
  }
146
112
  else {
147
113
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Light Sensor Service Not Added`);
@@ -150,112 +116,41 @@ export class Hub {
150
116
  this.updateHomeKitCharacteristics();
151
117
  // Start an update interval
152
118
  interval(this.deviceRefreshRate * 1000)
119
+ .pipe(skipWhile(() => this.hubUpdateInProgress))
153
120
  .subscribe(async () => {
154
121
  await this.refreshStatus();
155
122
  });
156
123
  //regisiter webhook event handler
157
- if (this.device.webhook) {
158
- 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.`);
159
126
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
160
127
  try {
161
128
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
162
- if (context.scale === 'CELSIUS') {
163
- const { temperature, humidity, lightLevel } = context;
164
- const { CurrentTemperature, CurrentRelativeHumidity, CurrentAmbientLightLevel } = this;
165
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
166
- '(temperature, humidity, lightLevel) = ' +
167
- `Webhook:(${temperature}, ${humidity}, ${lightLevel}), ` +
168
- `current:(${CurrentTemperature}, ${CurrentRelativeHumidity}, ${CurrentAmbientLightLevel})`);
169
- this.CurrentRelativeHumidity = humidity;
170
- this.CurrentTemperature = temperature;
171
- this.set_minLux = this.minLux();
172
- this.set_maxLux = this.maxLux();
173
- this.spaceBetweenLevels = 19;
174
- switch (lightLevel) {
175
- case 1:
176
- this.CurrentAmbientLightLevel = this.set_minLux;
177
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
178
- break;
179
- case 2:
180
- this.CurrentAmbientLightLevel = (this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels;
181
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel},` +
182
- ` Calculation: ${(this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels}`);
183
- break;
184
- case 3:
185
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 2;
186
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
187
- break;
188
- case 4:
189
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 3;
190
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
191
- break;
192
- case 5:
193
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 4;
194
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
195
- break;
196
- case 6:
197
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 5;
198
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
199
- break;
200
- case 7:
201
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 6;
202
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
203
- break;
204
- case 8:
205
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 7;
206
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
207
- break;
208
- case 9:
209
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 8;
210
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
211
- break;
212
- case 10:
213
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 9;
214
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
215
- break;
216
- case 11:
217
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 10;
218
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
219
- break;
220
- case 12:
221
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 11;
222
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
223
- break;
224
- case 13:
225
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 12;
226
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
227
- break;
228
- case 14:
229
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 13;
230
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
231
- break;
232
- case 15:
233
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 14;
234
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
235
- break;
236
- case 16:
237
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 15;
238
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
239
- break;
240
- case 17:
241
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 16;
242
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
243
- break;
244
- case 18:
245
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 17;
246
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
247
- break;
248
- case 19:
249
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 18;
250
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
251
- break;
252
- case 20:
253
- default:
254
- this.CurrentAmbientLightLevel = this.set_maxLux;
255
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
256
- }
257
- 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.`);
258
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();
259
154
  }
260
155
  catch (e) {
261
156
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
@@ -264,132 +159,44 @@ export class Hub {
264
159
  };
265
160
  }
266
161
  }
267
- /**
268
- * Parse the device status from the SwitchBot api
269
- */
270
- async parseStatus() {
271
- if (this.BLE) {
272
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE not supported`);
273
- }
274
- else if (this.OpenAPI && this.platform.config.credentials?.token) {
275
- await this.openAPIparseStatus();
276
- }
277
- else {
278
- await this.offlineOff();
279
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
280
- }
281
- }
282
- async openAPIparseStatus() {
162
+ async openAPIparseStatus(deviceStatus) {
283
163
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
284
164
  // CurrentRelativeHumidity
285
165
  if (!this.device.hub?.hide_humidity) {
286
- this.CurrentRelativeHumidity = Number(this.OpenAPI_CurrentRelativeHumidity);
287
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.CurrentRelativeHumidity}%`);
166
+ this.HumiditySensor.CurrentRelativeHumidity = Number(deviceStatus.body.humidity);
167
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
288
168
  }
289
169
  // CurrentTemperature
290
170
  if (!this.device.hub?.hide_temperature) {
291
- this.CurrentTemperature = Number(this.OpenAPI_CurrentTemperature);
292
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.CurrentTemperature}°c`);
171
+ this.TemperatureSensor.CurrentTemperature = Number(deviceStatus.body.temperature);
172
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
293
173
  }
294
174
  // Brightness
295
175
  if (!this.device.hub?.hide_lightsensor) {
296
176
  if (!this.device.curtain?.hide_lightsensor) {
297
- this.set_minLux = this.minLux();
298
- this.set_maxLux = this.maxLux();
299
- this.spaceBetweenLevels = 19;
300
- switch (this.OpenAPI_CurrentAmbientLightLevel) {
301
- case 1:
302
- this.CurrentAmbientLightLevel = this.set_minLux;
303
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
304
- break;
305
- case 2:
306
- this.CurrentAmbientLightLevel = (this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels;
307
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel},` +
308
- ` Calculation: ${(this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels}`);
309
- break;
310
- case 3:
311
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 2;
312
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
313
- break;
314
- case 4:
315
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 3;
316
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
317
- break;
318
- case 5:
319
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 4;
320
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
321
- break;
322
- case 6:
323
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 5;
324
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
325
- break;
326
- case 7:
327
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 6;
328
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
329
- break;
330
- case 8:
331
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 7;
332
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
333
- break;
334
- case 9:
335
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 8;
336
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
337
- break;
338
- case 10:
339
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 9;
340
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
341
- break;
342
- case 11:
343
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 10;
344
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
345
- break;
346
- case 12:
347
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 11;
348
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
349
- break;
350
- case 13:
351
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 12;
352
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
353
- break;
354
- case 14:
355
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 13;
356
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
357
- break;
358
- case 15:
359
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 14;
360
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
361
- break;
362
- case 16:
363
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 15;
364
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
365
- break;
366
- case 17:
367
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 16;
368
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
369
- break;
370
- case 18:
371
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 17;
372
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
373
- break;
374
- case 19:
375
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 18;
376
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
377
- break;
378
- case 20:
379
- default:
380
- this.CurrentAmbientLightLevel = this.set_maxLux;
381
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel}`);
382
- }
383
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel},` +
384
- ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
177
+ const set_minLux = await this.minLux();
178
+ const set_maxLux = await this.maxLux();
179
+ const spaceBetweenLevels = 19;
180
+ const lightLevel = deviceStatus.body.lightLevel;
181
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
182
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${deviceStatus.body.lightLevel},` +
183
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
385
184
  }
386
185
  if (!this.device.hub?.hide_lightsensor) {
387
- this.lightSensorService?.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
186
+ this.LightSensor.Service.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
388
187
  }
389
188
  }
390
- // FirmwareRevision
391
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
392
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
189
+ // Firmware Version
190
+ const version = deviceStatus.body.version?.toString();
191
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
192
+ if (deviceStatus.body.version) {
193
+ this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
194
+ this.accessory
195
+ .getService(this.hap.Service.AccessoryInformation)
196
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
197
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
198
+ .updateValue(this.accessory.context.version);
199
+ }
393
200
  }
394
201
  async refreshStatus() {
395
202
  if (this.BLE) {
@@ -406,7 +213,7 @@ export class Hub {
406
213
  async openAPIRefreshStatus() {
407
214
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
408
215
  try {
409
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
216
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, {
410
217
  headers: this.platform.generateHeaders(),
411
218
  });
412
219
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
@@ -414,13 +221,9 @@ export class Hub {
414
221
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
415
222
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
416
223
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
417
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
224
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
418
225
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
419
- this.OpenAPI_CurrentTemperature = deviceStatus.body.temperature;
420
- this.OpenAPI_CurrentRelativeHumidity = deviceStatus.body.humidity;
421
- this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.lightLevel;
422
- this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
423
- this.openAPIparseStatus();
226
+ this.openAPIparseStatus(deviceStatus);
424
227
  this.updateHomeKitCharacteristics();
425
228
  }
426
229
  else {
@@ -442,352 +245,199 @@ export class Hub {
442
245
  const entry = { time: Math.round(new Date().valueOf() / 1000) };
443
246
  // CurrentRelativeHumidity
444
247
  if (!this.device.hub?.hide_humidity) {
445
- if (this.CurrentRelativeHumidity === undefined) {
446
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
248
+ if (this.HumiditySensor.CurrentRelativeHumidity === undefined) {
249
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
250
+ + ` CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
447
251
  }
448
252
  else {
449
253
  if (this.device.mqttURL) {
450
- mqttmessage.push(`"humidity": ${this.CurrentRelativeHumidity}`);
254
+ mqttmessage.push(`"humidity": ${this.HumiditySensor.CurrentRelativeHumidity}`);
451
255
  }
452
256
  if (this.device.history) {
453
- entry['humidity'] = this.CurrentRelativeHumidity;
257
+ entry['humidity'] = this.HumiditySensor.CurrentRelativeHumidity;
454
258
  }
455
- this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
456
- this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.CurrentRelativeHumidity);
259
+ this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor.CurrentRelativeHumidity;
260
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.HumiditySensor.CurrentRelativeHumidity);
457
261
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
458
- + `updateCharacteristic CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
262
+ + `updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
459
263
  }
460
264
  }
461
265
  // CurrentTemperature
462
266
  if (!this.device.hub?.hide_temperature) {
463
- if (this.CurrentTemperature === undefined) {
464
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
267
+ if (this.TemperatureSensor.CurrentTemperature === undefined) {
268
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
465
269
  }
466
270
  else {
467
271
  if (this.device.mqttURL) {
468
- mqttmessage.push(`"temperature": ${this.CurrentTemperature}`);
272
+ mqttmessage.push(`"temperature": ${this.TemperatureSensor.CurrentTemperature}`);
469
273
  }
470
274
  if (this.device.history) {
471
- entry['temp'] = this.CurrentTemperature;
275
+ entry['temp'] = this.TemperatureSensor.CurrentTemperature;
472
276
  }
473
- this.accessory.context.CurrentTemperature = this.CurrentTemperature;
474
- this.temperatureService?.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.CurrentTemperature);
475
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic CurrentTemperature: ${this.CurrentTemperature}`);
277
+ this.accessory.context.CurrentTemperature = this.TemperatureSensor.CurrentTemperature;
278
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor.CurrentTemperature);
279
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
280
+ + ` CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
476
281
  }
477
282
  }
478
283
  // CurrentAmbientLightLevel
479
284
  if (!this.device.hub?.hide_lightsensor) {
480
- if (this.CurrentAmbientLightLevel === undefined) {
481
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
285
+ if (this.LightSensor.CurrentAmbientLightLevel === undefined) {
286
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
287
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
482
288
  }
483
289
  else {
484
290
  if (this.device.mqttURL) {
485
- mqttmessage.push(`"light": ${this.CurrentAmbientLightLevel}`);
291
+ mqttmessage.push(`"light": ${this.LightSensor.CurrentAmbientLightLevel}`);
486
292
  }
487
293
  if (this.device.history) {
488
- entry['lux'] = this.CurrentAmbientLightLevel;
294
+ entry['lux'] = this.LightSensor.CurrentAmbientLightLevel;
489
295
  }
490
- this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
491
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
296
+ this.accessory.context.CurrentAmbientLightLevel = this.LightSensor.CurrentAmbientLightLevel;
297
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
492
298
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
493
- + `updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
299
+ + `updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
494
300
  }
495
301
  }
496
302
  // MQTT
497
303
  if (this.device.mqttURL) {
498
304
  this.mqttPublish(`{${mqttmessage.join(',')}}`);
499
305
  }
500
- if (Number(this.CurrentRelativeHumidity) > 0) {
306
+ if (Number(this.HumiditySensor.CurrentRelativeHumidity) > 0) {
501
307
  // reject unreliable data
502
308
  if (this.device.history) {
503
309
  this.historyService?.addEntry(entry);
504
310
  }
505
311
  }
506
312
  }
507
- /*
508
- * Publish MQTT message for topics of
509
- * 'homebridge-switchbot/meter/xx:xx:xx:xx:xx:xx'
510
- */
511
- mqttPublish(message) {
512
- const mac = this.device.deviceId
513
- ?.toLowerCase()
514
- .match(/[\s\S]{1,2}/g)
515
- ?.join(':');
516
- const options = this.device.mqttPubOptions || {};
517
- this.mqttClient?.publish(`homebridge-switchbot/hub/${mac}`, `${message}`, options);
518
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT message: ${message} options:${JSON.stringify(options)}`);
519
- }
520
- /*
521
- * Setup MQTT hadler if URL is specified.
522
- */
523
- async setupMqtt(device) {
524
- if (device.mqttURL) {
525
- try {
526
- const { connectAsync } = asyncmqtt;
527
- this.mqttClient = await connectAsync(device.mqttURL, device.mqttOptions || {});
528
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT connection has been established successfully.`);
529
- this.mqttClient.on('error', (e) => {
530
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to publish MQTT messages. ${e}`);
531
- });
313
+ async offlineOff() {
314
+ if (this.device.offline) {
315
+ if (!this.device.hub?.hide_temperature) {
316
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.accessory.context.CurrentTemperature);
317
+ }
318
+ if (!this.device.hub?.hide_humidity) {
319
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.accessory.context.CurrentRelativeHumidity);
532
320
  }
533
- catch (e) {
534
- this.mqttClient = null;
535
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to establish MQTT connection. ${e}`);
321
+ if (!this.device.hub?.hide_lightsensor) {
322
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.accessory.context.CurrentAmbientLightLevel);
536
323
  }
537
324
  }
538
325
  }
539
- /*
540
- * Setup EVE history graph feature if enabled.
541
- */
542
- async setupHistoryService(device) {
543
- const mac = this.device
544
- .deviceId.match(/.{1,2}/g)
545
- .join(':')
546
- .toLowerCase();
547
- this.historyService = device.history
548
- ? new this.platform.fakegatoAPI('custom', this.accessory, {
549
- log: this.platform.log,
550
- storage: 'fs',
551
- filename: `${hostname().split('.')[0]}_${mac}_persist.json`,
552
- })
553
- : null;
326
+ async apiError(e) {
327
+ if (!this.device.hub?.hide_temperature) {
328
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
329
+ }
330
+ if (!this.device.hub?.hide_humidity) {
331
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
332
+ }
333
+ if (!this.device.hub?.hide_lightsensor) {
334
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
335
+ }
554
336
  }
555
- async statusCode(statusCode) {
556
- switch (statusCode) {
557
- case 151:
558
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
337
+ async minLux() {
338
+ let set_minLux;
339
+ if (this.device.curtain?.set_minLux) {
340
+ set_minLux = this.device.curtain?.set_minLux;
341
+ }
342
+ else {
343
+ set_minLux = 1;
344
+ }
345
+ return set_minLux;
346
+ }
347
+ async maxLux() {
348
+ let set_maxLux;
349
+ if (this.device.curtain?.set_maxLux) {
350
+ set_maxLux = this.device.curtain?.set_maxLux;
351
+ }
352
+ else {
353
+ set_maxLux = 6001;
354
+ }
355
+ return set_maxLux;
356
+ }
357
+ async getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels) {
358
+ switch (lightLevel) {
359
+ case 1:
360
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
361
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
362
+ break;
363
+ case 2:
364
+ this.LightSensor.CurrentAmbientLightLevel = (set_maxLux - set_minLux) / spaceBetweenLevels;
365
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel},` +
366
+ ` Calculation: ${(set_maxLux - set_minLux) / spaceBetweenLevels}`);
367
+ break;
368
+ case 3:
369
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 2;
370
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
559
371
  break;
560
- case 152:
561
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
372
+ case 4:
373
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 3;
374
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
562
375
  break;
563
- case 160:
564
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
376
+ case 5:
377
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 4;
378
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
565
379
  break;
566
- case 161:
567
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
568
- this.offlineOff();
380
+ case 6:
381
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 5;
382
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
569
383
  break;
570
- case 171:
571
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
572
- `Hub: ${this.device.hubDeviceId}`);
573
- this.offlineOff();
384
+ case 7:
385
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 6;
386
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
574
387
  break;
575
- case 190:
576
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
577
- ` Or command format is invalid, statusCode: ${statusCode}`);
388
+ case 8:
389
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 7;
390
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
578
391
  break;
579
- case 100:
580
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
392
+ case 9:
393
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 8;
394
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
581
395
  break;
582
- case 200:
583
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
396
+ case 10:
397
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 9;
398
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
584
399
  break;
585
- case 400:
586
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
587
- + `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
400
+ case 11:
401
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 10;
402
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
588
403
  break;
589
- case 401:
590
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
591
- + `but the request has not been authenticated, statusCode: ${statusCode}`);
404
+ case 12:
405
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 11;
406
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
592
407
  break;
593
- case 403:
594
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
595
- + `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
408
+ case 13:
409
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 12;
410
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
596
411
  break;
597
- case 404:
598
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
599
- + `statusCode: ${statusCode}`);
412
+ case 14:
413
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 13;
414
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
600
415
  break;
601
- case 406:
602
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
603
- + `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
416
+ case 15:
417
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 14;
418
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
604
419
  break;
605
- case 415:
606
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
607
- + `header that is not supported by the server, statusCode: ${statusCode}`);
420
+ case 16:
421
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 15;
422
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
608
423
  break;
609
- case 422:
610
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
611
- + `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
424
+ case 17:
425
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 16;
426
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
612
427
  break;
613
- case 429:
614
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
615
- + `requests allowed for a given time window, statusCode: ${statusCode}`);
428
+ case 18:
429
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 17;
430
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
616
431
  break;
617
- case 500:
618
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
619
- + `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
432
+ case 19:
433
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 18;
434
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
620
435
  break;
436
+ case 20:
621
437
  default:
622
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
623
- `${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
624
- }
625
- }
626
- async offlineOff() {
627
- if (this.device.offline) {
628
- await this.deviceContext();
629
- await this.updateHomeKitCharacteristics();
438
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
439
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
630
440
  }
631
441
  }
632
- async apiError(e) {
633
- if (!this.device.hub?.hide_temperature) {
634
- this.temperatureService?.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
635
- }
636
- if (!this.device.hub?.hide_humidity) {
637
- this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
638
- }
639
- if (!this.device.hub?.hide_lightsensor) {
640
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
641
- }
642
- }
643
- minLux() {
644
- if (this.device.curtain?.set_minLux) {
645
- this.set_minLux = this.device.curtain?.set_minLux;
646
- }
647
- else {
648
- this.set_minLux = 1;
649
- }
650
- return this.set_minLux;
651
- }
652
- maxLux() {
653
- if (this.device.curtain?.set_maxLux) {
654
- this.set_maxLux = this.device.curtain?.set_maxLux;
655
- }
656
- else {
657
- this.set_maxLux = 6001;
658
- }
659
- return this.set_maxLux;
660
- }
661
- async deviceContext() {
662
- if (this.CurrentRelativeHumidity === undefined) {
663
- this.CurrentRelativeHumidity = 0;
664
- }
665
- else {
666
- this.CurrentRelativeHumidity = this.accessory.context.CurrentRelativeHumidity;
667
- }
668
- if (this.CurrentTemperature === undefined) {
669
- this.CurrentTemperature = 0;
670
- }
671
- else {
672
- this.CurrentTemperature = this.accessory.context.CurrentTemperature;
673
- }
674
- if (this.CurrentAmbientLightLevel === undefined) {
675
- this.CurrentAmbientLightLevel = this.set_minLux;
676
- }
677
- else {
678
- this.CurrentAmbientLightLevel = this.accessory.context.CurrentAmbientLightLevel;
679
- }
680
- if (this.FirmwareRevision === undefined) {
681
- this.FirmwareRevision = this.platform.version;
682
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
683
- }
684
- }
685
- async refreshRate(device) {
686
- // refreshRate
687
- if (device.refreshRate) {
688
- this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
689
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
690
- }
691
- else if (this.platform.config.options.refreshRate) {
692
- this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
693
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
694
- }
695
- // updateRate
696
- if (device?.curtain?.updateRate) {
697
- this.updateRate = device?.curtain?.updateRate;
698
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Curtain updateRate: ${this.updateRate}`);
699
- }
700
- else {
701
- this.updateRate = 7;
702
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default Curtain updateRate: ${this.updateRate}`);
703
- }
704
- }
705
- async deviceConfig(device) {
706
- let config = {};
707
- if (device.hub) {
708
- config = device.hub;
709
- }
710
- if (device.connectionType !== undefined) {
711
- config['connectionType'] = device.connectionType;
712
- }
713
- if (device.external !== undefined) {
714
- config['external'] = device.external;
715
- }
716
- if (device.logging !== undefined) {
717
- config['logging'] = device.logging;
718
- }
719
- if (device.refreshRate !== undefined) {
720
- config['refreshRate'] = device.refreshRate;
721
- }
722
- if (device.webhook !== undefined) {
723
- config['webhook'] = device.webhook;
724
- }
725
- if (Object.entries(config).length !== 0) {
726
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
727
- }
728
- }
729
- async deviceLogs(device) {
730
- if (this.platform.debugMode) {
731
- this.deviceLogging = this.accessory.context.logging = 'debugMode';
732
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
733
- }
734
- else if (device.logging) {
735
- this.deviceLogging = this.accessory.context.logging = device.logging;
736
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
737
- }
738
- else if (this.platform.config.options?.logging) {
739
- this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
740
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
741
- }
742
- else {
743
- this.deviceLogging = this.accessory.context.logging = 'standard';
744
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
745
- }
746
- }
747
- /**
748
- * Logging for Device
749
- */
750
- infoLog(...log) {
751
- if (this.enablingDeviceLogging()) {
752
- this.platform.log.info(String(...log));
753
- }
754
- }
755
- warnLog(...log) {
756
- if (this.enablingDeviceLogging()) {
757
- this.platform.log.warn(String(...log));
758
- }
759
- }
760
- debugWarnLog(...log) {
761
- if (this.enablingDeviceLogging()) {
762
- if (this.deviceLogging?.includes('debug')) {
763
- this.platform.log.warn('[DEBUG]', String(...log));
764
- }
765
- }
766
- }
767
- errorLog(...log) {
768
- if (this.enablingDeviceLogging()) {
769
- this.platform.log.error(String(...log));
770
- }
771
- }
772
- debugErrorLog(...log) {
773
- if (this.enablingDeviceLogging()) {
774
- if (this.deviceLogging?.includes('debug')) {
775
- this.platform.log.error('[DEBUG]', String(...log));
776
- }
777
- }
778
- }
779
- debugLog(...log) {
780
- if (this.enablingDeviceLogging()) {
781
- if (this.deviceLogging === 'debug') {
782
- this.platform.log.info('[DEBUG]', String(...log));
783
- }
784
- else {
785
- this.platform.log.debug(String(...log));
786
- }
787
- }
788
- }
789
- enablingDeviceLogging() {
790
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
791
- }
792
442
  }
793
443
  //# sourceMappingURL=hub.js.map