@switchbot/homebridge-switchbot 3.5.0-beta.9 → 3.5.0

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 (178) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/CHANGELOG.md +4 -1
  3. package/config.schema.json +166 -24
  4. package/dist/device/blindtilt.d.ts +21 -96
  5. package/dist/device/blindtilt.d.ts.map +1 -1
  6. package/dist/device/blindtilt.js +439 -817
  7. package/dist/device/blindtilt.js.map +1 -1
  8. package/dist/device/bot.d.ts +27 -72
  9. package/dist/device/bot.d.ts.map +1 -1
  10. package/dist/device/bot.js +835 -865
  11. package/dist/device/bot.js.map +1 -1
  12. package/dist/device/ceilinglight.d.ts +15 -69
  13. package/dist/device/ceilinglight.d.ts.map +1 -1
  14. package/dist/device/ceilinglight.js +287 -653
  15. package/dist/device/ceilinglight.js.map +1 -1
  16. package/dist/device/colorbulb.d.ts +15 -76
  17. package/dist/device/colorbulb.d.ts.map +1 -1
  18. package/dist/device/colorbulb.js +354 -732
  19. package/dist/device/colorbulb.js.map +1 -1
  20. package/dist/device/contact.d.ts +14 -66
  21. package/dist/device/contact.d.ts.map +1 -1
  22. package/dist/device/contact.js +268 -576
  23. package/dist/device/contact.js.map +1 -1
  24. package/dist/device/curtain.d.ts +18 -89
  25. package/dist/device/curtain.d.ts.map +1 -1
  26. package/dist/device/curtain.js +431 -851
  27. package/dist/device/curtain.js.map +1 -1
  28. package/dist/device/device.d.ts +60 -0
  29. package/dist/device/device.d.ts.map +1 -0
  30. package/dist/device/device.js +739 -0
  31. package/dist/device/device.js.map +1 -0
  32. package/dist/device/fan.d.ts +63 -0
  33. package/dist/device/fan.d.ts.map +1 -0
  34. package/dist/device/fan.js +698 -0
  35. package/dist/device/fan.js.map +1 -0
  36. package/dist/device/hub.d.ts +15 -60
  37. package/dist/device/hub.d.ts.map +1 -1
  38. package/dist/device/hub.js +257 -631
  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 +266 -629
  43. package/dist/device/humidifier.js.map +1 -1
  44. package/dist/device/iosensor.d.ts +12 -64
  45. package/dist/device/iosensor.d.ts.map +1 -1
  46. package/dist/device/iosensor.js +215 -615
  47. package/dist/device/iosensor.js.map +1 -1
  48. package/dist/device/lightstrip.d.ts +12 -70
  49. package/dist/device/lightstrip.d.ts.map +1 -1
  50. package/dist/device/lightstrip.js +336 -645
  51. package/dist/device/lightstrip.js.map +1 -1
  52. package/dist/device/lock.d.ts +17 -63
  53. package/dist/device/lock.d.ts.map +1 -1
  54. package/dist/device/lock.js +290 -595
  55. package/dist/device/lock.js.map +1 -1
  56. package/dist/device/meter.d.ts +15 -64
  57. package/dist/device/meter.d.ts.map +1 -1
  58. package/dist/device/meter.js +211 -608
  59. package/dist/device/meter.js.map +1 -1
  60. package/dist/device/meterplus.d.ts +15 -65
  61. package/dist/device/meterplus.d.ts.map +1 -1
  62. package/dist/device/meterplus.js +205 -615
  63. package/dist/device/meterplus.js.map +1 -1
  64. package/dist/device/motion.d.ts +12 -69
  65. package/dist/device/motion.d.ts.map +1 -1
  66. package/dist/device/motion.js +202 -563
  67. package/dist/device/motion.js.map +1 -1
  68. package/dist/device/plug.d.ts +10 -57
  69. package/dist/device/plug.d.ts.map +1 -1
  70. package/dist/device/plug.js +125 -484
  71. package/dist/device/plug.js.map +1 -1
  72. package/dist/device/robotvacuumcleaner.d.ts +13 -63
  73. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  74. package/dist/device/robotvacuumcleaner.js +233 -549
  75. package/dist/device/robotvacuumcleaner.js.map +1 -1
  76. package/dist/device/waterdetector.d.ts +11 -63
  77. package/dist/device/waterdetector.d.ts.map +1 -1
  78. package/dist/device/waterdetector.js +170 -493
  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 +10 -50
  88. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  89. package/dist/irdevice/airconditioner.js +340 -468
  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 +105 -319
  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 +44 -285
  98. package/dist/irdevice/camera.js.map +1 -1
  99. package/dist/irdevice/fan.d.ts +7 -43
  100. package/dist/irdevice/fan.d.ts.map +1 -1
  101. package/dist/irdevice/fan.js +92 -350
  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 +369 -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 +118 -362
  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 +438 -570
  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 +91 -339
  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 +45 -285
  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 +47 -291
  126. package/dist/irdevice/waterheater.js.map +1 -1
  127. package/dist/platform.d.ts +22 -8
  128. package/dist/platform.d.ts.map +1 -1
  129. package/dist/platform.js +342 -191
  130. package/dist/platform.js.map +1 -1
  131. package/dist/settings.d.ts +64 -17
  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 +20 -16
  141. package/src/custom.d.ts +2 -1
  142. package/src/device/blindtilt.ts +472 -888
  143. package/src/device/bot.ts +893 -968
  144. package/src/device/ceilinglight.ts +304 -709
  145. package/src/device/colorbulb.ts +370 -803
  146. package/src/device/contact.ts +301 -611
  147. package/src/device/curtain.ts +460 -908
  148. package/src/device/device.ts +755 -0
  149. package/src/device/fan.ts +749 -0
  150. package/src/device/hub.ts +294 -664
  151. package/src/device/humidifier.ts +299 -696
  152. package/src/device/iosensor.ts +251 -644
  153. package/src/device/lightstrip.ts +362 -712
  154. package/src/device/lock.ts +328 -653
  155. package/src/device/meter.ts +247 -637
  156. package/src/device/meterplus.ts +240 -644
  157. package/src/device/motion.ts +230 -598
  158. package/src/device/plug.ts +139 -525
  159. package/src/device/robotvacuumcleaner.ts +258 -593
  160. package/src/device/waterdetector.ts +191 -522
  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 +370 -527
  165. package/src/irdevice/airpurifier.ts +132 -356
  166. package/src/irdevice/camera.ts +58 -311
  167. package/src/irdevice/fan.ts +109 -379
  168. package/src/irdevice/irdevice.ts +382 -0
  169. package/src/irdevice/light.ts +157 -412
  170. package/src/irdevice/other.ts +507 -648
  171. package/src/irdevice/tv.ts +121 -375
  172. package/src/irdevice/vacuumcleaner.ts +59 -311
  173. package/src/irdevice/waterheater.ts +61 -320
  174. package/src/platform.ts +395 -259
  175. package/src/settings.ts +118 -609
  176. package/src/utils.ts +642 -1
  177. package/.github/npm-version-script.cjs +0 -81
  178. package/src/device/waterdetector.json +0 -11
