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

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 +349 -756
  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 +584 -759
  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 +211 -587
  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 +252 -632
  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 +206 -531
  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 +337 -786
  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 +503 -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 +244 -596
  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 +209 -571
  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 +176 -584
  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 +254 -568
  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 +212 -542
  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 +172 -577
  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 +161 -577
  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 +138 -518
  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 +84 -452
  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 +142 -451
  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 +123 -664
  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 +375 -782
  136. package/src/device/bot.ts +618 -844
  137. package/src/device/ceilinglight.ts +224 -607
  138. package/src/device/colorbulb.ts +266 -656
  139. package/src/device/contact.ts +231 -553
  140. package/src/device/curtain.ts +357 -810
  141. package/src/device/device.ts +699 -0
  142. package/src/device/fan.ts +552 -0
  143. package/src/device/hub.ts +271 -624
  144. package/src/device/humidifier.ts +239 -618
  145. package/src/device/iosensor.ts +202 -610
  146. package/src/device/lightstrip.ts +275 -596
  147. package/src/device/lock.ts +249 -582
  148. package/src/device/meter.ts +198 -601
  149. package/src/device/meterplus.ts +186 -602
  150. package/src/device/motion.ts +158 -541
  151. package/src/device/plug.ts +94 -480
  152. package/src/device/robotvacuumcleaner.ts +163 -477
  153. package/src/device/waterdetector.ts +141 -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,63 @@ 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`);
250
193
  }
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
194
  // FirmwareRevision
257
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
258
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
195
+ if (deviceStatus.body.version) {
196
+ this.accessory.context.version = deviceStatus.body.version;
197
+ this.accessory
198
+ .getService(this.hap.Service.AccessoryInformation)
199
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
200
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
201
+ .updateValue(this.accessory.context.version);
202
+ }
259
203
  }
260
204
  /**
261
205
  * Asks the SwitchBot API for the latest device information
@@ -288,108 +232,43 @@ export class MeterPlus {
288
232
  this.getCustomBLEAddress(switchbot);
289
233
  // Start to monitor advertisement packets
290
234
  (async () => {
291
- await switchbot.startScan({
292
- model: 'i',
293
- id: this.device.bleMac,
294
- });
235
+ // Start to monitor advertisement packets
236
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
295
237
  // Set an event handler
296
238
  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') {
239
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
240
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
241
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
300
242
  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
243
  }
307
244
  else {
308
245
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
309
246
  }
310
247
  };
311
- // Wait 1 seconds
248
+ // Wait 10 seconds
312
249
  await switchbot.wait(this.scanDuration * 1000);
313
250
  // Stop to monitor
314
251
  await switchbot.stopScan();
315
252
  // Update HomeKit
316
- await this.BLEparseStatus();
253
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
317
254
  await this.updateHomeKitCharacteristics();
318
255
  })();
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
- }*/
256
+ if (switchbot === undefined) {
257
+ await this.BLERefreshConnection(switchbot);
258
+ }
374
259
  }
375
260
  async openAPIRefreshStatus() {
376
261
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
377
262
  try {
378
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
379
- headers: this.platform.generateHeaders(),
380
- });
263
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
381
264
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
382
265
  const deviceStatus = await body.json();
383
266
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
384
267
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
385
268
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
386
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
269
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
387
270
  + `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();
271
+ this.openAPIparseStatus(deviceStatus);
393
272
  this.updateHomeKitCharacteristics();
394
273
  }
