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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/CHANGELOG.md +4 -1
  3. package/config.schema.json +120 -17
  4. package/dist/device/blindtilt.d.ts +23 -96
  5. package/dist/device/blindtilt.d.ts.map +1 -1
  6. package/dist/device/blindtilt.js +408 -779
  7. package/dist/device/blindtilt.js.map +1 -1
  8. package/dist/device/bot.d.ts +26 -72
  9. package/dist/device/bot.d.ts.map +1 -1
  10. package/dist/device/bot.js +696 -822
  11. package/dist/device/bot.js.map +1 -1
  12. package/dist/device/ceilinglight.d.ts +14 -68
  13. package/dist/device/ceilinglight.d.ts.map +1 -1
  14. package/dist/device/ceilinglight.js +237 -606
  15. package/dist/device/ceilinglight.js.map +1 -1
  16. package/dist/device/colorbulb.d.ts +14 -75
  17. package/dist/device/colorbulb.d.ts.map +1 -1
  18. package/dist/device/colorbulb.js +280 -658
  19. package/dist/device/colorbulb.js.map +1 -1
  20. package/dist/device/contact.d.ts +15 -66
  21. package/dist/device/contact.d.ts.map +1 -1
  22. package/dist/device/contact.js +242 -544
  23. package/dist/device/contact.js.map +1 -1
  24. package/dist/device/curtain.d.ts +19 -88
  25. package/dist/device/curtain.d.ts.map +1 -1
  26. package/dist/device/curtain.js +402 -805
  27. package/dist/device/curtain.js.map +1 -1
  28. package/dist/device/device.d.ts +59 -0
  29. package/dist/device/device.d.ts.map +1 -0
  30. package/dist/device/device.js +684 -0
  31. package/dist/device/device.js.map +1 -0
  32. package/dist/device/fan.d.ts +51 -0
  33. package/dist/device/fan.d.ts.map +1 -0
  34. package/dist/device/fan.js +535 -0
  35. package/dist/device/fan.js.map +1 -0
  36. package/dist/device/hub.d.ts +16 -60
  37. package/dist/device/hub.d.ts.map +1 -1
  38. package/dist/device/hub.js +246 -613
  39. package/dist/device/hub.js.map +1 -1
  40. package/dist/device/humidifier.d.ts +11 -66
  41. package/dist/device/humidifier.d.ts.map +1 -1
  42. package/dist/device/humidifier.js +232 -593
  43. package/dist/device/humidifier.js.map +1 -1
  44. package/dist/device/iosensor.d.ts +11 -64
  45. package/dist/device/iosensor.d.ts.map +1 -1
  46. package/dist/device/iosensor.js +185 -600
  47. package/dist/device/iosensor.js.map +1 -1
  48. package/dist/device/lightstrip.d.ts +11 -69
  49. package/dist/device/lightstrip.d.ts.map +1 -1
  50. package/dist/device/lightstrip.js +277 -586
  51. package/dist/device/lightstrip.js.map +1 -1
  52. package/dist/device/lock.d.ts +16 -63
  53. package/dist/device/lock.d.ts.map +1 -1
  54. package/dist/device/lock.js +241 -560
  55. package/dist/device/lock.js.map +1 -1
  56. package/dist/device/meter.d.ts +14 -64
  57. package/dist/device/meter.d.ts.map +1 -1
  58. package/dist/device/meter.js +181 -593
  59. package/dist/device/meter.js.map +1 -1
  60. package/dist/device/meterplus.d.ts +14 -65
  61. package/dist/device/meterplus.d.ts.map +1 -1
  62. package/dist/device/meterplus.js +170 -593
  63. package/dist/device/meterplus.js.map +1 -1
  64. package/dist/device/motion.d.ts +13 -69
  65. package/dist/device/motion.d.ts.map +1 -1
  66. package/dist/device/motion.js +178 -531
  67. package/dist/device/motion.js.map +1 -1
  68. package/dist/device/plug.d.ts +9 -57
  69. package/dist/device/plug.d.ts.map +1 -1
  70. package/dist/device/plug.js +92 -458
  71. package/dist/device/plug.js.map +1 -1
  72. package/dist/device/robotvacuumcleaner.d.ts +12 -63
  73. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  74. package/dist/device/robotvacuumcleaner.js +197 -521
  75. package/dist/device/robotvacuumcleaner.js.map +1 -1
  76. package/dist/device/waterdetector.d.ts +10 -65
  77. package/dist/device/waterdetector.d.ts.map +1 -1
  78. package/dist/device/waterdetector.js +139 -495
  79. package/dist/device/waterdetector.js.map +1 -1
  80. package/dist/homebridge-ui/public/index.html +22 -16
  81. package/dist/homebridge-ui/server.js +1 -1
  82. package/dist/homebridge-ui/server.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +2 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/irdevice/airconditioner.d.ts +9 -49
  88. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  89. package/dist/irdevice/airconditioner.js +309 -419
  90. package/dist/irdevice/airconditioner.js.map +1 -1
  91. package/dist/irdevice/airpurifier.d.ts +8 -39
  92. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  93. package/dist/irdevice/airpurifier.js +72 -304
  94. package/dist/irdevice/airpurifier.js.map +1 -1
  95. package/dist/irdevice/camera.d.ts +7 -36
  96. package/dist/irdevice/camera.d.ts.map +1 -1
  97. package/dist/irdevice/camera.js +34 -278
  98. package/dist/irdevice/camera.js.map +1 -1
  99. package/dist/irdevice/fan.d.ts +10 -43
  100. package/dist/irdevice/fan.d.ts.map +1 -1
  101. package/dist/irdevice/fan.js +100 -338
  102. package/dist/irdevice/fan.js.map +1 -1
  103. package/dist/irdevice/irdevice.d.ts +40 -0
  104. package/dist/irdevice/irdevice.d.ts.map +1 -0
  105. package/dist/irdevice/irdevice.js +330 -0
  106. package/dist/irdevice/irdevice.js.map +1 -0
  107. package/dist/irdevice/light.d.ts +12 -45
  108. package/dist/irdevice/light.d.ts.map +1 -1
  109. package/dist/irdevice/light.js +87 -357
  110. package/dist/irdevice/light.js.map +1 -1
  111. package/dist/irdevice/other.d.ts +19 -48
  112. package/dist/irdevice/other.d.ts.map +1 -1
  113. package/dist/irdevice/other.js +352 -546
  114. package/dist/irdevice/other.js.map +1 -1
  115. package/dist/irdevice/tv.d.ts +8 -40
  116. package/dist/irdevice/tv.d.ts.map +1 -1
  117. package/dist/irdevice/tv.js +82 -321
  118. package/dist/irdevice/tv.js.map +1 -1
  119. package/dist/irdevice/vacuumcleaner.d.ts +7 -36
  120. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  121. package/dist/irdevice/vacuumcleaner.js +41 -284
  122. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  123. package/dist/irdevice/waterheater.d.ts +7 -36
  124. package/dist/irdevice/waterheater.d.ts.map +1 -1
  125. package/dist/irdevice/waterheater.js +42 -287
  126. package/dist/irdevice/waterheater.js.map +1 -1
  127. package/dist/platform.d.ts +19 -6
  128. package/dist/platform.d.ts.map +1 -1
  129. package/dist/platform.js +310 -169
  130. package/dist/platform.js.map +1 -1
  131. package/dist/settings.d.ts +62 -19
  132. package/dist/settings.d.ts.map +1 -1
  133. package/dist/settings.js +16 -552
  134. package/dist/settings.js.map +1 -1
  135. package/dist/utils.d.ts +77 -0
  136. package/dist/utils.d.ts.map +1 -1
  137. package/dist/utils.js +638 -1
  138. package/dist/utils.js.map +1 -1
  139. package/eslint.config.js +96 -0
  140. package/package.json +19 -15
  141. package/src/custom.d.ts +2 -1
  142. package/src/device/blindtilt.ts +442 -814
  143. package/src/device/bot.ts +754 -915
  144. package/src/device/ceilinglight.ts +255 -633
  145. package/src/device/colorbulb.ts +295 -685
  146. package/src/device/contact.ts +277 -571
  147. package/src/device/curtain.ts +431 -835
  148. package/src/device/device.ts +709 -0
  149. package/src/device/fan.ts +591 -0
  150. package/src/device/hub.ts +286 -644
  151. package/src/device/humidifier.ts +266 -646
  152. package/src/device/iosensor.ts +220 -625
  153. package/src/device/lightstrip.ts +305 -620
  154. package/src/device/lock.ts +280 -600
  155. package/src/device/meter.ts +216 -617
  156. package/src/device/meterplus.ts +205 -619
  157. package/src/device/motion.ts +206 -556
  158. package/src/device/plug.ts +107 -490
  159. package/src/device/robotvacuumcleaner.ts +223 -550
  160. package/src/device/waterdetector.ts +160 -519
  161. package/src/homebridge-ui/public/index.html +22 -16
  162. package/src/homebridge-ui/server.ts +1 -1
  163. package/src/index.ts +4 -3
  164. package/src/irdevice/airconditioner.ts +333 -447
  165. package/src/irdevice/airpurifier.ts +92 -322
  166. package/src/irdevice/camera.ts +45 -294
  167. package/src/irdevice/fan.ts +115 -353
  168. package/src/irdevice/irdevice.ts +346 -0
  169. package/src/irdevice/light.ts +110 -385
  170. package/src/irdevice/other.ts +399 -616
  171. package/src/irdevice/tv.ts +103 -340
  172. package/src/irdevice/vacuumcleaner.ts +52 -306
  173. package/src/irdevice/waterheater.ts +53 -311
  174. package/src/platform.ts +355 -216
  175. package/src/settings.ts +116 -611
  176. package/src/utils.ts +642 -1
  177. package/src/device/waterdetector.json +0 -11
