bt-sensors-plugin-sk 1.2.0-beta.0.0.3 → 1.2.0-beta.0.0.5

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 (37) hide show
  1. package/BTSensor.js +7 -6
  2. package/Queue.js +3 -3
  3. package/index.js +8 -5
  4. package/package.json +1 -1
  5. package/plugin_defaults.json +98 -10
  6. package/sensor_classes/ATC.js +2 -3
  7. package/sensor_classes/Aranet/AranetSensor.js +4 -0
  8. package/sensor_classes/Aranet2.js +16 -15
  9. package/sensor_classes/Aranet4.js +23 -17
  10. package/sensor_classes/GoveeH50xx.js +10 -12
  11. package/sensor_classes/GoveeH510x.js +2 -5
  12. package/sensor_classes/IBeacon.js +4 -7
  13. package/sensor_classes/Inkbird.js +2 -2
  14. package/sensor_classes/JBDBMS.js +31 -23
  15. package/sensor_classes/KilovaultHLXPlus.js +32 -15
  16. package/sensor_classes/LancolVoltageMeter.js +4 -3
  17. package/sensor_classes/RenogyBattery.js +15 -13
  18. package/sensor_classes/RenogyRoverClient.js +2 -3
  19. package/sensor_classes/RuuviTag.js +35 -27
  20. package/sensor_classes/ShellySBHT003C.js +17 -17
  21. package/sensor_classes/SwitchBotMeterPlus.js +8 -12
  22. package/sensor_classes/SwitchBotTH.js +11 -16
  23. package/sensor_classes/VictronACCharger.js +5 -5
  24. package/sensor_classes/VictronBatteryMonitor.js +40 -23
  25. package/sensor_classes/VictronDCDCConverter.js +14 -5
  26. package/sensor_classes/VictronDCEnergyMeter.js +26 -7
  27. package/sensor_classes/VictronGXDevice.js +2 -5
  28. package/sensor_classes/VictronInverter.js +18 -14
  29. package/sensor_classes/VictronInverterRS.js +2 -2
  30. package/sensor_classes/VictronLynxSmartBMS.js +3 -5
  31. package/sensor_classes/VictronOrionXS.js +2 -2
  32. package/sensor_classes/VictronSmartBatteryProtect.js +4 -6
  33. package/sensor_classes/VictronSmartLithium.js +18 -18
  34. package/sensor_classes/VictronSolarCharger.js +31 -18
  35. package/sensor_classes/VictronVEBus.js +2 -5
  36. package/sensor_classes/XiaomiMiBeacon.js +17 -18
  37. package/testqueue.js +64 -0
@@ -6,25 +6,38 @@ class VictronSolarCharger extends VictronSensor{
6
6
  return await this.identifyMode(device, 0x01)
7
7
  }
8
8
 