@@ -1,92 +1,41 @@
1
- import asyncmqtt from 'async-mqtt';
2
- import { hostname } from 'os';
3
- import { interval } from 'rxjs';
4
- import { request } from 'undici';
1
+ import { deviceBase } from './device.js';
5
2
  import { Devices } from '../settings.js';
6
- export class Hub {
3
+ import { convertUnits } from '../utils.js';
4
+ import { Subject, interval, skipWhile } from 'rxjs';
5
+ export class Hub extends deviceBase {
7
6
  platform;
8
- accessory;
9
- device;
10
- api;
11
- log;
12
- config;
13
- hap;
14
7
  // 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;
8
+ LightSensor;
9
+ HumiditySensor;
10
+ TemperatureSensor;
11
+ // Updates
12
+ hubUpdateInProgress;
13
+ doHubUpdate;
45
14
  constructor(platform, accessory, device) {
15
+ super(platform, accessory, device);
46
16
  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;
65
- // Retrieve initial values and updateHomekit
66
- 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
- // Temperature Sensor Service
17
+ // this is subject we use to track when we need to POST changes to the SwitchBot API
18
+ this.doHubUpdate = new Subject();
19
+ this.hubUpdateInProgress = false;
20
+ // Initialize Temperature Sensor Service
75
21
  if (device.hub?.hide_temperature) {
76
- 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);
79
- }
80
- else if (!this.temperatureService) {
81
- 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`);
22
+ if (this.TemperatureSensor) {
23
+ this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
24
+ this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor);
25
+ accessory.removeService(this.TemperatureSensor.Service);
88
26
  }
89
- this.temperatureService
27
+ }
28
+ else {
29
+ accessory.context.TemperatureSensor = accessory.context.TemperatureSensor ?? {};
30
+ this.TemperatureSensor = {
31
+ Name: accessory.context.TemperatureSensor.Name ?? `${accessory.displayName} Temperature Sensor`,
32
+ Service: accessory.getService(this.hap.Service.TemperatureSensor) ?? this.accessory.addService(this.hap.Service.TemperatureSensor),
33
+ CurrentTemperature: accessory.context.CurrentTemperature ?? 0,
34
+ };
35
+ accessory.context.TemperatureSensor = this.TemperatureSensor;
36
+ // Initialize Temperature Sensor Characteristic
37
+ this.TemperatureSensor.Service
38
+ .setCharacteristic(this.hap.Characteristic.Name, this.TemperatureSensor.Name)
90
39
  .getCharacteristic(this.hap.Characteristic.CurrentTemperature)
91
40
  .setProps({
92
41
  unit: "celsius" /* Units['CELSIUS'] */,
@@ -96,300 +45,117 @@ export class Hub {
96
45
  minStep: 0.1,
97
46
  })
98
47
  .onGet(() => {
99
- return this.CurrentTemperature;
48
+ return this.TemperatureSensor.CurrentTemperature;
100
49
  });
101
50
  }
102
- else {
103
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Temperature Sensor Service Not Added`);
104
- }
105
- // Humidity Sensor Service
51
+ // Initialize Humidity Sensor Service
106
52
  if (device.hub?.hide_humidity) {
107
- 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);
110
- }
111
- else if (!this.humidityService) {
112
- 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`);
53
+ if (this.HumiditySensor) {
54
+ this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Humidity Sensor Service`);
55
+ this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor);
56
+ accessory.removeService(this.HumiditySensor.Service);
119
57
  }