package/src/device/hub.ts CHANGED
@@ -1,106 +1,66 @@
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';
7
- import { SwitchBotPlatform } from '../platform.js';
8
- import { Devices, device, deviceStatus, devicesConfig, SwitchBotPlatformConfig } from '../settings.js';
9
-
10
- export class Hub {
11
- public readonly api: API;
12
- public readonly log: Logging;
13
- public readonly config!: SwitchBotPlatformConfig;
14
- protected readonly hap: HAP;
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * hub.ts: @switchbot/homebridge-switchbot.
4
+ */
5
+ import { Units } from 'homebridge';
6
+ import { deviceBase } from './device.js';
7
+ import { Devices } from '../settings.js';
8
+ import { convertUnits } from '../utils.js';
9
+ import { Subject, interval, skipWhile } from 'rxjs';
10
+
11
+ import type { SwitchBotPlatform } from '../platform.js';
12
+ import type { device, deviceStatus, devicesConfig } from '../settings.js';
13
+ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
14
+
15
+ export class Hub extends deviceBase {
15
16
  // 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;
17
+ private LightSensor?: {
18
+ Name: CharacteristicValue;
19
+ Service: Service;
20
+ CurrentAmbientLightLevel: CharacteristicValue;
21
+ };
22
+
23
+ private HumiditySensor?: {
24
+ Name: CharacteristicValue;
25
+ Service: Service;
26
+ CurrentRelativeHumidity: CharacteristicValue;
27
+ };
28
+
29
+ private TemperatureSensor?: {
30
+ Name: CharacteristicValue;
31
+ Service: Service;
32
+ CurrentTemperature: CharacteristicValue;
33
+ };
34
+
35
+ // Updates
36
+ hubUpdateInProgress!: boolean;
37
+ doHubUpdate!: Subject<void>;
53
38
 
54
39
  constructor(
55
- private readonly platform: SwitchBotPlatform,
56
- private accessory: PlatformAccessory,
57
- public device: device & devicesConfig,
40
+ readonly platform: SwitchBotPlatform,
41
+ accessory: PlatformAccessory,
42
+ device: device & devicesConfig,
58
43
  ) {
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;
44
+ super(platform, accessory, device);
45
+ // this is subject we use to track when we need to POST changes to the SwitchBot API
46
+ this.doHubUpdate = new Subject();
47
+ this.hubUpdateInProgress = false;
76
48
 
77
- // Retrieve initial values and updateHomekit
78
- this.refreshStatus();
79
-
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
- // Temperature Sensor Service
49
+ // Initialize Temperature Sensor Service
89
50
  if (device.hub?.hide_temperature) {
90
51
  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) {
94
- 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;
98
-
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
52
+ this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
53
+ accessory.removeService(this.TemperatureSensor!.Service);
54
+ } else {
55
+ this.TemperatureSensor = {
56
+ Name: accessory.context.TemperatureSensorName ?? `${accessory.displayName} Temperature Sensor`,
57
+ Service: accessory.getService(this.hap.Service.TemperatureSensor) ?? this.accessory.addService(this.hap.Service.TemperatureSensor) as Service,
58
+ CurrentTemperature: accessory.context.CurrentTemperature ?? 0,
59
+ };
60
+
61
+ // Initialize Temperature Sensor Characteristic
62
+ this.TemperatureSensor.Service
63
+ .setCharacteristic(this.hap.Characteristic.Name, this.TemperatureSensor.Name)
104
64
  .getCharacteristic(this.hap.Characteristic.CurrentTemperature)
105
65
  .setProps({
106
66
  unit: Units['CELSIUS'],
@@ -110,170 +70,105 @@ export class Hub {
110
70
  minStep: 0.1,
111
71
  })
112
72
  .onGet(() => {
113
- return this.CurrentTemperature!;
73
+ return this.TemperatureSensor!.CurrentTemperature;
114
74
  });
115
- } else {
116
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Temperature Sensor Service Not Added`);
75
+ accessory.context.TemperatureSensorName = this.TemperatureSensor.Name;
117
76
  }
118
77
 
119
- // Humidity Sensor Service
78
+ // Initialize Humidity Sensor Service
120
79
  if (device.hub?.hide_humidity) {
121
80
  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) {
125
- 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;
129
-
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
81
+ this.HumiditySensor!.Service = this.accessory.getService(this.hap.Service.HumiditySensor) as Service;
82
+ accessory.removeService(this.HumiditySensor!.Service);
83
+ } else {
84
+ this.HumiditySensor = {
85
+ Name: accessory.context.HumiditySensorName ?? `${accessory.displayName} Humidity Sensor`,
86
+ Service: accessory.getService(this.hap.Service.HumiditySensor) ?? this.accessory.addService(this.hap.Service.HumiditySensor) as Service,
87
+ CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity ?? 0,
88
+ };
89
+
90
+ // Initialize Humidity Sensor Characteristics
91
+ this.HumiditySensor!.Service
92
+ .setCharacteristic(this.hap.Characteristic.Name, this.HumiditySensor.Name)
135
93
  .getCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity)
136
94
  .setProps({
137
95
  minStep: 0.1,
138
96
  })
139
97
  .onGet(() => {
140
- return this.CurrentRelativeHumidity;
98
+ return this.HumiditySensor!.CurrentRelativeHumidity;
141
99
  });
142
- } else {
143
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Humidity Sensor Service Not Added`);
100
+ accessory.context.HumiditySensorName = this.HumiditySensor.Name;
144
101
  }
145
102
 
146
- // Light Sensor Service
103
+ // Initialize Light Sensor Service
147
104
  if (device.hub?.hide_lightsensor) {
148
105
  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) {
152
- 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;
156
-
157
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Light Sensor`);
158
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Light Sensor`);
106
+ this.LightSensor!.Service = this.accessory.getService(this.hap.Service.LightSensor) as Service;
107
+ accessory.removeService(this.LightSensor!.Service);
159
108
  } else {
160
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Light Sensor Service Not Added`);
109
+ this.LightSensor = {
110
+ Name: accessory.context.LightSensorName ?? `${accessory.displayName} Light Sensor`,
111
+ Service: accessory.getService(this.hap.Service.LightSensor) ?? this.accessory.addService(this.hap.Service.LightSensor) as Service,
112
+ CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel ?? 0.0001,
113
+ };
114
+
115
+ // Initialize Light Sensor Characteristics
116
+ this.LightSensor!.Service
117
+ .setCharacteristic(this.hap.Characteristic.Name, this.LightSensor.Name)
118
+ .getCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel)
119
+ .setProps({
120
+ minStep: 1,
121
+ })
122
+ .onGet(() => {
123
+ return this.LightSensor!.CurrentAmbientLightLevel;
124
+ });
125
+ accessory.context.LightSensorName = this.LightSensor.Name;
161
126
  }
162
127
 
128
+ // Retrieve initial values and updateHomekit
129
+ this.refreshStatus();
130
+
163
131
  // Retrieve initial values and update Homekit
164
132
  this.updateHomeKitCharacteristics();
165
133
 
166
134
  // Start an update interval
167
135
  interval(this.deviceRefreshRate * 1000)
136
+ .pipe(skipWhile(() => this.hubUpdateInProgress))
168
137
  .subscribe(async () => {
169
138
  await this.refreshStatus();
170
139
  });
171
140
 
172
141
  //regisiter webhook event handler
173
- if (this.device.webhook) {
174
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
142
+ if (device.webhook) {
143
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
175
144
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
176
145
  try {
177
146
  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();
147
+ const { temperature, humidity, lightLevel } = context;
148
+ const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
149
+ const { CurrentAmbientLightLevel } = this.LightSensor || { CurrentAmbientLightLevel: undefined };
150
+ const { CurrentRelativeHumidity } = this.HumiditySensor || { CurrentRelativeHumidity: undefined };
151
+ if (context.scale !== 'CELCIUS' && device.hub?.convertUnitTo === undefined) {
152
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} received a non-CELCIUS Webhook scale: `
153
+ + `${context.scale}, Use the *convertUnitsTo* config under Hub settings, if displaying incorrectly in HomeKit.`);
154
+ }
155
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
156
+ '(scale, temperature, humidity, lightLevel) = ' +
157
+ `Webhook:(${context.scale}, ${convertUnits(temperature, context.scale, device.hub?.convertUnitTo)}, ${humidity}, ${lightLevel}), ` +
158
+ `current:(${CurrentTemperature}, ${CurrentRelativeHumidity}, ${CurrentAmbientLightLevel})`);
159
+ if (!this.device.hub?.hide_humidity) {
160
+ this.HumiditySensor!.CurrentRelativeHumidity = humidity;
276
161
  }