9
- async init() {
10
- await super.init()
11
- this.initMetadata()
12
- }
13
- initMetadata() {
14
- this.addMetadatum('chargeState','', 'charge state',
9
+ initSchema() {
10
+ super.initSchema()
11
+ this.addDefaultParam("id")
12
+
13
+ this.addMetadatum('chargeState','', 'charge state',
15
14
  (buff)=>{return VC.OperationMode.get(buff.readUInt8(0))})
16
- this.addMetadatum('chargerError','', 'charger error',
17
- (buff)=>{return VC.ChargerError.get(buff.readUInt8(1))})
18
- this.addMetadatum('voltage','V', 'charger battery voltage',
19
- (buff)=>{return this.NaNif(buff.readInt16LE(2),0x7FFF)/100})
20
- this.addMetadatum('current','A','charger battery current',
21
- (buff)=>{return this.NaNif(buff.readInt16LE(4),0x7FFF)/10})
22
- this.addMetadatum('yield','Wh', 'yield today in Watt-hours',
23
- (buff)=>{return this.NaNif(buff.readUInt16LE(6),0xFFFF)*10})
24
- this.addMetadatum('solarPower','W', 'solar power',
25
- (buff)=>{return this.NaNif(buff.readUInt16LE(8),0xFFFF)})
26
- this.addMetadatum('externalDeviceLoad','A', 'external device load',
27
- (buff)=>{return this.NaNif(buff.readUInt16LE(10)&0x1FF,0x1FF)/10})
15
+ .default="electrical.solar.{id}.state"
16
+
17
+ this.addMetadatum('chargerError','', 'charger error',
18
+ (buff)=>{return VC.ChargerError.get(buff.readUInt8(1))})
19
+ .default="electrical.solar.{id}.error"
20
+
21
+ this.addMetadatum('voltage','V', 'charger battery voltage',
22
+ (buff)=>{return this.NaNif(buff.readInt16LE(2),0x7FFF)/100})
23
+ .default="electrical.solar.{id}.dc.voltage"
24
+
25
+ this.addMetadatum('current','A','charger battery current',
26
+ (buff)=>{return this.NaNif(buff.readInt16LE(4),0x7FFF)/10})
27
+ .default="electrical.solar.{id}.dc.current"
28
+
29
+ this.addMetadatum('yield','Wh', 'yield today in Watt-hours',
30
+ (buff)=>{return this.NaNif(buff.readUInt16LE(6),0xFFFF)*10})
31
+ .default="electrical.solar.{id}.yieldToday"
32
+
33
+ this.addMetadatum('solarPower','W', 'solar power',
34
+ (buff)=>{return this.NaNif(buff.readUInt16LE(8),0xFFFF)})
35
+ .default="electrical.solar.{id}.panelPower"
36
+
37
+ this.addMetadatum('externalDeviceLoad','A', 'external device load',
38
+ (buff)=>{return this.NaNif(buff.readUInt16LE(10)&0x1FF,0x1FF)/10})
39
+ .default="electrical.solar.{id}.loadCurrent"
40
+
28
41
  }
29
42
  }
30
43
  module.exports=VictronSolarCharger
@@ -9,11 +9,8 @@ class VictronVEBus extends VictronSensor{
9
9
  return await this.identifyMode(device, 0x0C)
10
10
  }
11
11
 
12
- async init() {
13
- await super.init()
14
- this.initMetadata()
15
- }
16
- initMetadata(){
12
+ initSchema(){
13
+ super.initSchema()
17
14
  this.addMetadatum('chargeState','', 'charge state',
18
15
  (buff)=>{return VC.OperationMode.get(buff.readUInt8(0))})
19
16
 
@@ -90,8 +90,6 @@ class XiaomiMiBeacon extends BTSensor{
90
90
  return null
91
91
  }
92
92
  }
93
-
94
- GATTwarning = "WARNING: Xiaomi GATT connections are known to be unreliable on Debian distributions with Bluez 5.55 and up (earlier BlueZ versions are untested). Using GATT on the Xiaomi may put the system Bluetooth stack into an inconsistent state disrupting and disabling other plugin Bluetooth connections. If by some chance you're successful using GATT with the Xiaomi, let the plugin developer know your configuration. Refer to the plugin documentation for getting the Xiamoi bindKey for non-GATT connections and more information on Xiaomi GATT issues."
95
93
 
96
94
  emitValues(buffer){
97
95
  this.emitData("temp", buffer, 0)
@@ -102,13 +100,10 @@ class XiaomiMiBeacon extends BTSensor{
102
100
  return "Xiaomi Inc."
103
101
  }
104
102
  getGATTDescription() {
105
- return this.GATTwarning
103
+ return ""
106
104
  }
105
+
107
106
  initGATTConnection(){
108
- if (!this?.gattWarningDelivered) {
109
- this.debug(this.GATTwarning.toUpperCase())
110
- this.gattWarningDelivered=true
111
- }
112
107
  return new Promise((resolve,reject )=>{
113
108
  this.deviceConnect().then(async ()=>{
114
109
  if (!this.gattServer) {
@@ -202,30 +197,34 @@ class XiaomiMiBeacon extends BTSensor{
202
197
  }
203
198
 
204
199
  async init(){
200
+
205
201
  await super.init()
206
202
  const data = this.getServiceData(this.constructor.SERVICE_MIBEACON)
207
203
  const frameControl = data[0] + (data[1] << 8)
208
204
  this.deviceID = data[2] + (data[3] << 8)
209
205
  this.isEncrypted = (frameControl >> 3) & 1
210
206
  this.encryptionVersion = frameControl >> 12
207
+ }
208
+ initSchema(){
209
+ super.initSchema()
211
210
  this.addParameter(
212
211
  "encryptionKey",
213
212
  {
214
213
  title: "encryptionKey (AKA bindKey) for decryption"
215
214
  }
216
215
  )
217
- this.addMetadatum('temp','K', 'temperature',
218
- (buff,offset)=>{return ((buff.readInt16LE(offset))/10) + 273.15})
219
- this.addMetadatum('humidity','ratio', 'humidity',
220
- (buff,offset)=>{return buff.readInt16LE(offset)/1000})
221
-
222
- this.addMetadatum('batteryStrength', 'ratio', 'sensor battery strength',
223
- (buff,offset)=>{return ((buff.readUInt8(offset))/100)})
224
- this.addMetadatum('voltage', 'V', 'sensor battery voltage',
225
- (buff,offset)=>{return ((buff.readUInt16LE(offset))/1000)})
216
+ this.addDefaultPath('temp','environment.temperature')
217
+ .read=(buff,offset)=>{return ((buff.readInt16LE(offset))/10) + 273.15}
226
218
 
227
-
228
- }
219
+ this.addDefaultPath('humidity','environment.humidity')
220
+ .read=(buff,offset)=>{return buff.readInt16LE(offset)/1000}
221
+
222
+ this.addDefaultPath("batteryStrength", "sensors.batteryStrength")
223
+ .read= (buff,offset)=>{return ((buff.readUInt8(offset))/100)}
224
+
225
+ this.addDefaultPath("voltage", "sensors.batteryVoltage")
226
+ .read=(buff,offset)=>{return ((buff.readUInt16LE(offset))/1000)}
227
+ }
229
228
 
230
229
  getName(){
231
230
  const dt = DEVICE_TYPES.get(this.deviceID)
package/testqueue.js ADDED
@@ -0,0 +1,64 @@
1
+
2
+
3
+ import {createBluetooth} from 'node-ble'
4
+
5
+ import {AutoQueue} from "./Queue.js"
6
+ import {Variant} from 'dbus-next'
7
+
8
+ const {bluetooth, destroy} = createBluetooth()
9
+ const connectQueue = new AutoQueue()
10
+ const adapter = await bluetooth.getAdapter("hci0")
11
+ await adapter.startDiscovery()
12
+
13
+ function deviceConnect(mac) {
14
+
15
+ /* CAUTION: HACK AHEAD
16
+
17
+ Bluez for some cockamamie reason (It's 2025 for chrissake.
18
+ BLUETOOTH ISN'T JUST FOR DESKTOPS ANYMORE, BLUEZ DEVS!)
19
+ SUSPENDS scanning while connected to a device.
20
+
21
+ The next line of code gives the scanner a kick in the arse,
22
+ starting it up again so, I dunno, another device might be able
23
+ to connect and sensor classes could maybe get beacon updates.
24
+
25
+ You know, the little things.
26
+ */
27
+ adapter.waitDevice(mac,(30000)).then((device) =>{
28
+
29
+ return connectQueue.enqueue( async ()=>{
30
+ console.log("Connecting to "+mac)
31
+ try {await device.connect()} catch {(e)=>console.log(e)}
32
+ try {
33
+ console.log("Connected to "+mac)
34
+ console.log("Stopping discovery for "+mac)
35
+
36
+ await adapter.helper.callMethod('StopDiscovery')
37
+ console.log("Discovery stopped for "+mac)
38
+ await adapter.helper.callMethod('SetDiscoveryFilter', {
39
+ Transport: new Variant('s', "le")
40
+ })
41
+ console.log("Starting discovery for "+mac)
42
+ await adapter.helper.callMethod('StartDiscovery')
43
+ console.log("Discovery started for "+mac)
44
+
45
+ } catch (e){
46
+ //probably ignorable error. probably.
47
+ console.log(e)
48
+ }
49
+ })
50
+ })
51
+ /* END HACK*/
52
+ }
53
+ setInterval( ()=>{
54
+ deviceConnect("D1:06:00:C6:16:4A")
55
+ }, 5000)
56
+ setInterval( ()=>{
57
+
58
+ for (const mac of (["D1:06:01:46:49:39","A4:C1:38:3E:7E:94"])){
59
+ try { deviceConnect(mac) } catch { (e)=>console.log(e) }
60
+ }
61
+ }, 10000)
62
+
63
+
64
+