120
- this.humidityService
58
+ }
59
+ else {
60
+ accessory.context.HumiditySensor = accessory.context.HumiditySensor ?? {};
61
+ this.HumiditySensor = {
62
+ Name: accessory.context.HumiditySensor.Name ?? `${accessory.displayName} Humidity Sensor`,
63
+ Service: accessory.getService(this.hap.Service.HumiditySensor) ?? this.accessory.addService(this.hap.Service.HumiditySensor),
64
+ CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity ?? 0,
65
+ };
66
+ accessory.context.HumiditySensor = this.HumiditySensor;
67
+ // Initialize Humidity Sensor Characteristics
68
+ this.HumiditySensor.Service
69
+ .setCharacteristic(this.hap.Characteristic.Name, this.HumiditySensor.Name)
121
70
  .getCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity)
122
71
  .setProps({
123
72
  minStep: 0.1,
124
73
  })
125
74
  .onGet(() => {
126
- return this.CurrentRelativeHumidity;
75
+ return this.HumiditySensor.CurrentRelativeHumidity;
127
76
  });
128
77
  }
129
- else {
130
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Humidity Sensor Service Not Added`);
131
- }
132
- // Light Sensor Service
78
+ // Initialize Light Sensor Service
133
79
  if (device.hub?.hide_lightsensor) {
134
- 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);
137
- }
138
- else if (!this.lightSensorService) {
139
- 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`);
80
+ if (this.LightSensor) {
81
+ this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Light Sensor Service`);
82
+ this.LightSensor.Service = this.accessory.getService(this.hap.Service.LightSensor);
83
+ accessory.removeService(this.LightSensor.Service);
84
+ }
145
85
  }
146
86
  else {
147
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Light Sensor Service Not Added`);
87
+ accessory.context.LightSensor = accessory.context.LightSensor ?? {};
88
+ this.LightSensor = {
89
+ Name: accessory.context.LightSensor.Name ?? `${accessory.displayName} Light Sensor`,
90
+ Service: accessory.getService(this.hap.Service.LightSensor) ?? this.accessory.addService(this.hap.Service.LightSensor),
91
+ CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel ?? 0.0001,
92
+ };
93
+ accessory.context.LightSensor = this.LightSensor;
94
+ // Initialize Light Sensor Characteristics
95
+ this.LightSensor.Service
96
+ .setCharacteristic(this.hap.Characteristic.Name, this.LightSensor.Name)
97
+ .getCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel)
98
+ .setProps({
99
+ minStep: 1,
100
+ })
101
+ .onGet(() => {
102
+ return this.LightSensor.CurrentAmbientLightLevel;
103
+ });
148
104
  }