162
+ if (!this.device.hub?.hide_temperature) {
163
+ this.TemperatureSensor!.CurrentTemperature = convertUnits(temperature, context.scale, device.hub?.convertUnitTo);
164
+ }
165
+ if (!this.device.hub?.hide_lightsensor) {
166
+ const set_minLux = await this.minLux();
167
+ const set_maxLux = await this.maxLux();
168
+ const spaceBetweenLevels = 19;
169
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
170
+ }
171
+ this.updateHomeKitCharacteristics();
277
172
  } catch (e: any) {
278
173
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
279
174
  + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
@@ -282,140 +177,49 @@ export class Hub {
282
177
  }
283
178
  }
284
179
 
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> {
180
+ async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
302
181
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
303
182
  // CurrentRelativeHumidity
304
183
  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}%`);
184
+ this.HumiditySensor!.CurrentRelativeHumidity = Number(deviceStatus.body.humidity);
185
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor!.CurrentRelativeHumidity}%`);
307
186
  }
308
187
 
309
188
  // CurrentTemperature
310
189
  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`);
190
+ this.TemperatureSensor!.CurrentTemperature = Number(deviceStatus.body.temperature);
191
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor!.CurrentTemperature}°c`);
313
192
  }
314
193
 
315
194
  // Brightness
