@switchbot/homebridge-switchbot 3.5.0-beta.4 → 3.5.0-beta.41

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