105
+ // Retrieve initial values and updateHomekit
106
+ this.refreshStatus();
149
107
  // Retrieve initial values and update Homekit
150
108
  this.updateHomeKitCharacteristics();
151
109
  // Start an update interval
152
110
  interval(this.deviceRefreshRate * 1000)
111
+ .pipe(skipWhile(() => this.hubUpdateInProgress))
153
112
  .subscribe(async () => {
154
113
  await this.refreshStatus();
155
114
  });
156
115
  //regisiter webhook event handler
157
- if (this.device.webhook) {
158
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
159
- this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
160
- try {
161
- 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();
258
- }
259
- }
260
- catch (e) {
261
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
262
- + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
263
- }
264
- };
265
- }
266
- }
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
- }
116
+ this.registerWebhook(accessory, device);
281
117
  }
282
- async openAPIparseStatus() {
118
+ async openAPIparseStatus(deviceStatus) {
283
119
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
284
120
  // CurrentRelativeHumidity
285
121
  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}%`);
122
+ this.HumiditySensor.CurrentRelativeHumidity = Number(deviceStatus.body.humidity);
123
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
288
124
  }
289
125
  // CurrentTemperature
290
126
  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`);
127
+ this.TemperatureSensor.CurrentTemperature = Number(deviceStatus.body.temperature);
128
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
293
129
  }
294
130
  // Brightness
295
131
  if (!this.device.hub?.hide_lightsensor) {
296
132
  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}`);
133
+ const set_minLux = this.device.curtain?.set_minLux ?? 1;
134
+ const set_maxLux = this.device.curtain?.set_maxLux ?? 6001;
135
+ const spaceBetweenLevels = 19;
136
+ const lightLevel = deviceStatus.body.lightLevel;
137
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
138
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${deviceStatus.body.lightLevel},`
139
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
385
140
  }
386
141
  if (!this.device.hub?.hide_lightsensor) {
387
- this.lightSensorService?.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
142
+ this.LightSensor.Service.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
388
143
  }
389
144
  }
390
- // FirmwareRevision
391
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
392
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
145
+ // Firmware Version
146
+ const version = deviceStatus.body.version?.toString();
147
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
148
+ if (deviceStatus.body.version) {
149
+ const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
150
+ this.accessory
151
+ .getService(this.hap.Service.AccessoryInformation)
152
+ .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
153
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
154
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
155
+ .updateValue(deviceVersion);
156
+ this.accessory.context.deviceVersion = deviceVersion;
157
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
158
+ }
393
159
  }