316
195
  if (!this.device.hub?.hide_lightsensor) {
317
196
  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
- }
197
+ const set_minLux = await this.minLux();
198
+ const set_maxLux = await this.maxLux();
199
+ const spaceBetweenLevels = 19;
200
+ const lightLevel = deviceStatus.body.lightLevel;
201
+ await this.getLightLevel(lightLevel, set_minLux, set_maxLux, spaceBetweenLevels);
406
202
  this.debugLog(
407
- `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.OpenAPI_CurrentAmbientLightLevel},` +
408
- ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`,
203
+ `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${deviceStatus.body.lightLevel},` +
204
+ ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`,
409
205
  );
410
206
  }
411
207
  if (!this.device.hub?.hide_lightsensor) {
412
- this.lightSensorService?.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
208
+ this.LightSensor!.Service.setCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor!.CurrentAmbientLightLevel);
413
209
  }
414
210
  }
415
211
 
416
- // FirmwareRevision
417
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision!;
418
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
212
+ // Firmware Version
213
+ const version = deviceStatus.body.version?.toString();
214
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
215
+ if (deviceStatus.body.version) {
216
+ this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
217
+ this.accessory
218
+ .getService(this.hap.Service.AccessoryInformation)!
219
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
220
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
221
+ .updateValue(this.accessory.context.version);
222
+ }
419
223
  }