395
274
  else {
@@ -411,149 +290,78 @@ export class MeterPlus {
411
290
  const entry = { time: Math.round(new Date().valueOf() / 1000) };
412
291
  // CurrentRelativeHumidity
413
292
  if (!this.device.meter?.hide_humidity) {
414
- if (this.CurrentRelativeHumidity === undefined) {
415
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
293
+ if (this.HumiditySensor.CurrentRelativeHumidity === undefined) {
294
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
295
+ + ` CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
416
296
  }
417
297
  else {
298
+ this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor.CurrentRelativeHumidity;
299
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.HumiditySensor.CurrentRelativeHumidity);
300
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
301
+ + ` updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
418
302
  if (this.device.mqttURL) {
419
- mqttmessage.push(`"humidity": ${this.CurrentRelativeHumidity}`);
303
+ mqttmessage.push(`"humidity": ${this.HumiditySensor.CurrentRelativeHumidity}`);
420
304
  }
421
305
  if (this.device.history) {
422
- entry['humidity'] = this.CurrentRelativeHumidity;
306
+ entry['humidity'] = this.HumiditySensor.CurrentRelativeHumidity;
423
307
  }
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
308
  }
429
309
  }
430
310
  // CurrentTemperature
431
311
  if (!this.device.meter?.hide_temperature) {
432
- if (this.CurrentTemperature === undefined) {
433
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
312
+ if (this.TemperatureSensor.CurrentTemperature === undefined) {
313
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
434
314
  }
435
315
  else {
316
+ this.accessory.context.CurrentTemperature = this.TemperatureSensor.CurrentTemperature;
317
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor.CurrentTemperature);
318
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
319
+ + ` CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
436
320
  if (this.device.mqttURL) {
437
- mqttmessage.push(`"temperature": ${this.CurrentTemperature}`);
321
+ mqttmessage.push(`"temperature": ${this.TemperatureSensor.CurrentTemperature}`);
438
322
  }
439
323
  if (this.device.history) {
440
- entry['temp'] = this.CurrentTemperature;
324
+ entry['temp'] = this.TemperatureSensor.CurrentTemperature;
441
325
  }
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
326
  }
446
327
  }
447
328
  // BatteryLevel
448
- if (this.BatteryLevel === undefined) {
449
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
329
+ if (this.Battery.BatteryLevel === undefined) {
330
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
450
331
  }
451
332
  else {
333
+ this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
334
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
335
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
452
336
  if (this.device.mqttURL) {
453
- mqttmessage.push(`"battery": ${this.BatteryLevel}`);
337
+ mqttmessage.push(`"battery": ${this.Battery.BatteryLevel}`);
454
338
  }
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
339
  }
459
340
  // StatusLowBattery
460
- if (this.StatusLowBattery === undefined) {
461
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
341
+ if (this.Battery.StatusLowBattery === undefined) {
342
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
462
343
  }
463
344
  else {
345
+ this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
346
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
347
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
348
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
464
349
  if (this.device.mqttURL) {
465
- mqttmessage.push(`"lowBattery": ${this.StatusLowBattery}`);
350
+ mqttmessage.push(`"lowBattery": ${this.Battery.StatusLowBattery}`);
466
351
  }
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
352
  }
471
- // MQTT
353
+ // MQTT Publish
472
354
  if (this.device.mqttURL) {
473
355
  this.mqttPublish(`{${mqttmessage.join(',')}}`);
474
356
  }
475
- if (Number(this.CurrentRelativeHumidity) > 0) {
357
+ // History Service
358
+ if (!this.device.meter?.hide_humidity && (Number(this.HumiditySensor.CurrentRelativeHumidity) > 0)) {
476
359
  // reject unreliable data
477
360
  if (this.device.history) {
478
361
  this.historyService?.addEntry(entry);
479
362
  }
480
363
  }
481
364
  }
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
365
  async BLERefreshConnection(switchbot) {
558
366
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
559
367
  + ` ${JSON.stringify(switchbot)}`);
@@ -562,250 +370,26 @@ export class MeterPlus {
562
370
  await this.openAPIRefreshStatus();
563
371
  }
564
372
  }
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
373
  async offlineOff() {
661
374
  if (this.device.offline) {
662
- await this.deviceContext();
663
- await this.updateHomeKitCharacteristics();
375
+ if (!this.device.meter?.hide_humidity) {
376
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, 50);
377
+ }
378
+ if (!this.device.meter?.hide_temperature) {
379
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, 30);
380
+ }
381
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, 100);
664
382
  }
665
383
  }
666
384
  async apiError(e) {
667
385
  if (!this.device.meter?.hide_humidity) {
668
- this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
386
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
669
387
  }
670
388
  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;
389
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
730
390
  }
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';
391
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
392
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
809
393
  }
810
394
  }
811
395
  //# sourceMappingURL=meterplus.js.map