394
160
  async refreshStatus() {
395
161
  if (this.BLE) {
@@ -406,21 +172,15 @@ export class Hub {
406
172
  async openAPIRefreshStatus() {
407
173
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
408
174
  try {
409
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
410
- headers: this.platform.generateHeaders(),
411
- });
175
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
412
176
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
413
177
  const deviceStatus = await body.json();
414
178
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
415
179
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
416
180
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
417
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
181
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
418
182
  + `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();
183
+ this.openAPIparseStatus(deviceStatus);
424
184
  this.updateHomeKitCharacteristics();
425
185
  }
426
186
  else {
@@ -430,8 +190,47 @@ export class Hub {
430
190
  }
431
191
  catch (e) {
432
192
  this.apiError(e);
433
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}` +
434
- ` Connection, Error Message: ${JSON.stringify(e.message)}`);
193
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}`
194
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
195
+ }
196
+ }
197
+ async registerWebhook(accessory, device) {
198
+ if (device.webhook) {
199
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
200
+ this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
201
+ try {
202
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
203
+ const { temperature, humidity, lightLevel } = context;
204
+ const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
205
+ const { CurrentAmbientLightLevel } = this.LightSensor || { CurrentAmbientLightLevel: undefined };
206
+ const { CurrentRelativeHumidity } = this.HumiditySensor || { CurrentRelativeHumidity: undefined };
207
+ if (context.scale !== 'CELCIUS' && device.hub?.convertUnitTo === undefined) {
208
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} received a non-CELCIUS Webhook scale: `
209
+ + `${context.scale}, Use the *convertUnitsTo* config under Hub settings, if displaying incorrectly in HomeKit.`);
210
+ }
211
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
212
+ '(scale, temperature, humidity, lightLevel) = ' +
213
+ `Webhook:(${context.scale}, ${convertUnits(temperature, context.scale, device.hub?.convertUnitTo)}, ${humidity}, ${lightLevel}), `
214
+ + `current:(${CurrentTemperature}, ${CurrentRelativeHumidity}, ${CurrentAmbientLightLevel})`);
215
+ if (!this.device.hub?.hide_humidity) {
216
+ this.HumiditySensor.CurrentRelativeHumidity = humidity;
217
+ }
218
+ if (!this.device.hub?.hide_temperature) {
219
+ this.TemperatureSensor.CurrentTemperature = convertUnits(temperature, context.scale, device.hub?.convertUnitTo);
220
+ }
221
+ if (!this.device.hub?.hide_lightsensor) {
222
+ const set_minLux = this.device.curtain?.set_minLux ?? 1;
223
+ const set_maxLux = this.device.curtain?.set_maxLux ?? 6001;
224
+ const spaceBetweenLevels = 19;
225
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
226
+ }
227
+ this.updateHomeKitCharacteristics();
228
+ }
229
+ catch (e) {
230
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
231
+ + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
232
+ }
233
+ };
435
234
  }
436
235
  }