420
224
 
421
225
  async refreshStatus(): Promise<void> {
@@ -432,21 +236,19 @@ export class Hub {
432
236
  async openAPIRefreshStatus(): Promise<void> {
433
237
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
434
238
  try {
435
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
436
- headers: this.platform.generateHeaders(),
437
- });
239
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
240
+ `${Devices}/${this.device.deviceId}/status`, {
241
+ headers: this.platform.generateHeaders(),
242
+ });
438
243
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
439
244
  const deviceStatus: any = await body.json();
440
245
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
441
246
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
442
247
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
443
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
248
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
444
249
  + `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();
250
+
251
+ this.openAPIparseStatus(deviceStatus);
450
252
  this.updateHomeKitCharacteristics();
451
253
  } else {
452
254
  this.statusCode(statusCode);
@@ -471,55 +273,59 @@ export class Hub {
471
273
 
472
274
  // CurrentRelativeHumidity
473
275
  if (!this.device.hub?.hide_humidity) {
474
- if (this.CurrentRelativeHumidity === undefined) {
475
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
276
+ if (this.HumiditySensor!.CurrentRelativeHumidity === undefined) {
277
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
278
+ + ` CurrentRelativeHumidity: ${this.HumiditySensor!.CurrentRelativeHumidity}`);
476
279
  } else {
477
280
  if (this.device.mqttURL) {
478
- mqttmessage.push(`"humidity": ${this.CurrentRelativeHumidity}`);
281
+ mqttmessage.push(`"humidity": ${this.HumiditySensor!.CurrentRelativeHumidity}`);
479
282
  }
480
283
  if (this.device.history) {
481
- entry['humidity'] = this.CurrentRelativeHumidity;
284
+ entry['humidity'] = this.HumiditySensor!.CurrentRelativeHumidity;
482
285
  }
483
- this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
484
- this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.CurrentRelativeHumidity);
286
+ this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor!.CurrentRelativeHumidity;
287
+ this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity,
288
+ this.HumiditySensor!.CurrentRelativeHumidity);
485
289
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
486
- + `updateCharacteristic CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
290
+ + `updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor!.CurrentRelativeHumidity}`);
487
291
  }
