isy-nodejs 1.0.1-alpha.5 → 1.0.1-alpha.9

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 (225) hide show
  1. package/dist/cjs/Converters.js +66 -30
  2. package/dist/cjs/Converters.js.map +1 -1
  3. package/dist/cjs/Definitions/Global/Drivers.js +10 -3
  4. package/dist/cjs/Definitions/Global/Drivers.js.map +1 -1
  5. package/dist/cjs/Definitions/Global/Events.js +1 -2
  6. package/dist/cjs/Definitions/Global/Events.js.map +1 -1
  7. package/dist/cjs/Devices/Elk/ElkAlarmPanelDevice.js +3 -3
  8. package/dist/cjs/Devices/Elk/ElkAlarmSensorDevice.js +9 -6
  9. package/dist/cjs/Devices/Elk/ElkAlarmSensorDevice.js.map +1 -1
  10. package/dist/cjs/Devices/Insteon/InsteonBaseDevice.js +1 -1
  11. package/dist/cjs/Devices/Insteon/InsteonBaseDevice.js.map +1 -1
  12. package/dist/cjs/Devices/Insteon/InsteonFanDevice.js +5 -3
  13. package/dist/cjs/Devices/Insteon/InsteonFanDevice.js.map +1 -1
  14. package/dist/cjs/Devices/Insteon/InsteonMotionSensorDevice.js +5 -5
  15. package/dist/cjs/Devices/Insteon/InsteonRelayDevice.js +3 -9
  16. package/dist/cjs/Devices/Insteon/InsteonRelayDevice.js.map +1 -1
  17. package/dist/cjs/Devices/Insteon/RelayLampSwitch.js +72 -0
  18. package/dist/cjs/Devices/Insteon/RelayLampSwitch.js.map +1 -0
  19. package/dist/cjs/ISY.js +36 -27
  20. package/dist/cjs/ISY.js.map +1 -1
  21. package/dist/cjs/ISYNode.js +12 -9
  22. package/dist/cjs/ISYNode.js.map +1 -1
  23. package/dist/cjs/ISYScene.js +3 -3
  24. package/dist/cjs/ISYScene.js.map +1 -1
  25. package/dist/cjs/Matter/Behaviors/ISYBridgedDeviceBehavior.js +11 -4
  26. package/dist/cjs/Matter/Behaviors/ISYBridgedDeviceBehavior.js.map +1 -1
  27. package/dist/cjs/Matter/Behaviors/ISYClusterBehavior.js +26 -7
  28. package/dist/cjs/Matter/Behaviors/ISYClusterBehavior.js.map +1 -1
  29. package/dist/cjs/Matter/Behaviors/ISYOnOffBehavior.js +9 -7
  30. package/dist/cjs/Matter/Behaviors/ISYOnOffBehavior.js.map +1 -1
  31. package/dist/cjs/Matter/{Server → Bridge}/Server.js +31 -45
  32. package/dist/cjs/Matter/Bridge/Server.js.map +1 -0
  33. package/dist/cjs/Matter/Mappings/Insteon.js +19 -15
  34. package/dist/cjs/Matter/Mappings/Insteon.js.map +1 -1
  35. package/dist/cjs/Matter/Mappings/register.js +1 -0
  36. package/dist/cjs/Matter/Mappings/register.js.map +1 -0
  37. package/dist/cjs/Model/ClusterMap.js +12 -9
  38. package/dist/cjs/Model/ClusterMap.js.map +1 -1
  39. package/dist/cjs/Utils.js +0 -9
  40. package/dist/cjs/Utils.js.map +1 -1
  41. package/dist/cjs/types/Converters.d.ts +28 -8
  42. package/dist/cjs/types/Converters.d.ts.map +1 -1
  43. package/dist/cjs/types/Definitions/Global/Drivers.d.ts +4 -3
  44. package/dist/cjs/types/Definitions/Global/Drivers.d.ts.map +1 -1
  45. package/dist/cjs/types/Definitions/Global/Events.d.ts.map +1 -1
  46. package/dist/cjs/types/Devices/Elk/ElkAlarmSensorDevice.d.ts.map +1 -1
  47. package/dist/cjs/types/Devices/EndpointFor.d.ts +2 -2
  48. package/dist/cjs/types/Devices/Insteon/InsteonDevice.d.ts +4 -4
  49. package/dist/cjs/types/Devices/Insteon/InsteonFanDevice.d.ts.map +1 -1
  50. package/dist/cjs/types/Devices/Insteon/InsteonRelayDevice.d.ts +2 -4
  51. package/dist/cjs/types/Devices/Insteon/InsteonRelayDevice.d.ts.map +1 -1
  52. package/dist/cjs/types/Devices/Insteon/RelayLampSwitch.d.ts +93 -0
  53. package/dist/cjs/types/Devices/Insteon/RelayLampSwitch.d.ts.map +1 -0
  54. package/dist/cjs/types/ISY.d.ts +21 -18
  55. package/dist/cjs/types/ISY.d.ts.map +1 -1
  56. package/dist/cjs/types/ISYNode.d.ts +4 -4
  57. package/dist/cjs/types/ISYNode.d.ts.map +1 -1
  58. package/dist/cjs/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts +16 -6
  59. package/dist/cjs/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts.map +1 -1
  60. package/dist/cjs/types/Matter/Behaviors/ISYClusterBehavior.d.ts +13 -11
  61. package/dist/cjs/types/Matter/Behaviors/ISYClusterBehavior.d.ts.map +1 -1
  62. package/dist/cjs/types/Matter/Behaviors/ISYOnOffBehavior.d.ts +4 -4
  63. package/dist/cjs/types/Matter/Behaviors/ISYOnOffBehavior.d.ts.map +1 -1
  64. package/dist/cjs/types/Matter/Bridge/Server.d.ts +17 -0
  65. package/dist/cjs/types/Matter/Bridge/Server.d.ts.map +1 -0
  66. package/dist/cjs/types/Matter/Mappings/register.d.ts +1 -0
  67. package/dist/cjs/types/Matter/Mappings/register.d.ts.map +1 -0
  68. package/dist/cjs/types/Model/ClusterMap.d.ts +19 -11
  69. package/dist/cjs/types/Model/ClusterMap.d.ts.map +1 -1
  70. package/dist/cjs/types/Utils.d.ts +0 -5
  71. package/dist/cjs/types/Utils.d.ts.map +1 -1
  72. package/dist/esm/Converters.js +63 -28
  73. package/dist/esm/Converters.js.map +1 -1
  74. package/dist/esm/Definitions/Global/Drivers.js +10 -3
  75. package/dist/esm/Definitions/Global/Drivers.js.map +1 -1
  76. package/dist/esm/Definitions/Global/Events.js +1 -2
  77. package/dist/esm/Definitions/Global/Events.js.map +1 -1
  78. package/dist/esm/Devices/Brultech/index.js +4 -0
  79. package/dist/esm/Devices/Brultech/index.js.map +1 -0
  80. package/dist/esm/Devices/Constructor.js +2 -0
  81. package/dist/esm/Devices/Constructor.js.map +1 -0
  82. package/dist/esm/Devices/DeviceFactory.js +13 -0
  83. package/dist/esm/Devices/DeviceFactory.js.map +1 -0
  84. package/dist/esm/Devices/DeviceMap.js +4 -0
  85. package/dist/esm/Devices/DeviceMap.js.map +1 -0
  86. package/dist/esm/Devices/Elk/ElkAlarmPanelDevice.js +181 -0
  87. package/dist/esm/Devices/Elk/ElkAlarmPanelDevice.js.map +1 -0
  88. package/dist/esm/Devices/Elk/ElkAlarmSensorDevice.js +110 -0
  89. package/dist/esm/Devices/Elk/ElkAlarmSensorDevice.js.map +1 -0
  90. package/dist/esm/Devices/EndpointFor.js +31 -0
  91. package/dist/esm/Devices/EndpointFor.js.map +1 -0
  92. package/dist/esm/Devices/ISYDevice.js +35 -0
  93. package/dist/esm/Devices/ISYDevice.js.map +1 -0
  94. package/dist/esm/Devices/ISYDeviceNode.js +62 -0
  95. package/dist/esm/Devices/ISYDeviceNode.js.map +1 -0
  96. package/dist/esm/Devices/ISYMultiNodeDevice.js +89 -0
  97. package/dist/esm/Devices/ISYMultiNodeDevice.js.map +1 -0
  98. package/dist/esm/Devices/Insteon/InsteonBallastDimmerDevice.js +8 -0
  99. package/dist/esm/Devices/Insteon/InsteonBallastDimmerDevice.js.map +1 -0
  100. package/dist/esm/Devices/Insteon/InsteonBaseDevice.js +2 -2
  101. package/dist/esm/Devices/Insteon/InsteonBaseDevice.js.map +1 -1
  102. package/dist/esm/Devices/Insteon/InsteonDimmerOutletDevice.js +7 -0
  103. package/dist/esm/Devices/Insteon/InsteonDimmerOutletDevice.js.map +1 -0
  104. package/dist/esm/Devices/Insteon/InsteonDimmerSwitchDevice.js +8 -0
  105. package/dist/esm/Devices/Insteon/InsteonDimmerSwitchDevice.js.map +1 -0
  106. package/dist/esm/Devices/Insteon/InsteonFanDevice.js +5 -3
  107. package/dist/esm/Devices/Insteon/InsteonFanDevice.js.map +1 -1
  108. package/dist/esm/Devices/Insteon/InsteonKeypadDimmerDevice.js +8 -0
  109. package/dist/esm/Devices/Insteon/InsteonKeypadDimmerDevice.js.map +1 -0
  110. package/dist/esm/Devices/Insteon/InsteonMotionSensorDevice.js +5 -5
  111. package/dist/esm/Devices/Insteon/InsteonRelayDevice.js +3 -9
  112. package/dist/esm/Devices/Insteon/InsteonRelayDevice.js.map +1 -1
  113. package/dist/esm/Devices/Insteon/RelayLampSwitch.js +68 -0
  114. package/dist/esm/Devices/Insteon/RelayLampSwitch.js.map +1 -0
  115. package/dist/esm/Devices/Lutron/index.js +4 -0
  116. package/dist/esm/Devices/Lutron/index.js.map +1 -0
  117. package/dist/esm/Devices/MapsTo.js +2 -0
  118. package/dist/esm/Devices/MapsTo.js.map +1 -0
  119. package/dist/esm/Devices/NCD/index.js +4 -0
  120. package/dist/esm/Devices/NCD/index.js.map +1 -0
  121. package/dist/esm/Devices/NodeFactory.js +48 -0
  122. package/dist/esm/Devices/NodeFactory.js.map +1 -0
  123. package/dist/esm/Devices/Poly/index.js +4 -0
  124. package/dist/esm/Devices/Poly/index.js.map +1 -0
  125. package/dist/esm/Devices/Scene/index.js +4 -0
  126. package/dist/esm/Devices/Scene/index.js.map +1 -0
  127. package/dist/esm/Devices/UDI/index.js +4 -0
  128. package/dist/esm/Devices/UDI/index.js.map +1 -0
  129. package/dist/esm/Devices/ZWave/ZWaveBaseDevice.js +38 -0
  130. package/dist/esm/Devices/ZWave/ZWaveBaseDevice.js.map +1 -0
  131. package/dist/esm/Devices/ZWave/ZWaveDimmerSwitchDevice.js +8 -0
  132. package/dist/esm/Devices/ZWave/ZWaveDimmerSwitchDevice.js.map +1 -0
  133. package/dist/esm/Devices/ZWave/ZWaveLockDevice.js +35 -0
  134. package/dist/esm/Devices/ZWave/ZWaveLockDevice.js.map +1 -0
  135. package/dist/esm/Devices/ZWave/index.js +20 -0
  136. package/dist/esm/Devices/ZWave/index.js.map +1 -0
  137. package/dist/esm/Devices/index.js +9 -0
  138. package/dist/esm/Devices/index.js.map +1 -0
  139. package/dist/esm/ISY.js +35 -26
  140. package/dist/esm/ISY.js.map +1 -1
  141. package/dist/esm/ISYNode.js +13 -10
  142. package/dist/esm/ISYNode.js.map +1 -1
  143. package/dist/esm/ISYScene.js +3 -3
  144. package/dist/esm/ISYScene.js.map +1 -1
  145. package/dist/esm/Matter/Behaviors/ISYBridgedDeviceBehavior.js +11 -4
  146. package/dist/esm/Matter/Behaviors/ISYBridgedDeviceBehavior.js.map +1 -1
  147. package/dist/esm/Matter/Behaviors/ISYClusterBehavior.js +26 -7
  148. package/dist/esm/Matter/Behaviors/ISYClusterBehavior.js.map +1 -1
  149. package/dist/esm/Matter/Behaviors/ISYOnOffBehavior.js +10 -8
  150. package/dist/esm/Matter/Behaviors/ISYOnOffBehavior.js.map +1 -1
  151. package/dist/esm/Matter/{Server → Bridge}/Server.js +29 -44
  152. package/dist/esm/Matter/Bridge/Server.js.map +1 -0
  153. package/dist/esm/Matter/Mappings/Insteon.js +22 -18
  154. package/dist/esm/Matter/Mappings/Insteon.js.map +1 -1
  155. package/dist/esm/Matter/Mappings/register.js +2 -0
  156. package/dist/esm/Matter/Mappings/register.js.map +1 -0
  157. package/dist/esm/Model/ClusterMap.js +12 -9
  158. package/dist/esm/Model/ClusterMap.js.map +1 -1
  159. package/dist/esm/Utils.js +0 -8
  160. package/dist/esm/Utils.js.map +1 -1
  161. package/dist/esm/types/Converters.d.ts +28 -8
  162. package/dist/esm/types/Converters.d.ts.map +1 -1
  163. package/dist/esm/types/Definitions/Global/Drivers.d.ts +4 -3
  164. package/dist/esm/types/Definitions/Global/Drivers.d.ts.map +1 -1
  165. package/dist/esm/types/Definitions/Global/Events.d.ts.map +1 -1
  166. package/dist/esm/types/Devices/Elk/ElkAlarmSensorDevice.d.ts.map +1 -1
  167. package/dist/esm/types/Devices/EndpointFor.d.ts +2 -2
  168. package/dist/esm/types/Devices/Insteon/InsteonDevice.d.ts +4 -4
  169. package/dist/esm/types/Devices/Insteon/InsteonFanDevice.d.ts.map +1 -1
  170. package/dist/esm/types/Devices/Insteon/InsteonRelayDevice.d.ts +2 -4
  171. package/dist/esm/types/Devices/Insteon/InsteonRelayDevice.d.ts.map +1 -1
  172. package/dist/esm/types/Devices/Insteon/RelayLampSwitch.d.ts +93 -0
  173. package/dist/esm/types/Devices/Insteon/RelayLampSwitch.d.ts.map +1 -0
  174. package/dist/esm/types/ISY.d.ts +21 -18
  175. package/dist/esm/types/ISY.d.ts.map +1 -1
  176. package/dist/esm/types/ISYNode.d.ts +4 -4
  177. package/dist/esm/types/ISYNode.d.ts.map +1 -1
  178. package/dist/esm/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts +16 -6
  179. package/dist/esm/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts.map +1 -1
  180. package/dist/esm/types/Matter/Behaviors/ISYClusterBehavior.d.ts +13 -11
  181. package/dist/esm/types/Matter/Behaviors/ISYClusterBehavior.d.ts.map +1 -1
  182. package/dist/esm/types/Matter/Behaviors/ISYOnOffBehavior.d.ts +4 -4
  183. package/dist/esm/types/Matter/Behaviors/ISYOnOffBehavior.d.ts.map +1 -1
  184. package/dist/esm/types/Matter/Bridge/Server.d.ts +17 -0
  185. package/dist/esm/types/Matter/Bridge/Server.d.ts.map +1 -0
  186. package/dist/esm/types/Matter/Mappings/register.d.ts +2 -0
  187. package/dist/esm/types/Matter/Mappings/register.d.ts.map +1 -0
  188. package/dist/esm/types/Model/ClusterMap.d.ts +19 -11
  189. package/dist/esm/types/Model/ClusterMap.d.ts.map +1 -1
  190. package/dist/esm/types/Utils.d.ts +0 -5
  191. package/dist/esm/types/Utils.d.ts.map +1 -1
  192. package/package.json +4 -7
  193. package/src/Converters.ts +137 -69
  194. package/src/Definitions/Global/Drivers.ts +16 -7
  195. package/src/Definitions/Global/Events.ts +4 -3
  196. package/src/Devices/Elk/ElkAlarmPanelDevice.ts +3 -3
  197. package/src/Devices/Elk/ElkAlarmSensorDevice.ts +15 -21
  198. package/src/Devices/Insteon/Generated/RelayLamp.ts +8 -7
  199. package/src/Devices/Insteon/InsteonBaseDevice.ts +2 -2
  200. package/src/Devices/Insteon/InsteonFanDevice.ts +12 -10
  201. package/src/Devices/Insteon/InsteonMotionSensorDevice.ts +5 -5
  202. package/src/Devices/Insteon/InsteonRelayDevice.ts +3 -6
  203. package/src/Devices/Insteon/RelayLampSwitch.ts +131 -0
  204. package/src/ISY.ts +57 -42
  205. package/src/ISYNode.ts +14 -11
  206. package/src/ISYScene.ts +3 -3
  207. package/src/Matter/Behaviors/ISYBridgedDeviceBehavior.ts +29 -11
  208. package/src/Matter/Behaviors/ISYClusterBehavior.ts +46 -28
  209. package/src/Matter/Behaviors/ISYOnOffBehavior.ts +49 -60
  210. package/src/Matter/{Server → Bridge}/Server.ts +50 -50
  211. package/src/Matter/Mappings/Insteon.ts +53 -60
  212. package/src/Matter/Mappings/register.ts +0 -0
  213. package/src/Model/ClassDefinition.ts +1 -1
  214. package/src/Model/ClusterMap.ts +31 -22
  215. package/src/Utils.ts +1 -19
  216. package/tsconfig.json +2 -2
  217. package/LICENSE +0 -22
  218. package/dist/cjs/Matter/Server/Server.js.map +0 -1
  219. package/dist/cjs/types/Matter/Server/Server.d.ts +0 -4
  220. package/dist/cjs/types/Matter/Server/Server.d.ts.map +0 -1
  221. package/dist/esm/Matter/Server/Server.js.map +0 -1
  222. package/dist/esm/types/Matter/Server/Server.d.ts +0 -4
  223. package/dist/esm/types/Matter/Server/Server.d.ts.map +0 -1
  224. package/dist/tsconfig.cjs.tsbuildinfo +0 -1
  225. package/dist/tsconfig.esm.tsbuildinfo +0 -1