437
236
  /**
@@ -442,352 +241,179 @@ export class Hub {
442
241
  const entry = { time: Math.round(new Date().valueOf() / 1000) };
443
242
  // CurrentRelativeHumidity
444
243
  if (!this.device.hub?.hide_humidity) {
445
- if (this.CurrentRelativeHumidity === undefined) {
446
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
244
+ if (this.HumiditySensor.CurrentRelativeHumidity === undefined) {
245
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
246
+ + ` CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
447
247
  }
448
248
  else {
449
249
  if (this.device.mqttURL) {
450
- mqttmessage.push(`"humidity": ${this.CurrentRelativeHumidity}`);
250
+ mqttmessage.push(`"humidity": ${this.HumiditySensor.CurrentRelativeHumidity}`);
451
251
  }
452
252
  if (this.device.history) {
453
- entry['humidity'] = this.CurrentRelativeHumidity;
253
+ entry['humidity'] = this.HumiditySensor.CurrentRelativeHumidity;
454
254
  }
455
- this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
456
- this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.CurrentRelativeHumidity);
255
+ this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor.CurrentRelativeHumidity;
256
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.HumiditySensor.CurrentRelativeHumidity);
457
257
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
458
- + `updateCharacteristic CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
258
+ + `updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
459
259
  }
460
260
  }
461
261
  // CurrentTemperature
462
262
  if (!this.device.hub?.hide_temperature) {
463
- if (this.CurrentTemperature === undefined) {
464
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
263
+ if (this.TemperatureSensor.CurrentTemperature === undefined) {
264
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
465
265
  }
466
266
  else {
467
267
  if (this.device.mqttURL) {
468
- mqttmessage.push(`"temperature": ${this.CurrentTemperature}`);
268
+ mqttmessage.push(`"temperature": ${this.TemperatureSensor.CurrentTemperature}`);
469
269
  }
470
270
  if (this.device.history) {
471
- entry['temp'] = this.CurrentTemperature;
271
+ entry['temp'] = this.TemperatureSensor.CurrentTemperature;
472
272
  }
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}`);
273
+ this.accessory.context.CurrentTemperature = this.TemperatureSensor.CurrentTemperature;
274
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor.CurrentTemperature);
275
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
276
+ + ` CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
476
277
  }
477
278
  }
478
279
  // CurrentAmbientLightLevel
479
280
  if (!this.device.hub?.hide_lightsensor) {
480
- if (this.CurrentAmbientLightLevel === undefined) {
481
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
281
+ if (this.LightSensor.CurrentAmbientLightLevel === undefined) {
282
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
283
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
482
284
  }
483
285
  else {
484
286
  if (this.device.mqttURL) {
485
- mqttmessage.push(`"light": ${this.CurrentAmbientLightLevel}`);
287
+ mqttmessage.push(`"light": ${this.LightSensor.CurrentAmbientLightLevel}`);
486
288
  }
487
289
  if (this.device.history) {
488
- entry['lux'] = this.CurrentAmbientLightLevel;
290
+ entry['lux'] = this.LightSensor.CurrentAmbientLightLevel;
489
291
  }
490
- this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
491
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
292
+ this.accessory.context.CurrentAmbientLightLevel = this.LightSensor.CurrentAmbientLightLevel;
293
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
492
294
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
493
- + `updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
295
+ + `updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
494
296
  }
495
297
  }
496
298
  // MQTT
497
299
  if (this.device.mqttURL) {
498
300
  this.mqttPublish(`{${mqttmessage.join(',')}}`);
499
301
  }
500
- if (Number(this.CurrentRelativeHumidity) > 0) {
302
+ if (Number(this.HumiditySensor.CurrentRelativeHumidity) > 0) {
501
303
  // reject unreliable data
502
304
  if (this.device.history) {
503
305
  this.historyService?.addEntry(entry);
504
306
  }
505
307
  }
506
308
  }
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
- });
309
+ async offlineOff() {
310
+ if (this.device.offline) {
311
+ if (!this.device.hub?.hide_temperature) {
312
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.accessory.context.CurrentTemperature);
313
+ }
314
+ if (!this.device.hub?.hide_humidity) {
315
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.accessory.context.CurrentRelativeHumidity);
532
316
  }
533
- catch (e) {
534
- this.mqttClient = null;
535
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to establish MQTT connection. ${e}`);
317
+ if (!this.device.hub?.hide_lightsensor) {
318
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.accessory.context.CurrentAmbientLightLevel);
536
319
  }
537
320
  }
538
321
  }
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;
322
+ async apiError(e) {
323
+ if (!this.device.hub?.hide_temperature) {
324
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
325
+ }
326
+ if (!this.device.hub?.hide_humidity) {
327
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
328
+ }
329
+ if (!this.device.hub?.hide_lightsensor) {
330
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
331
+ }
554
332
  }
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}`);
333
+ async getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels) {
334
+ switch (lightLevel) {
335
+ case 1:
336
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
337
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
338
+ break;
339
+ case 2:
340
+ this.LightSensor.CurrentAmbientLightLevel = (set_maxLux - set_minLux) / spaceBetweenLevels;
341
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel},`
342
+ + ` Calculation: ${(set_maxLux - set_minLux) / spaceBetweenLevels}`);
343
+ break;
344
+ case 3:
345
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 2;
346
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
559
347
  break;
560
- case 152:
561
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
348
+ case 4:
349
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 3;
350
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
562
351
  break;
563
- case 160:
564
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
352
+ case 5:
353
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 4;
354
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
565
355
  break;
566
- case 161:
567
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
568
- this.offlineOff();
356
+ case 6:
357
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 5;
358
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
569
359
  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();
360
+ case 7:
361
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 6;
362
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
574
363
  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}`);
364
+ case 8:
365
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 7;
366
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
578
367
  break;
579
- case 100:
580
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
368
+ case 9:
369
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 8;
370
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
581
371
  break;
582
- case 200:
583
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
372
+ case 10:
373
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 9;
374
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
584
375
  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}`);
376
+ case 11:
377
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 10;
378
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
588
379
  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}`);
380
+ case 12:
381
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 11;
382
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
592
383
  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}`);
384
+ case 13:
385
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 12;
386
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
596
387
  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}`);
388
+ case 14:
389
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 13;
390
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
600
391
  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}`);
392
+ case 15:
393
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 14;
394
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
604
395
  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}`);
396
+ case 16:
397
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 15;
398
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
608
399
  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}`);
400
+ case 17:
401
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 16;
402
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
612
403
  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}`);
404
+ case 18:
405
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 17;
406
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
616
407
  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}`);
408
+ case 19:
409
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 18;
410
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
620
411
  break;
412
+ case 20:
621
413
  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();
630
- }
631
- }
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}`);
414
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
415
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
690
416
  }
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
417
  }
792
418
  }
793
419
  //# sourceMappingURL=hub.js.map