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