488
292
  }
489
293
 
490
294
  // CurrentTemperature
491
295
  if (!this.device.hub?.hide_temperature) {
492
- if (this.CurrentTemperature === undefined) {
493
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
296
+ if (this.TemperatureSensor!.CurrentTemperature === undefined) {
297
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
494
298
  } else {
495
299
  if (this.device.mqttURL) {
496
- mqttmessage.push(`"temperature": ${this.CurrentTemperature}`);
300
+ mqttmessage.push(`"temperature": ${this.TemperatureSensor!.CurrentTemperature}`);
497
301
  }
498
302
  if (this.device.history) {
499
- entry['temp'] = this.CurrentTemperature;
303
+ entry['temp'] = this.TemperatureSensor!.CurrentTemperature;
500
304
  }
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}`);
305
+ this.accessory.context.CurrentTemperature = this.TemperatureSensor!.CurrentTemperature;
306
+ this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor!.CurrentTemperature);
307
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
308
+ + ` CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
504
309
  }
505
310
  }
506
311
 
507
312
  // CurrentAmbientLightLevel
508
313
  if (!this.device.hub?.hide_lightsensor) {
509
- if (this.CurrentAmbientLightLevel === undefined) {
510
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
314
+ if (this.LightSensor!.CurrentAmbientLightLevel === undefined) {
315
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
316
+ + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
511
317
  } else {
512
318
  if (this.device.mqttURL) {
513
- mqttmessage.push(`"light": ${this.CurrentAmbientLightLevel}`);
319
+ mqttmessage.push(`"light": ${this.LightSensor!.CurrentAmbientLightLevel}`);
514
320
  }
515
321
  if (this.device.history) {
516
- entry['lux'] = this.CurrentAmbientLightLevel;
322
+ entry['lux'] = this.LightSensor!.CurrentAmbientLightLevel;
517
323
  }
518
- this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
519
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
324
+ this.accessory.context.CurrentAmbientLightLevel = this.LightSensor!.CurrentAmbientLightLevel;
325
+ this.LightSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor!.CurrentAmbientLightLevel);
520
326
  this.debugLog(
521
327
  `${this.device.deviceType}: ${this.accessory.displayName} `
522
- + `updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`,
328
+ + `updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`,
523
329
  );
524
330
  }
525
331
  }