@@ -1,5 +1,5 @@
1
1
  import 'winston';
2
- import { Converters } from '../../Converters.js';
2
+ import { Converter } from '../../Converters.js';
3
3
  import type { Command } from '../../Definitions/Global/Commands.js';
4
4
  import { Driver, DriverType } from '../../Definitions/Global/Drivers.js';
5
5
  import { Family, Insteon } from '../../Definitions/Global/Families.js';
@@ -38,7 +38,7 @@ export class InsteonBaseDevice<D extends ISYNode.DriverSignatures = {}, C extend
38
38
  case UOM.DegreeX2:
39
39
  return byteToDegree(value);
40
40
  case UOM.LevelFrom0To255:
41
- return Converters.Standard.LevelFrom0To255.Percent.to(value);
41
+ return Converter.Standard.LevelFrom0To255.Percent.to(value);
42
42
  case UOM.Fahrenheit:
43
43
  return value / 10;
44
44
  default:
@@ -6,12 +6,12 @@ import { InsteonBaseDevice } from './InsteonBaseDevice.js';
6
6
  import { InsteonDimmableDevice } from './InsteonDimmableDevice.js';
7
7
  import 'winston';
8
8
  import type { NodeInfo, StaticNodeInfo } from '../../Model/NodeInfo.js';