@@ -528,7 +334,7 @@ export class Hub {
528
334
  if (this.device.mqttURL) {
529
335
  this.mqttPublish(`{${mqttmessage.join(',')}}`);
530
336
  }
531
- if (Number(this.CurrentRelativeHumidity) > 0) {
337
+ if (Number(this.HumiditySensor!.CurrentRelativeHumidity) > 0) {
532
338
  // reject unreliable data
533
339
  if (this.device.history) {
534
340
  this.historyService?.addEntry(entry);
@@ -536,301 +342,137 @@ export class Hub {
536
342
  }
537
343
  }
538
344
 
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)}`);
345
+ async offlineOff(): Promise<void> {
346
+ if (this.device.offline) {
347
+ if (!this.device.hub?.hide_temperature) {
348
+ this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.accessory.context.CurrentTemperature);
349
+ }
350
+ if (!this.device.hub?.hide_humidity) {
351
+ this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity,
352
+ this.accessory.context.CurrentRelativeHumidity);
353
+ }
354
+ if (!this.device.hub?.hide_lightsensor) {
355
+ this.LightSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel,
356
+ this.accessory.context.CurrentAmbientLightLevel);
357
+ }
358
+ }
551
359
  }
552
360
 
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
- }
361
+ async apiError(e: any): Promise<void> {
362
+ if (!this.device.hub?.hide_temperature) {
363
+ this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
364
+ }
365
+ if (!this.device.hub?.hide_humidity) {
366
+ this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
367
+ }
368
+ if (!this.device.hub?.hide_lightsensor) {
369
+ this.LightSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
569
370
  }
570
371
  }
571
372
 
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;
373
+ async minLux(): Promise<number> {
374
+ let set_minLux: number;
375
+ if (this.device.curtain?.set_minLux) {
376
+ set_minLux = this.device.curtain?.set_minLux;
377
+ } else {
378
+ set_minLux = 1;
379
+ }
380
+ return set_minLux;
381
+ }
382
+
383
+ async maxLux(): Promise<number> {
384
+ let set_maxLux: number;
385
+ if (this.device.curtain?.set_maxLux) {
386
+ set_maxLux = this.device.curtain?.set_maxLux;
387
+ } else {
388
+ set_maxLux = 6001;
389
+ }
390
+ return set_maxLux;
587
391
  }
588
392
 
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}`);
393
+ async getLightLevel(lightLevel: any, set_minLux: number, set_maxLux: number, spaceBetweenLevels: number) {
394
+ switch (lightLevel) {
395
+ case 1:
396
+ this.LightSensor!.CurrentAmbientLightLevel = set_minLux;
397
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
593
398
  break;
594
- case 152:
595
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
399
+ case 2:
400
+ this.LightSensor!.CurrentAmbientLightLevel = (set_maxLux - set_minLux) / spaceBetweenLevels;
401
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel},` +
402
+ ` Calculation: ${(set_maxLux - set_minLux) / spaceBetweenLevels}`);
596
403
  break;
597
- case 160:
598
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
404
+ case 3:
405
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 2;
406
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
599
407
  break;
600
- case 161:
601
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
602
- this.offlineOff();
408
+ case 4:
409
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 3;
410
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
603
411
  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();
412
+ case 5:
413
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 4;
414
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
610
415
  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
- );
416
+ case 6:
417
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 5;
418
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
419
+ break;
420
+ case 7:
421
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 6;
422
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
616
423
  break;
617
- case 100:
618
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
424
+ case 8:
425
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 7;
426
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
619
427
  break;
620
- case 200:
621
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
428
+ case 9:
429
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 8;
430
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
622
431
  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}`);
432
+ case 10:
433
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 9;
434
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
626
435
  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}`);
436
+ case 11:
437
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 10;
438
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
630
439
  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}`);
440
+ case 12:
441
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 11;
442
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
634
443
  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}`);
444
+ case 13:
445
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 12;
446
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
638
447
  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}`);
448
+ case 14:
449
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 13;
450
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
642
451
  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}`);
452
+ case 15:
453
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 14;
454
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
646
455
  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}`);
456
+ case 16:
457
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 15;
458
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
650
459
  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}`);
460
+ case 17:
461
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 16;
462
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
654
463
  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}`);
464
+ case 18:
465
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 17;
466
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
658
467
  break;
468
+ case 19:
469
+ this.LightSensor!.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 18;
470
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
471
+ break;
472
+ case 20:
659
473
  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();
671
- }
672
- }
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;
474
+ this.LightSensor!.CurrentAmbientLightLevel = set_maxLux;
475
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${lightLevel}`);
709
476
  }
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
477
  }
836
478
  }