9
- import {Insteon} from './index.js';
10
- import { Command, Driver, UnitOfMeasure } from '../../Definitions/index.js';
9
+ import { Insteon } from './index.js';
10
+ import { Command, Driver, UnitOfMeasure } from '../../Definitions/index.js';
11
11
  import type { DriverState } from '../../Model/DriverState.js';
12
12
 
13
13
  export class InsteonFanMotorDevice extends InsteonBaseDevice<Driver.Signatures<'ST'>, Command.Signatures<'DON' | 'DOF'>> {
14
- constructor (isy: ISY, deviceNode: StaticNodeInfo) {
14
+ constructor(isy: ISY, deviceNode: StaticNodeInfo) {
15
15
  super(isy, deviceNode);
16
16
  this.drivers.ST = Driver.create('ST', this, deviceNode.property as DriverState, { uom: UnitOfMeasure.Percent, label: 'Fan Speed (%)', name: 'fanSpeed' });
17
17
  this.hidden = true;
@@ -25,7 +25,7 @@ export class InsteonFanMotorDevice extends InsteonBaseDevice<Driver.Signatures<'
25
25
  }
26
26
 
27
27
  public async updateFanSpeed(level: number) {
28
- return (level);
28
+ return level;
29
29
  }
30
30
  public async updateIsOn(isOn: boolean) {
31
31
  if (!isOn) {
@@ -34,7 +34,6 @@ export class InsteonFanMotorDevice extends InsteonBaseDevice<Driver.Signatures<'
34
34
  //return this.commands.BEEP(States.Level.Max);
35
35
  }
36
36
  }
37
-
38
37
  }
39
38
 
40
39
  export class InsteonFanDevice extends InsteonBaseDevice {
@@ -43,11 +42,11 @@ export class InsteonFanDevice extends InsteonBaseDevice {
43
42
  constructor(isy: ISY, deviceNode: NodeInfo) {
44
43
  super(isy, deviceNode);
45
44
  this.light = new InsteonDimmableDevice(isy, deviceNode);
46
- this.light.events.on('PropertyChanged', ((a: any, b: any, c: any, d: string) => { this.emit('PropertyChanged', `light.${a}`, b, c, d); }).bind(this));
45
+ /*this.light.events.on('PropertyChanged', ((a: any, b: any, c: any, d: string) => { this.emit('PropertyChanged', `light.${a}`, b, c, d); }).bind(this));*/
47
46
  this.addChild(this.light);
48
47
  }
49
48
 
50
- public override handleEvent(event: { control?: string; data?: any; node?: any; }): boolean {
49
+ public override handleEvent(event: { control?: string; data?: any; node?: any }): boolean {
51
50
  this.logger(JSON.stringify(event));
52
51
  const child = this.children.find((p) => p.address === event.node);
53
52
  if (child !== undefined) {
@@ -61,13 +60,16 @@ export class InsteonFanDevice extends InsteonBaseDevice {
61
60
  if (childDevice instanceof InsteonFanMotorDevice) {
62
61
  this.logger('Fan Motor Found');
63
62
  this.motor = childDevice as InsteonFanMotorDevice;
64
- this.motor.events.on('statusChanged', ((a: any, b: any, c: any, d: string) => { this.emit('PropertyChanged', `motor.${a}`, b, c, d); }).bind(this));
63
+ this.motor.events.on(
64
+ 'statusChanged',
65
+ ((a: any, b: any, c: any, d: string) => {
66
+ this.emit('propertyChanged', `motor.${a}`, b, c, d);
67
+ }).bind(this)
68
+ );
65
69
  }
66
70
  }
67
71
 
68
72
  public async updateFanSpeed(level: number) {
69
73
  return this.motor.updateFanSpeed(level);
70
74
  }
71
-
72
-
73
75
  }
@@ -16,13 +16,13 @@ export class InsteonMotionSensorDevice extends InsteonBaseDevice {
16
16
  if (controlName === Commands.On) {
17
17
  this.logger('Motion detected.');
18
18
  this._isMotionDetected = true;
19
- this.emit('ControlTriggered',controlName);
20
- this.emit('PropertyChanged', 'motionDetected', true, false, "true");
19
+ this.emit('controlTriggered',controlName);
20
+ this.emit('propertyChanged', 'motionDetected', true, false, "true");
21
21
 
22
22
  setTimeout(() => {
23
23
  this.logger('No motion detected in last 30 seconds.');
24
24
  this._isMotionDetected = false;
25
- this.emit('PropertyChanged', 'motionDetected', false, true, "false"); /*Included for compatiblity purposes*/
25
+ this.emit('propertyChanged', 'motionDetected', false, true, "false"); /*Included for compatiblity purposes*/
26
26
  }, 30000);
27
27
  return true;
28
28
  }
@@ -30,8 +30,8 @@ export class InsteonMotionSensorDevice extends InsteonBaseDevice {
30
30
  else if (controlName === Commands.Off) {
31
31
  this._isMotionDetected = false;
32
32
  this.logger('No motion detected.');
33
- this.emit('ControlTriggered',controlName);
34
- this.emit('PropertyChanged', 'motionDetected', false, true, "false");
33
+ this.emit('controlTriggered',controlName);
34
+ this.emit('propertyChanged', 'motionDetected', false, true, "false");
35
35
  return true;
36
36
  }
37
37
 
@@ -7,6 +7,7 @@ import { InsteonBaseDevice } from './InsteonBaseDevice.js';
7
7
 
8
8
  import type { OnOffBehavior } from '@project-chip/matter.js/behaviors/on-off';
9
9
  import 'winston';
10
+ import { RelayLampSwitch } from './RelayLampSwitch.js';
10
11
  import type { Command } from '../../Definitions/Global/Commands.js';
11
12
  import { Driver, DriverType } from '../../Definitions/Global/Drivers.js';
12
13
  import { UnitOfMeasure } from '../../Definitions/index.js';
@@ -14,15 +15,11 @@ import { Properties } from '../../ISYConstants.js';
14
15
 
15
16
  import type { DriverState } from '../../Model/DriverState.js';
16
17
 
17
- export class InsteonRelayDevice extends InsteonBaseDevice<Driver.Signatures<'ST' | 'OL' | 'RR' | 'ERR'>, Command.Signatures<'DON' | 'DOF'>> {
18
+ export class InsteonRelayDevice extends RelayLampSwitch.Node /*InsteonBaseDevice<Driver.Signatures<'ST' | 'OL' | 'RR' | 'ERR'>, Command.Signatures<'DON' | 'DOF'>>*/ {
18
19
  // #region Constructors (1)
19
20
 
20
21
  constructor(isy: ISY, nodeInfo: NodeInfo) {
21
22
  super(isy, nodeInfo);
22
- this.drivers.ST = Driver.create('ST', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Percent, label: 'Status', name: 'status' });
23
- this.drivers.OL = Driver.create('OL', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Percent, label: 'On Level', name: 'onLevel' });
24
- this.drivers.RR = Driver.create('RR', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Index, label: 'Ramp Rate', name: 'rampRate' });
25
- this.drivers.ERR = Driver.create('ERR', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Index, label: 'Error', name: 'error' });
26
23
  }
27
24
 
28
25
  // #endregion Constructors (1)
@@ -58,7 +55,7 @@ export class InsteonRelayDevice extends InsteonBaseDevice<Driver.Signatures<'ST'
58
55
 
59
56
  } */
60
57
  public override async sendBeep(level: number = 100): Promise<any> {
61
- return super.sendBeep(level);
58
+ return super.beep(level);
62
59
  }
63
60
 
64
61
  // #endregion Public Methods (2)
@@ -0,0 +1,131 @@
1
+ /* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT DIRECTLY. */
2
+
3
+ import { UnitOfMeasure } from "../../Definitions/Global/UOM.js";
4
+ import { Family } from "../../Definitions/Global/Families.js";
5
+ import type { NodeInfo } from "../../Model/NodeInfo.js";
6
+ import type { ISY } from "../../ISY.js";
7
+ import type { ISYNode } from "../../ISYNode.js";
8
+ import { InsteonBaseDevice } from "./InsteonBaseDevice.js";
9
+ import { ISYDeviceNode } from "../ISYDeviceNode.js";
10
+ import { Driver } from "../../Definitions/Global/Drivers.js";
11
+ import { Insteon } from "../../Definitions/index.js";
12
+ import type { DriverState } from "../../Model/DriverState.js";
13
+ import { NodeFactory } from "../NodeFactory.js";
14
+
15
+ export const nodeDefId = "RelayLampSwitch";
16
+
17
+ type Commands = RelayLampSwitch.Commands;
18
+ type Drivers = RelayLampSwitch.Drivers;
19
+
20
+ export class RelayLampSwitchNode extends InsteonBaseDevice<Drivers, Commands> implements RelayLampSwitch.Interface {
21
+ public override readonly commands = {
22
+ DON: this.on,
23
+ DOF: this.off,
24
+ DFOF: this.fastOff,
25
+ DFON: this.fastOn,
26
+ QUERY: this.query,
27
+ BEEP: this.beep,
28
+ BL: this.backlight,
29
+ WDU: this.writeChanges
30
+ };
31
+ static override nodeDefId = 'RelayLampSwitch';
32
+ declare readonly nodeDefId: 'RelayLampSwitch';
33
+ constructor(isy: ISY, nodeInfo: NodeInfo) {
34
+ super(isy, nodeInfo);
35
+ this.drivers.ST = Driver.create('ST', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Percent, label: 'Status', name: 'status' });
36
+ this.drivers.ERR = Driver.create('ERR', this, nodeInfo.property as DriverState, { uom: UnitOfMeasure.Index, label: 'Responding', name: 'responding' });
37
+ }
38
+ async on(value?: 0 | 100) {
39
+ return this.sendCommand('DON', { value: value });
40
+ }
41
+ async off() {
42
+ return this.sendCommand('DOF');
43
+ }
44
+ async fastOff() {
45
+ return this.sendCommand('DFOF');
46
+ }
47
+ async fastOn() {
48
+ return this.sendCommand('DFON');
49
+ }
50
+ async query() {
51
+ return this.sendCommand('QUERY');
52
+ }
53
+ async beep(value?: number) {
54
+ return this.sendCommand('BEEP', { value: value });
55
+ }
56
+ async backlight(value: number) {
57
+ return this.sendCommand('BL', { value: value });
58
+ }
59
+ async writeChanges() {
60
+ return this.sendCommand('WDU');
61
+ }
62
+ public get status(): Insteon.OnLevelRelay {
63
+ return this.drivers.ST?.value;
64
+ }
65
+ public get responding(): Insteon.Error {
66
+ return this.drivers.ERR?.value;
67
+ }
68
+ }
69
+
70
+ NodeFactory.register(RelayLampSwitchNode);
71
+
72
+ export namespace RelayLampSwitch {
73
+ export interface Interface extends Omit<InstanceType<typeof RelayLampSwitchNode>, keyof ISYDeviceNode<any, any, any, any>> {
74
+ nodeDefId: "RelayLampSwitch";
75
+ }
76
+ export function is(node: ISYNode<any, any, any, any>): node is RelayLampSwitchNode {
77
+ return node.nodeDefId === nodeDefId;
78
+ }
79
+ export function create(isy: ISY, nodeInfo: NodeInfo) {
80
+ return new RelayLampSwitchNode(isy, nodeInfo);
81
+ }
82
+ export const Node = RelayLampSwitchNode;
83
+ export type Commands = {
84
+ DON: ((value?: (0 | 100)) => Promise<boolean>) & {
85
+ label: "On";
86
+ name: "on";
87
+ };
88
+ DOF: (() => Promise<boolean>) & {
89
+ label: "Off";
90
+ name: "off";
91
+ };
92
+ DFOF: (() => Promise<boolean>) & {
93
+ label: "Fast Off";
94
+ name: "fastOff";
95
+ };
96
+ DFON: (() => Promise<boolean>) & {
97
+ label: "Fast On";
98
+ name: "fastOn";
99
+ };
100
+ QUERY: (() => Promise<boolean>) & {
101
+ label: "Query";
102
+ name: "query";
103
+ };
104
+ BEEP: ((value?: number) => Promise<boolean>) & {
105
+ label: "Beep";
106
+ name: "beep";
107
+ };
108
+ BL: ((value: number) => Promise<boolean>) & {
109
+ label: "Backlight";
110
+ name: "backlight";
111
+ };
112
+ WDU: (() => Promise<boolean>) & {
113
+ label: "Write Changes";
114
+ name: "writeChanges";
115
+ };
116
+ };
117
+ export type Drivers = {
118
+ ST: {
119
+ uom: UnitOfMeasure.Percent;
120
+ value: Insteon.OnLevelRelay;
121
+ label: "Status";
122
+ name: "status";
123
+ };
124
+ ERR: {
125
+ uom: UnitOfMeasure.Index;
126
+ value: Insteon.Error;
127
+ label: "Responding";
128
+ name: "responding";
129
+ };
130
+ };
131
+ }
package/src/ISY.ts CHANGED
@@ -10,7 +10,6 @@ import { EventEmitter } from 'events';
10
10
  import winston, { format, Logger, loggers, type LeveledLogMethod } from 'winston';
11
11
  import { Category } from './Definitions/Global/Categories.js';
12
12
  import { Family } from './Definitions/Global/Families.js';
13
- import type { NodeInfo } from './Model/NodeInfo.js';
14
13
  import { DeviceFactory } from './Devices/DeviceFactory.js';
15
14
  import { ELKAlarmPanelDevice } from './Devices/Elk/ElkAlarmPanelDevice.js';
16
15
  import { ElkAlarmSensorDevice } from './Devices/Elk/ElkAlarmSensorDevice.js';
@@ -31,13 +30,14 @@ import { InsteonOnOffOutletDevice } from './Devices/Insteon/InsteonOnOffOutletDe
31
30
  import { InsteonRelayDevice } from './Devices/Insteon/InsteonRelayDevice.js';
32
31
  import { InsteonSmokeSensorDevice } from './Devices/Insteon/InsteonSmokeSensorDevice.js';
33
32
  import { InsteonThermostatDevice } from './Devices/Insteon/InsteonThermostatDevice.js';
33
+ import { ISYDeviceNode } from './Devices/ISYDeviceNode.js';
34
34
  import { EventType } from './Events/EventType.js';
35
35
  import { NodeType, Props, States, VariableType } from './ISYConstants.js';
36
- import { ISYNode } from './ISYNode.js';
37
- import { ISYDeviceNode } from './Devices/ISYDeviceNode.js';
38
36
  import { type ISYDevice } from './ISYDevice.js';
37
+ import { ISYNode } from './ISYNode.js';
39
38
  import { ISYScene } from './ISYScene.js';
40
39
  import { ISYVariable } from './ISYVariable.js';
40
+ import type { NodeInfo } from './Model/NodeInfo.js';
41
41
 
42
42
  import * as Utils from './Utils.js';
43
43
 
@@ -118,6 +118,21 @@ const parser = new Parser(defaultParserOptions);
118
118
 
119
119
  export let Controls = {};
120
120
 
121
+ interface ISYConfig {
122
+ // #region Properties (8)
123
+
124
+ displayNameFormat?: string;
125
+ elkEnabled?: boolean;
126
+ enableWebSocket?: boolean;
127
+ host: string;
128
+ password: string;
129
+ port: number;
130
+ protocol: 'http' | 'https';
131
+ username: string;
132
+
133
+ // #endregion Properties (8)
134
+ }
135
+
121
136
  export class ISY extends EventEmitter implements Disposable {
122
137
  // #region Properties (30)
123
138
 
@@ -158,20 +173,7 @@ export class ISY extends EventEmitter implements Disposable {
158
173
 
159
174
  // #region Constructors (1)
160
175
 
161
- constructor(
162
- config: {
163
- host: string;
164
- port: number;
165
- protocol: 'http' | 'https';
166
- username: string;
167
- password: string;
168
- enableWebSocket?: boolean;
169
- displayNameFormat?: string;
170
- elkEnabled?: boolean;
171
- },
172
- logger: Logger = new Logger(),
173
- storagePath?: string
174
- ) {
176
+ constructor(config: ISYConfig, logger: Logger = new Logger(), storagePath?: string) {
175
177
  super();
176
178
  this.enableWebSocket = config.enableWebSocket ?? true;
177
179
  this.storagePath = storagePath ?? './';
@@ -218,7 +220,15 @@ export class ISY extends EventEmitter implements Disposable {
218
220
 
219
221
  // #endregion Public Getters And Setters (2)
220
222
 
221
- // #region Public Methods (22)
223
+ // #region Public Methods (24)
224
+
225
+ [Symbol.dispose](): void {
226
+ try {
227
+ this.webSocket?.close();
228
+ } catch (e) {
229
+ this.logger.error(`Error closing websocket: ${e.message}`);
230
+ }
231
+ }
222
232
 
223
233
  public override emit(event: 'InitializeCompleted' | 'NodeAdded' | 'NodeRemoved' | 'NodeChanged', node?: ISYNode<any, any, any, any>): boolean {
224
234
  return super.emit(event, node);
@@ -239,6 +249,10 @@ export class ISY extends EventEmitter implements Disposable {
239
249
  return s as T;
240
250
  }
241
251
 
252
+ public getElkAlarmPanel() {
253
+ return this.elkAlarmPanel;
254
+ }
255
+
242
256
  public getNode<T extends ISYNode<any, any, any, any> = ISYNode<any, any, any, any>>(address: string, parentsOnly = false): T {
243
257
  let s = this.nodeMap.get(address);
244
258
  if (!parentsOnly) {
@@ -254,10 +268,6 @@ export class ISY extends EventEmitter implements Disposable {
254
268
  return s as T;
255
269
  }
256
270
 
257
- public getElkAlarmPanel() {
258
- return this.elkAlarmPanel;
259
- }
260
-
261
271
  public getScene(address: string) {
262
272
  return this.sceneList.get(address);
263
273
  }
@@ -569,12 +579,13 @@ export class ISY extends EventEmitter implements Disposable {
569
579
  trailingSlash: boolean;
570
580
  requestLogLevel?: any;
571
581
  responseLogLevel?: any;
582
+ errorLogLevel?: any;
572
583
  } = { trailingSlash: true }
573
584
  ): Promise<any> {
574
- const requestLogLevel = options.requestLogLevel ?? winston.config.cli.levels.debug;
575
- const responseLogLevel = options.responseLogLevel ?? winston.config.cli.levels.silly;
585
+ const requestLogLevel = options.requestLogLevel ?? 'debug';
586
+ const responseLogLevel = options.responseLogLevel ?? 'silly';
576
587
  url = `${this.protocol}://${this.address}/rest/${url}${options.trailingSlash ? '/' : ''}`;
577
- this.logger.log(`Sending request: ${url}`, requestLogLevel);
588
+ this.logger.log(requestLogLevel, `Sending request: ${url}`);
578
589
  try {
579
590
  const response = await axios.get(url, {
580
591
  auth: { username: this.credentials.username, password: this.credentials.password }
@@ -585,19 +596,22 @@ export class ISY extends EventEmitter implements Disposable {
585
596
  if (options.parserOptions) curParser = new Parser({ ...defaultParserOptions, ...options.parserOptions });
586
597
  var altParser = new XMLParser(defaultXMLParserOptions);
587
598
  var s = altParser.parse(response.data);
588
- this.logger.log(`Response: ${JSON.stringify(s)}`, requestLogLevel ?? 'debug');
599
+ this.logger.log(requestLogLevel ?? 'debug', `Response: ${JSON.stringify(s)}`);
589
600
  return s;
590
601
  } else if (response.headers['content-type'].toString().includes('json')) {
591
- this.logger.log(`Response: ${JSON.stringify(response.data)}`, requestLogLevel ?? 'debug');
602
+ this.logger.log(responseLogLevel ?? 'debug', `Response: ${JSON.stringify(response.data)}`);
592
603
  return JSON.parse(response.data);
593
604
  } else {
594
- this.logger.log(`Response Header: ${JSON.stringify(response.headers)} Response: ${JSON.stringify(response.data)}`, responseLogLevel ?? 'debug');
605
+ this.logger.log(responseLogLevel ?? 'debug', `Response Header: ${JSON.stringify(response.headers)} Response: ${JSON.stringify(response.data)}`);
595
606
  return response.data;
596
607
  }
597
608
  }
598
609
  } catch (error) {
599
- this.logger.error(`Error sending request to ISY: ${error?.message}`);
600
- throw new Error(`Error sending request to ISY: ${JSON.stringify(error)}`);
610
+ if (options.errorLogLevel) {
611
+ this.logger.log(options.errorLogLevel, `Error sending request to ISY: ${error?.message}`);
612
+ } else {
613
+ this.logger.error(`Error sending request to ISY: ${error?.message}`);
614
+ }
601
615
  }
602
616
  }
603
617
 
@@ -608,11 +622,15 @@ export class ISY extends EventEmitter implements Disposable {
608
622
  return this.sendRequest(uriToUse);
609
623
  }
610
624
 
611
- public variableChangedHandler(variable: { id: string; type: string }) {
625
+ #variableChangedHandler(variable: { id: string; type: string }) {
612
626
  this.logger.info(`Variable: ${variable.id} (${variable.type}) changed`);
613
627
  }
614
628
 
615
- // #endregion Public Methods (22)
629
+ public close() {
630
+ if (this.webSocket) this.webSocket.close();
631
+ }
632
+
633
+ // #endregion Public Methods (24)
616
634
 
617
635
  // #region Private Methods (11)
618
636
 
@@ -649,12 +667,13 @@ export class ISY extends EventEmitter implements Disposable {
649
667
  }
650
668
  }
651
669
 
652
- #guardian() {
670
+ async #guardian() {
653
671
  const timeNow = new Date();
654
672
 
655
673
  if (Number(timeNow) - Number(this.lastActivity) > 60000) {
656
674
  this.logger.info('Guardian: Detected no activity in more then 60 seconds. Reinitializing web sockets');
657
- this.initializeWebSocket();
675
+ await this.refreshStatuses();
676
+ await this.initializeWebSocket();
658
677
  }
659
678
  }
660
679
 
@@ -802,13 +821,9 @@ export class ISY extends EventEmitter implements Disposable {
802
821
  }
803
822
  }
804
823
 
805
- [Symbol.dispose](): void {
806
- try {
807
- this.webSocket.close();
808
- } catch (e) {
809
- this.logger.error(`Error closing websocket: ${e.message}`);
810
- }
811
- }
812
-
813
824
  // #endregion Private Methods (11)
814
825
  }
826
+
827
+ export namespace ISY {
828
+ export interface Config extends ISYConfig {}
829
+ }
package/src/ISYNode.ts CHANGED
@@ -6,7 +6,7 @@ import { UnitOfMeasure } from './Definitions/Global/UOM.js';
6
6
  import { ISY, NodeType, type ISYScene } from './ISY.js';
7
7
 
8
8
  import { CliConfigSetLevels } from 'winston/lib/winston/config/index.js';
9
- import { Converters } from './Converters.js';
9
+ import { Converter } from './Converters.js';
10
10
  import type { Command } from './Definitions/Global/Commands.js';
11
11
  import { Event } from './Definitions/Global/Events.js';
12
12
  import type { Constructor } from './Devices/Constructor.js';
@@ -168,7 +168,7 @@ export class ISYNode<
168
168
  if (from === to) return value;
169
169
  else {
170
170
  try {
171
- return Converters.Standard[from][to].from(value);
171
+ return Converter.Standard[from][to].from(value);
172
172
  } catch {
173
173
  this.isy.logger.error(`Conversion from ${UnitOfMeasure[from]} to ${UnitOfMeasure[to]} not supported.`);
174
174
  } finally {
@@ -191,7 +191,7 @@ export class ISYNode<
191
191
  }
192
192
  }
193
193
 
194
- public emit(event: 'PropertyChanged' | 'ControlTriggered', propertyName?: string, newValue?: any, oldValue?: any, formattedValue?: string, controlName?: string) {
194
+ public emit(event: 'propertyChanged' | 'controlTriggered', propertyName?: string, newValue?: any, oldValue?: any, formattedValue?: string, controlName?: string) {
195
195
  //if ('PropertyChanged') return super.emit(event, propertyName, newValue, oldValue, formattedValue);
196
196
  //else if ('ControlTriggered') return super.emit(event, controlName);
197
197
  }
@@ -232,7 +232,7 @@ export class ISYNode<
232
232
 
233
233
  public handleControlTrigger(controlName: keyof E & keyof C): boolean {
234
234
  //this.lastChanged = new Date();
235
- this.events.emit('ControlTriggered', controlName);
235
+ this.events.emit('controlTriggered', controlName);
236
236
  return true;
237
237
  }
238
238
 
@@ -253,22 +253,25 @@ export class ISYNode<
253
253
  } else {
254
254
  // this.logger(event.control);
255
255
  const e = event.control;
256
- const dispName = this.commands[e].name;
256
+ const dispName = this.commands[e]?.name;
257
257
  if (dispName !== undefined && dispName !== null) {
258
- this.logger(`Command ${dispName} (${e}) triggered.`);
258
+ this.logger(`Command ${dispName} (${e}) event sent.`);
259
259
  } else {
260
- this.logger(`Command ${e} triggered.`);
260
+ this.logger(`Command ${e} event sent.`);
261
261
  }
262
262
  this.handleControlTrigger(e);
263
263
  return true;
264
264
  }
265
265
  }
266
266
 
267
- public handlePropertyChange(propertyName: StringKeys<D>, value: any, uom: UnitOfMeasure, formattedValue: string, prec?: number): boolean {
267
+ public handlePropertyChange(propertyName: StringKeys<D>, value: any, uom: UnitOfMeasure, prec?: number, formattedValue?: string): boolean {
268
268
  this.lastChanged = new Date();
269
- const oldValue = this.drivers[propertyName].value;
270
- if (this.drivers[propertyName].patch(value, formattedValue, uom, prec)) {
271
- this.emit('PropertyChanged', propertyName, value, oldValue, formattedValue);
269
+ let driver = this.drivers[propertyName];
270
+ this.logger(`Driver ${propertyName} (${driver?.label} value update ${value} (${formattedValue}) uom: ${UnitOfMeasure[uom]} event received.`);
271
+ const oldValue = driver?.value;
272
+ if (driver?.patch(value, formattedValue, uom, prec)) {
273
+ this.logger(`Driver ${driver.label} updated from ${oldValue} to ${value} (${formattedValue})`);
274
+ this.emit('propertyChanged', propertyName, value, oldValue, formattedValue);
272
275
  this.scenes?.forEach((element) => {
273
276
  this.logger(`Recalulating ${element.deviceFriendlyName}`);
274
277
  element.recalculateState();
package/src/ISYScene.ts CHANGED
@@ -77,7 +77,7 @@ export class ISYScene extends ISYNode<Family.Scene, Driver.Signatures<'ST'>,Comm
77
77
  get isOn() {
78
78
  for (const device of this.members) {
79
79
  if (device instanceof Insteon.Relay) {
80
- if (device.drivers.ST?.value === 1) {
80
+ if (device.drivers.ST?.value != 0) {
81
81
  return true;
82
82
  }
83
83
  }
@@ -110,10 +110,10 @@ export class ISYScene extends ISYNode<Family.Scene, Driver.Signatures<'ST'>,Comm
110
110
  }
111
111
  public markAsChanged() {
112
112
  this.lastChanged = new Date();
113
- this.emit('PropertyChanged', 'isOn', this.isOn, this.isOn, this.isOn ? 'on' : 'off');
113
+ this.emit('propertyChanged', 'isOn', this.isOn, this.isOn, this.isOn ? 'on' : 'off');
114
114
 
115
115
  if (this.isDimmable) {
116
- this.emit('PropertyChanged', 'brightnesslevel', this.brightnessLevel, this.brightnessLevel, this.brightnessLevel + '%');
116
+ this.emit('propertyChanged', 'brightnesslevel', this.brightnessLevel, this.brightnessLevel, this.brightnessLevel + '%');
117
117
 
118
118
  }
119
119
  }
@@ -11,11 +11,11 @@ import internal from 'stream';
11
11
  import type { Driver } from '../../Definitions/Global/Drivers.js';
12
12
  import { ISY, type Family, type ISYNode } from '../../ISY.js';
13
13
  import type { ISYDevice } from '../../ISYDevice.js';
14
- import { DeviceToClusterMap, MappingRegistry, type ClusterMapping } from '../../Model/ClusterMap.js';
14
+ import { DeviceToClusterMap, MappingRegistry, type ClusterMapping, type BehaviorMapping } from '../../Model/ClusterMap.js';
15
15
 
16
16
 
17
17
  type ClusterForBehavior<B extends ClusterBehavior> = B extends ClusterBehavior.Type<infer C> ? C : never;
18
- export class ISYBridgedDeviceBehavior extends Behavior {
18
+ export class ISYBridgedDeviceBehavior<N extends ISYNode<any, D, any, any>, D extends ISYNode.DriverSignatures = ISYNode.DriverSignatures> extends Behavior {
19
19
  static override readonly id = 'isyNode';
20
20
 
21
21
  static override readonly early = true;
@@ -23,16 +23,24 @@ export class ISYBridgedDeviceBehavior extends Behavior {
23
23
  declare internal: ISYBridgedDeviceBehavior.Internal;
24
24
  declare state: ISYBridgedDeviceBehavior.State;
25
25
 
26
- declare events: ISYBridgedDeviceBehavior.Events;
26
+ declare events: ISYBridgedDeviceBehavior.Events & ISYBridgedDeviceBehavior.EventsFor<N["drivers"]>;
27
27
 
28
28
  override async initialize(_options?: {}) {
29
29
  await super.initialize(_options);
30
30
  var address = this.state.address;
31
- this.internal.device = ISY.instance.nodeMap.get(this.state.address);
32
- this.internal.map = MappingRegistry.getMapping(this.internal.device as unknown as ISYDevice<Family, any, any, any>);
31
+ const d = ISY.instance.nodeMap.get(this.state.address);
32
+ this.internal.device = d;
33
+ this.internal.map = MappingRegistry.getMapping(this.internal.device as unknown as ISYNode<Family, any, any, any>);
33
34
  ISY.instance.logger.debug(`Initializing ${this.constructor.name} for ${this.internal.device.constructor.name} ${this.internal.device.name} with address ${address}`);
34
- if (this.internal.device) {
35
- this.internal.device.events.on('PropertyChanged', this.handlePropertyChange.bind(this));
35
+ if (d) {
36
+ d.events.on('PropertyChanged', this.handlePropertyChange.bind(this));
37
+ for(const f in d.drivers)
38
+ {
39
+ let evt = `${d.drivers[f].name}Changed`;
40
+ this.events[evt] = Observable<[{ driver: string; newValue: any; oldValue: any; formattedValue: string }]>();
41
+ //@ts-ignore
42
+ d.events.on(evt, (driver: string, newValue: any, oldValue: any, formattedValue: string) => this.events.emit(evt, { driver, newValue, oldValue, formattedValue } as unknown as any));
43
+ }
36
44
  }
37
45
  }
38
46
 
@@ -44,15 +52,15 @@ export class ISYBridgedDeviceBehavior extends Behavior {
44
52
  return this.internal.map;
45
53
  }
46
54
 
47
- mapForBehavior<B extends { cluster: unknown }>(behavior: B): ClusterMapping<B['cluster'], typeof this.internal.device> {
48
- return this.map[behavior.cluster['name']];
55
+ mapForBehavior<B extends ClusterBehavior>(behavior: B): BehaviorMapping<B, typeof this.internal.device> {
56
+ return this.map.mapping[behavior.cluster['name']];
49
57
  }
50
58
 
51
59
  handlePropertyChange(driver: string, newValue: any, oldValue: any, formattedValue: string) {
52
60
  this.events.propertyChanged.emit({ driver, newValue, oldValue, formattedValue });
53
61
  }
54
62
 
55
- [Symbol.asyncDispose]() {
63
+ override [Symbol.asyncDispose]() {
56
64
  this.internal.device = null;
57
65
  return super[Symbol.asyncDispose]();
58
66
  }
@@ -64,8 +72,18 @@ export namespace ISYBridgedDeviceBehavior {
64
72
  map?: DeviceToClusterMap<typeof this.device, any>;
65
73
  }
66
74
 
67
- export class Events extends EventEmitter {
75
+ export type EventsFor<D extends {[x: string]: Driver<any,any,any>}> = {
76
+ [s in keyof D as `${D[s]["name"]}Changed`] : Observable<[{ driver: s; newValue: any; oldValue: any; formattedValue: string }]>;
77
+ }
78
+
79
+
80
+
81
+
82
+ export class Events extends EventEmitter{
68
83
  propertyChanged = Observable<[{ driver: string; newValue: any; oldValue: any; formattedValue: string }]>();
84
+
85
+
86
+
69
87
  }
70
88
 
71
89
  export class State {