isy-nodejs 1.0.1-alpha.2 → 1.0.1-alpha.21
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.
- package/dist/cjs/Converters.js +66 -30
- package/dist/cjs/Converters.js.map +1 -1
- package/dist/cjs/Definitions/Global/Drivers.js +10 -3
- package/dist/cjs/Definitions/Global/Drivers.js.map +1 -1
- package/dist/cjs/Definitions/Global/Events.js +1 -2
- package/dist/cjs/Definitions/Global/Events.js.map +1 -1
- package/dist/cjs/Devices/Elk/ElkAlarmPanelDevice.js +3 -3
- package/dist/cjs/Devices/Elk/ElkAlarmSensorDevice.js +9 -6
- package/dist/cjs/Devices/Elk/ElkAlarmSensorDevice.js.map +1 -1
- package/dist/cjs/Devices/Insteon/InsteonBaseDevice.js +5 -3
- package/dist/cjs/Devices/Insteon/InsteonBaseDevice.js.map +1 -1
- package/dist/cjs/Devices/Insteon/InsteonFanDevice.js +7 -3
- package/dist/cjs/Devices/Insteon/InsteonFanDevice.js.map +1 -1
- package/dist/cjs/Devices/Insteon/InsteonMotionSensorDevice.js +5 -5
- package/dist/cjs/Devices/Insteon/InsteonRelayDevice.js +3 -8
- package/dist/cjs/Devices/Insteon/InsteonRelayDevice.js.map +1 -1
- package/dist/cjs/Devices/Insteon/RelayLampSwitch.js +72 -0
- package/dist/cjs/Devices/Insteon/RelayLampSwitch.js.map +1 -0
- package/dist/cjs/ISY.js +58 -43
- package/dist/cjs/ISY.js.map +1 -1
- package/dist/cjs/ISYNode.js +15 -12
- package/dist/cjs/ISYNode.js.map +1 -1
- package/dist/cjs/ISYScene.js +3 -3
- package/dist/cjs/ISYScene.js.map +1 -1
- package/dist/cjs/Matter/Behaviors/ISYBridgedDeviceBehavior.js +11 -4
- package/dist/cjs/Matter/Behaviors/ISYBridgedDeviceBehavior.js.map +1 -1
- package/dist/cjs/Matter/Behaviors/ISYClusterBehavior.js +26 -7
- package/dist/cjs/Matter/Behaviors/ISYClusterBehavior.js.map +1 -1
- package/dist/cjs/Matter/Behaviors/ISYOnOffBehavior.js +11 -8
- package/dist/cjs/Matter/Behaviors/ISYOnOffBehavior.js.map +1 -1
- package/dist/cjs/Matter/{Server → Bridge}/Server.js +88 -51
- package/dist/cjs/Matter/Bridge/Server.js.map +1 -0
- package/dist/cjs/Matter/Mappings/Insteon.js +19 -15
- package/dist/cjs/Matter/Mappings/Insteon.js.map +1 -1
- package/dist/cjs/Matter/Mappings/register.js +1 -0
- package/dist/cjs/Matter/Mappings/register.js.map +1 -0
- package/dist/cjs/Model/ClusterMap.js +12 -9
- package/dist/cjs/Model/ClusterMap.js.map +1 -1
- package/dist/cjs/Utils.js +60 -9
- package/dist/cjs/Utils.js.map +1 -1
- package/dist/cjs/types/CodeGeneration/EnumFactory.d.ts +1 -1
- package/dist/cjs/types/Converters.d.ts +28 -8
- package/dist/cjs/types/Converters.d.ts.map +1 -1
- package/dist/cjs/types/Definitions/Global/Drivers.d.ts +4 -3
- package/dist/cjs/types/Definitions/Global/Drivers.d.ts.map +1 -1
- package/dist/cjs/types/Definitions/Global/Events.d.ts.map +1 -1
- package/dist/cjs/types/Devices/Elk/ElkAlarmSensorDevice.d.ts.map +1 -1
- package/dist/cjs/types/Devices/EndpointFor.d.ts +2 -2
- package/dist/cjs/types/Devices/Insteon/InsteonBaseDevice.d.ts +3 -3
- package/dist/cjs/types/Devices/Insteon/InsteonBaseDevice.d.ts.map +1 -1
- package/dist/cjs/types/Devices/Insteon/InsteonDevice.d.ts +4 -4
- package/dist/cjs/types/Devices/Insteon/InsteonFanDevice.d.ts +5 -4
- package/dist/cjs/types/Devices/Insteon/InsteonFanDevice.d.ts.map +1 -1
- package/dist/cjs/types/Devices/Insteon/InsteonRelayDevice.d.ts +2 -4
- package/dist/cjs/types/Devices/Insteon/InsteonRelayDevice.d.ts.map +1 -1
- package/dist/cjs/types/Devices/Insteon/RelayLampSwitch.d.ts +93 -0
- package/dist/cjs/types/Devices/Insteon/RelayLampSwitch.d.ts.map +1 -0
- package/dist/cjs/types/ISY.d.ts +27 -21
- package/dist/cjs/types/ISY.d.ts.map +1 -1
- package/dist/cjs/types/ISYNode.d.ts +4 -4
- package/dist/cjs/types/ISYNode.d.ts.map +1 -1
- package/dist/cjs/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts +16 -6
- package/dist/cjs/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts.map +1 -1
- package/dist/cjs/types/Matter/Behaviors/ISYClusterBehavior.d.ts +13 -11
- package/dist/cjs/types/Matter/Behaviors/ISYClusterBehavior.d.ts.map +1 -1
- package/dist/cjs/types/Matter/Behaviors/ISYOnOffBehavior.d.ts +4 -4
- package/dist/cjs/types/Matter/Behaviors/ISYOnOffBehavior.d.ts.map +1 -1
- package/dist/cjs/types/Matter/Bridge/Server.d.ts +27 -0
- package/dist/cjs/types/Matter/Bridge/Server.d.ts.map +1 -0
- package/dist/cjs/types/Matter/Mappings/register.d.ts +1 -0
- package/dist/cjs/types/Matter/Mappings/register.d.ts.map +1 -0
- package/dist/cjs/types/Model/ClusterMap.d.ts +19 -11
- package/dist/cjs/types/Model/ClusterMap.d.ts.map +1 -1
- package/dist/cjs/types/Utils.d.ts +3 -5
- package/dist/cjs/types/Utils.d.ts.map +1 -1
- package/dist/esm/Converters.js +63 -28
- package/dist/esm/Converters.js.map +1 -1
- package/dist/esm/Definitions/Global/Drivers.js +10 -3
- package/dist/esm/Definitions/Global/Drivers.js.map +1 -1
- package/dist/esm/Definitions/Global/Events.js +1 -2
- package/dist/esm/Definitions/Global/Events.js.map +1 -1
- package/dist/esm/Devices/Brultech/index.js +4 -0
- package/dist/esm/Devices/Brultech/index.js.map +1 -0
- package/dist/esm/Devices/Constructor.js +2 -0
- package/dist/esm/Devices/Constructor.js.map +1 -0
- package/dist/esm/Devices/DeviceFactory.js +13 -0
- package/dist/esm/Devices/DeviceFactory.js.map +1 -0
- package/dist/esm/Devices/DeviceMap.js +4 -0
- package/dist/esm/Devices/DeviceMap.js.map +1 -0
- package/dist/esm/Devices/Elk/ElkAlarmPanelDevice.js +181 -0
- package/dist/esm/Devices/Elk/ElkAlarmPanelDevice.js.map +1 -0
- package/dist/esm/Devices/Elk/ElkAlarmSensorDevice.js +110 -0
- package/dist/esm/Devices/Elk/ElkAlarmSensorDevice.js.map +1 -0
- package/dist/esm/Devices/EndpointFor.js +31 -0
- package/dist/esm/Devices/EndpointFor.js.map +1 -0
- package/dist/esm/Devices/ISYDevice.js +35 -0
- package/dist/esm/Devices/ISYDevice.js.map +1 -0
- package/dist/esm/Devices/ISYDeviceNode.js +62 -0
- package/dist/esm/Devices/ISYDeviceNode.js.map +1 -0
- package/dist/esm/Devices/ISYMultiNodeDevice.js +89 -0
- package/dist/esm/Devices/ISYMultiNodeDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonBallastDimmerDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonBallastDimmerDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonBaseDevice.js +49 -0
- package/dist/esm/Devices/Insteon/InsteonBaseDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonCOSensorDevice.js +14 -0
- package/dist/esm/Devices/Insteon/InsteonCOSensorDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDevice.js +17 -0
- package/dist/esm/Devices/Insteon/InsteonDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDeviceFactory.js +875 -0
- package/dist/esm/Devices/Insteon/InsteonDeviceFactory.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDimmableDevice.js +32 -0
- package/dist/esm/Devices/Insteon/InsteonDimmableDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDimmerOutletDevice.js +7 -0
- package/dist/esm/Devices/Insteon/InsteonDimmerOutletDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDimmerSwitchDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonDimmerSwitchDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonDoorWindowSensorDevice.js +11 -0
- package/dist/esm/Devices/Insteon/InsteonDoorWindowSensorDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonFanDevice.js +60 -0
- package/dist/esm/Devices/Insteon/InsteonFanDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadDimmerDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadDimmerDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadRelayDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonKeypadRelayDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonLeakSensorDevice.js +11 -0
- package/dist/esm/Devices/Insteon/InsteonLeakSensorDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonLockDevice.js +32 -0
- package/dist/esm/Devices/Insteon/InsteonLockDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonMotionSensorDevice.js +36 -0
- package/dist/esm/Devices/Insteon/InsteonMotionSensorDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonOnOffOutletDevice.js +19 -0
- package/dist/esm/Devices/Insteon/InsteonOnOffOutletDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonRelayDevice.js +41 -0
- package/dist/esm/Devices/Insteon/InsteonRelayDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonRelaySwitchDevice.js +8 -0
- package/dist/esm/Devices/Insteon/InsteonRelaySwitchDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonSmokeSensorDevice.js +11 -0
- package/dist/esm/Devices/Insteon/InsteonSmokeSensorDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/InsteonThermostatDevice.js +30 -0
- package/dist/esm/Devices/Insteon/InsteonThermostatDevice.js.map +1 -0
- package/dist/esm/Devices/Insteon/RelayLampSwitch.js +68 -0
- package/dist/esm/Devices/Insteon/RelayLampSwitch.js.map +1 -0
- package/dist/esm/Devices/Insteon/index.js +31 -0
- package/dist/esm/Devices/Insteon/index.js.map +1 -0
- package/dist/esm/Devices/Lutron/index.js +4 -0
- package/dist/esm/Devices/Lutron/index.js.map +1 -0
- package/dist/esm/Devices/MapsTo.js +2 -0
- package/dist/esm/Devices/MapsTo.js.map +1 -0
- package/dist/esm/Devices/NCD/index.js +4 -0
- package/dist/esm/Devices/NCD/index.js.map +1 -0
- package/dist/esm/Devices/NodeFactory.js +48 -0
- package/dist/esm/Devices/NodeFactory.js.map +1 -0
- package/dist/esm/Devices/Poly/index.js +4 -0
- package/dist/esm/Devices/Poly/index.js.map +1 -0
- package/dist/esm/Devices/Scene/index.js +4 -0
- package/dist/esm/Devices/Scene/index.js.map +1 -0
- package/dist/esm/Devices/UDI/index.js +4 -0
- package/dist/esm/Devices/UDI/index.js.map +1 -0
- package/dist/esm/Devices/ZWave/ZWaveBaseDevice.js +38 -0
- package/dist/esm/Devices/ZWave/ZWaveBaseDevice.js.map +1 -0
- package/dist/esm/Devices/ZWave/ZWaveDimmerSwitchDevice.js +8 -0
- package/dist/esm/Devices/ZWave/ZWaveDimmerSwitchDevice.js.map +1 -0
- package/dist/esm/Devices/ZWave/ZWaveLockDevice.js +35 -0
- package/dist/esm/Devices/ZWave/ZWaveLockDevice.js.map +1 -0
- package/dist/esm/Devices/ZWave/index.js +20 -0
- package/dist/esm/Devices/ZWave/index.js.map +1 -0
- package/dist/esm/Devices/index.js +9 -0
- package/dist/esm/Devices/index.js.map +1 -0
- package/dist/esm/ISY.js +56 -41
- package/dist/esm/ISY.js.map +1 -1
- package/dist/esm/ISYNode.js +16 -13
- package/dist/esm/ISYNode.js.map +1 -1
- package/dist/esm/ISYScene.js +3 -3
- package/dist/esm/ISYScene.js.map +1 -1
- package/dist/esm/Matter/Behaviors/ISYBridgedDeviceBehavior.js +11 -4
- package/dist/esm/Matter/Behaviors/ISYBridgedDeviceBehavior.js.map +1 -1
- package/dist/esm/Matter/Behaviors/ISYClusterBehavior.js +26 -7
- package/dist/esm/Matter/Behaviors/ISYClusterBehavior.js.map +1 -1
- package/dist/esm/Matter/Behaviors/ISYOnOffBehavior.js +12 -9
- package/dist/esm/Matter/Behaviors/ISYOnOffBehavior.js.map +1 -1
- package/dist/esm/Matter/{Server → Bridge}/Server.js +60 -50
- package/dist/esm/Matter/Bridge/Server.js.map +1 -0
- package/dist/esm/Matter/Mappings/Insteon.js +22 -18
- package/dist/esm/Matter/Mappings/Insteon.js.map +1 -1
- package/dist/esm/Matter/Mappings/register.js +2 -0
- package/dist/esm/Matter/Mappings/register.js.map +1 -0
- package/dist/esm/Model/ClusterMap.js +12 -9
- package/dist/esm/Model/ClusterMap.js.map +1 -1
- package/dist/esm/Utils.js +55 -8
- package/dist/esm/Utils.js.map +1 -1
- package/dist/esm/types/CodeGeneration/EnumFactory.d.ts +1 -1
- package/dist/esm/types/Converters.d.ts +28 -8
- package/dist/esm/types/Converters.d.ts.map +1 -1
- package/dist/esm/types/Definitions/Global/Drivers.d.ts +4 -3
- package/dist/esm/types/Definitions/Global/Drivers.d.ts.map +1 -1
- package/dist/esm/types/Definitions/Global/Events.d.ts.map +1 -1
- package/dist/esm/types/Devices/Elk/ElkAlarmSensorDevice.d.ts.map +1 -1
- package/dist/esm/types/Devices/EndpointFor.d.ts +2 -2
- package/dist/esm/types/Devices/Insteon/InsteonBaseDevice.d.ts +3 -3
- package/dist/esm/types/Devices/Insteon/InsteonBaseDevice.d.ts.map +1 -1
- package/dist/esm/types/Devices/Insteon/InsteonDevice.d.ts +4 -4
- package/dist/esm/types/Devices/Insteon/InsteonFanDevice.d.ts +5 -4
- package/dist/esm/types/Devices/Insteon/InsteonFanDevice.d.ts.map +1 -1
- package/dist/esm/types/Devices/Insteon/InsteonRelayDevice.d.ts +2 -4
- package/dist/esm/types/Devices/Insteon/InsteonRelayDevice.d.ts.map +1 -1
- package/dist/esm/types/Devices/Insteon/RelayLampSwitch.d.ts +93 -0
- package/dist/esm/types/Devices/Insteon/RelayLampSwitch.d.ts.map +1 -0
- package/dist/esm/types/ISY.d.ts +27 -21
- package/dist/esm/types/ISY.d.ts.map +1 -1
- package/dist/esm/types/ISYNode.d.ts +4 -4
- package/dist/esm/types/ISYNode.d.ts.map +1 -1
- package/dist/esm/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts +16 -6
- package/dist/esm/types/Matter/Behaviors/ISYBridgedDeviceBehavior.d.ts.map +1 -1
- package/dist/esm/types/Matter/Behaviors/ISYClusterBehavior.d.ts +13 -11
- package/dist/esm/types/Matter/Behaviors/ISYClusterBehavior.d.ts.map +1 -1
- package/dist/esm/types/Matter/Behaviors/ISYOnOffBehavior.d.ts +4 -4
- package/dist/esm/types/Matter/Behaviors/ISYOnOffBehavior.d.ts.map +1 -1
- package/dist/esm/types/Matter/Bridge/Server.d.ts +27 -0
- package/dist/esm/types/Matter/Bridge/Server.d.ts.map +1 -0
- package/dist/esm/types/Matter/Mappings/register.d.ts +2 -0
- package/dist/esm/types/Matter/Mappings/register.d.ts.map +1 -0
- package/dist/esm/types/Model/ClusterMap.d.ts +19 -11
- package/dist/esm/types/Model/ClusterMap.d.ts.map +1 -1
- package/dist/esm/types/Utils.d.ts +3 -5
- package/dist/esm/types/Utils.d.ts.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +4 -6
- package/src/Converters.ts +137 -69
- package/src/Definitions/Global/Drivers.ts +16 -7
- package/src/Definitions/Global/Events.ts +4 -3
- package/src/Devices/Elk/ElkAlarmPanelDevice.ts +3 -3
- package/src/Devices/Elk/ElkAlarmSensorDevice.ts +15 -21
- package/src/Devices/Insteon/Generated/RelayLamp.ts +8 -7
- package/src/Devices/Insteon/InsteonBaseDevice.ts +10 -9
- package/src/Devices/Insteon/InsteonFanDevice.ts +16 -11
- package/src/Devices/Insteon/InsteonMotionSensorDevice.ts +5 -5
- package/src/Devices/Insteon/InsteonRelayDevice.ts +3 -5
- package/src/Devices/Insteon/RelayLampSwitch.ts +131 -0
- package/src/ISY.ts +87 -61
- package/src/ISYNode.ts +17 -14
- package/src/ISYScene.ts +3 -3
- package/src/Matter/Behaviors/ISYBridgedDeviceBehavior.ts +29 -11
- package/src/Matter/Behaviors/ISYClusterBehavior.ts +46 -28
- package/src/Matter/Behaviors/ISYOnOffBehavior.ts +50 -64
- package/src/Matter/{Server → Bridge}/Server.ts +87 -59
- package/src/Matter/Mappings/Insteon.ts +53 -60
- package/src/Matter/Mappings/register.ts +0 -0
- package/src/Model/ClassDefinition.ts +1 -1
- package/src/Model/ClusterMap.ts +31 -22
- package/src/Utils.ts +62 -19
- package/tsconfig.json +2 -2
- package/dist/cjs/Matter/Server/Server.js.map +0 -1
- package/dist/cjs/types/Matter/Server/Server.d.ts +0 -4
- package/dist/cjs/types/Matter/Server/Server.d.ts.map +0 -1
- package/dist/esm/Matter/Server/Server.js.map +0 -1
- package/dist/esm/types/Matter/Server/Server.d.ts +0 -4
- package/dist/esm/types/Matter/Server/Server.d.ts.map +0 -1
|
@@ -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,14 +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'>, 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
23
|
}
|
|
26
24
|
|
|
27
25
|
// #endregion Constructors (1)
|
|
@@ -57,7 +55,7 @@ export class InsteonRelayDevice extends InsteonBaseDevice<Driver.Signatures<'ST'
|
|
|
57
55
|
|
|
58
56
|
} */
|
|
59
57
|
public override async sendBeep(level: number = 100): Promise<any> {
|
|
60
|
-
return super.
|
|
58
|
+
return super.beep(level);
|
|
61
59
|
}
|
|
62
60
|
|
|
63
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
|
@@ -3,14 +3,12 @@ import { writeFile } from 'fs';
|
|
|
3
3
|
|
|
4
4
|
import { Parser, type ParserOptions } from 'xml2js';
|
|
5
5
|
import { parseBooleans, parseNumbers } from 'xml2js/lib/processors.js';
|
|
6
|
-
import { XmlDocument } from 'xmldoc';
|
|
7
6
|
|
|
8
7
|
import axios from 'axios';
|
|
9
8
|
import { EventEmitter } from 'events';
|
|
10
|
-
import
|
|
9
|
+
import { format, Logger, loggers } from 'winston';
|
|
11
10
|
import { Category } from './Definitions/Global/Categories.js';
|
|
12
11
|
import { Family } from './Definitions/Global/Families.js';
|
|
13
|
-
import type { NodeInfo } from './Model/NodeInfo.js';
|
|
14
12
|
import { DeviceFactory } from './Devices/DeviceFactory.js';
|
|
15
13
|
import { ELKAlarmPanelDevice } from './Devices/Elk/ElkAlarmPanelDevice.js';
|
|
16
14
|
import { ElkAlarmSensorDevice } from './Devices/Elk/ElkAlarmSensorDevice.js';
|
|
@@ -31,18 +29,22 @@ import { InsteonOnOffOutletDevice } from './Devices/Insteon/InsteonOnOffOutletDe
|
|
|
31
29
|
import { InsteonRelayDevice } from './Devices/Insteon/InsteonRelayDevice.js';
|
|
32
30
|
import { InsteonSmokeSensorDevice } from './Devices/Insteon/InsteonSmokeSensorDevice.js';
|
|
33
31
|
import { InsteonThermostatDevice } from './Devices/Insteon/InsteonThermostatDevice.js';
|
|
32
|
+
import { ISYDeviceNode } from './Devices/ISYDeviceNode.js';
|
|
34
33
|
import { EventType } from './Events/EventType.js';
|
|
35
34
|
import { NodeType, Props, States, VariableType } from './ISYConstants.js';
|
|
36
|
-
import { ISYNode } from './ISYNode.js';
|
|
37
|
-
import { ISYDeviceNode } from './Devices/ISYDeviceNode.js';
|
|
38
35
|
import { type ISYDevice } from './ISYDevice.js';
|
|
36
|
+
import { ISYNode } from './ISYNode.js';
|
|
39
37
|
import { ISYScene } from './ISYScene.js';
|
|
40
38
|
import { ISYVariable } from './ISYVariable.js';
|
|
39
|
+
import type { NodeInfo } from './Model/NodeInfo.js';
|
|
41
40
|
|
|
42
41
|
import * as Utils from './Utils.js';
|
|
43
42
|
|
|
44
43
|
import { X2jOptions, XMLParser } from 'fast-xml-parser';
|
|
45
44
|
import { NodeFactory } from './Devices/NodeFactory.js';
|
|
45
|
+
import type { Config } from './Model/Config.js';
|
|
46
|
+
import { findPackageJson } from './Utils.js';
|
|
47
|
+
import path from 'path';
|
|
46
48
|
|
|
47
49
|
export {
|
|
48
50
|
Category as Categories,
|
|
@@ -118,6 +120,21 @@ const parser = new Parser(defaultParserOptions);
|
|
|
118
120
|
|
|
119
121
|
export let Controls = {};
|
|
120
122
|
|
|
123
|
+
interface ISYConfig {
|
|
124
|
+
// #region Properties (8)
|
|
125
|
+
|
|
126
|
+
displayNameFormat?: string;
|
|
127
|
+
elkEnabled?: boolean;
|
|
128
|
+
enableWebSocket?: boolean;
|
|
129
|
+
host: string;
|
|
130
|
+
password: string;
|
|
131
|
+
port: number;
|
|
132
|
+
protocol: 'http' | 'https';
|
|
133
|
+
username: string;
|
|
134
|
+
|
|
135
|
+
// #endregion Properties (8)
|
|
136
|
+
}
|
|
137
|
+
|
|
121
138
|
export class ISY extends EventEmitter implements Disposable {
|
|
122
139
|
// #region Properties (30)
|
|
123
140
|
|
|
@@ -140,7 +157,7 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
140
157
|
|
|
141
158
|
public static instance: ISY;
|
|
142
159
|
|
|
143
|
-
public configInfo:
|
|
160
|
+
public configInfo: Config;
|
|
144
161
|
public elkAlarmPanel: ELKAlarmPanelDevice;
|
|
145
162
|
public guardianTimer: any;
|
|
146
163
|
public id: string;
|
|
@@ -150,29 +167,19 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
150
167
|
public nodesLoaded: boolean = false;
|
|
151
168
|
public productId = 5226;
|
|
152
169
|
public productName = 'eisy';
|
|
153
|
-
public
|
|
170
|
+
public firmwareVersion: any;
|
|
154
171
|
public vendorName = 'Universal Devices, Inc.';
|
|
155
172
|
public webSocket: WebSocket.Client;
|
|
156
173
|
|
|
174
|
+
public apiVersion: string;
|
|
175
|
+
|
|
157
176
|
// #endregion Properties (30)
|
|
158
177
|
|
|
159
178
|
// #region Constructors (1)
|
|
160
179
|
|
|
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
|
-
) {
|
|
180
|
+
constructor(config: ISYConfig, logger: Logger = new Logger(), storagePath?: string) {
|
|
175
181
|
super();
|
|
182
|
+
|
|
176
183
|
this.enableWebSocket = config.enableWebSocket ?? true;
|
|
177
184
|
this.storagePath = storagePath ?? './';
|
|
178
185
|
this.displayNameFormat = config.displayNameFormat ?? '${location ?? folder} ${spokenName ?? name}';
|
|
@@ -218,7 +225,11 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
218
225
|
|
|
219
226
|
// #endregion Public Getters And Setters (2)
|
|
220
227
|
|
|
221
|
-
// #region Public Methods (
|
|
228
|
+
// #region Public Methods (24)
|
|
229
|
+
|
|
230
|
+
[Symbol.dispose](): void {
|
|
231
|
+
this.close();
|
|
232
|
+
}
|
|
222
233
|
|
|
223
234
|
public override emit(event: 'InitializeCompleted' | 'NodeAdded' | 'NodeRemoved' | 'NodeChanged', node?: ISYNode<any, any, any, any>): boolean {
|
|
224
235
|
return super.emit(event, node);
|
|
@@ -239,6 +250,10 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
239
250
|
return s as T;
|
|
240
251
|
}
|
|
241
252
|
|
|
253
|
+
public getElkAlarmPanel() {
|
|
254
|
+
return this.elkAlarmPanel;
|
|
255
|
+
}
|
|
256
|
+
|
|
242
257
|
public getNode<T extends ISYNode<any, any, any, any> = ISYNode<any, any, any, any>>(address: string, parentsOnly = false): T {
|
|
243
258
|
let s = this.nodeMap.get(address);
|
|
244
259
|
if (!parentsOnly) {
|
|
@@ -254,10 +269,6 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
254
269
|
return s as T;
|
|
255
270
|
}
|
|
256
271
|
|
|
257
|
-
public getElkAlarmPanel() {
|
|
258
|
-
return this.elkAlarmPanel;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
272
|
public getScene(address: string) {
|
|
262
273
|
return this.sceneList.get(address);
|
|
263
274
|
}
|
|
@@ -275,7 +286,7 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
275
286
|
}
|
|
276
287
|
|
|
277
288
|
public async handleInitializeError(step: string, reason: any): Promise<any> {
|
|
278
|
-
this.logger.error(`Error initializing ISY (${step}): ${
|
|
289
|
+
this.logger.error(`Error initializing ISY (${step}): ${Utils.logStringify(reason)}`);
|
|
279
290
|
return Promise.reject(reason);
|
|
280
291
|
}
|
|
281
292
|
|
|
@@ -323,7 +334,7 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
323
334
|
}
|
|
324
335
|
break;
|
|
325
336
|
case EventType.Heartbeat:
|
|
326
|
-
this.logger.debug(`Received ${EventType[Number(stringControl)]} Signal from ISY: ${
|
|
337
|
+
this.logger.debug(`Received ${EventType[Number(stringControl)]} Signal from ISY: ${Utils.logStringify(evt)}`);
|
|
327
338
|
break;
|
|
328
339
|
|
|
329
340
|
default:
|
|
@@ -331,15 +342,19 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
331
342
|
//
|
|
332
343
|
const impactedDevice = this.getNode(evt.node);
|
|
333
344
|
if (impactedDevice !== undefined && impactedDevice !== null) {
|
|
334
|
-
|
|
345
|
+
try {
|
|
346
|
+
impactedDevice.handleEvent(evt);
|
|
347
|
+
} catch (e) {
|
|
348
|
+
this.logger.error(`Error handling event for ${impactedDevice.name}: ${e.message}`);
|
|
349
|
+
}
|
|
335
350
|
} else {
|
|
336
|
-
this.logger.
|
|
351
|
+
this.logger.debug(`${EventType[stringControl]} Event for Unidentified Device: ${JSON.stringify(evt)}`);
|
|
337
352
|
}
|
|
338
353
|
} else {
|
|
339
354
|
if (stringControl === EventType.NodeChanged) {
|
|
340
|
-
this.logger.
|
|
355
|
+
this.logger.debug(`Received Node Change Event: ${JSON.stringify(evt)}. These are currently unsupported.`);
|
|
341
356
|
}
|
|
342
|
-
this.logger.debug(`${EventType[Number(stringControl)]} Event: ${
|
|
357
|
+
this.logger.debug(`${EventType[Number(stringControl)]} Event: ${Utils.logStringify(evt)}`);
|
|
343
358
|
}
|
|
344
359
|
|
|
345
360
|
break;
|
|
@@ -350,6 +365,7 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
350
365
|
public async initialize(): Promise<any> {
|
|
351
366
|
const that = this;
|
|
352
367
|
try {
|
|
368
|
+
this.apiVersion = (await findPackageJson()).version;
|
|
353
369
|
await this.loadConfig();
|
|
354
370
|
await this.loadNodes();
|
|
355
371
|
await this.loadVariables(VariableType.Integer);
|
|
@@ -413,19 +429,18 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
413
429
|
public async loadConfig(): Promise<any> {
|
|
414
430
|
try {
|
|
415
431
|
this.logger.info('Loading ISY Config');
|
|
416
|
-
const configuration = (await this.sendRequest('config')).configuration;
|
|
432
|
+
const configuration = (await this.sendRequest('config')).configuration as Config;
|
|
417
433
|
if (this.isDebugEnabled) {
|
|
418
|
-
writeFile(this.storagePath
|
|
434
|
+
writeFile(path.resolve(this.storagePath, 'ISYConfigDump.json'), JSON.stringify(configuration), this.logger.error);
|
|
419
435
|
}
|
|
420
436
|
|
|
421
437
|
const controls = configuration.controls;
|
|
422
438
|
this.model = configuration.deviceSpecs.model;
|
|
423
|
-
this.
|
|
439
|
+
this.firmwareVersion = configuration.app_full_version;
|
|
424
440
|
this.vendorName = configuration.deviceSpecs.make;
|
|
425
441
|
this.productId = configuration.product.id;
|
|
426
442
|
this.productName = configuration.product.desc;
|
|
427
443
|
this.id = configuration.root.id;
|
|
428
|
-
// TODO: Check Installed Features
|
|
429
444
|
// this.logger.info(result.configuration);
|
|
430
445
|
if (controls !== undefined) {
|
|
431
446
|
// this.logger.info(controls.control);
|
|
@@ -474,7 +489,9 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
474
489
|
}
|
|
475
490
|
}
|
|
476
491
|
|
|
477
|
-
public override on(event: '
|
|
492
|
+
public override on(event: 'initializeCompleted', listener: () => void): this;
|
|
493
|
+
public override on(event: 'nodeAdded' | 'nodeRemoved' | 'nodeChanged', listener: (node?: ISYNode<any, any, any, any>) => void): this;
|
|
494
|
+
override on(event: 'initializeCompleted' | 'nodeAdded' | 'nodeRemoved' | 'nodeChanged', listener: (node?: ISYNode<any, any, any, any>) => void): this {
|
|
478
495
|
return super.on(event, listener);
|
|
479
496
|
}
|
|
480
497
|
|
|
@@ -565,12 +582,13 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
565
582
|
trailingSlash: boolean;
|
|
566
583
|
requestLogLevel?: any;
|
|
567
584
|
responseLogLevel?: any;
|
|
585
|
+
errorLogLevel?: any;
|
|
568
586
|
} = { trailingSlash: true }
|
|
569
587
|
): Promise<any> {
|
|
570
|
-
const requestLogLevel = options.requestLogLevel ??
|
|
571
|
-
const responseLogLevel = options.responseLogLevel ??
|
|
588
|
+
const requestLogLevel = options.requestLogLevel ?? 'debug';
|
|
589
|
+
const responseLogLevel = options.responseLogLevel ?? 'silly';
|
|
572
590
|
url = `${this.protocol}://${this.address}/rest/${url}${options.trailingSlash ? '/' : ''}`;
|
|
573
|
-
this.logger.log(`Sending request: ${url}
|
|
591
|
+
this.logger.log(requestLogLevel, `Sending request: ${url}`);
|
|
574
592
|
try {
|
|
575
593
|
const response = await axios.get(url, {
|
|
576
594
|
auth: { username: this.credentials.username, password: this.credentials.password }
|
|
@@ -581,19 +599,22 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
581
599
|
if (options.parserOptions) curParser = new Parser({ ...defaultParserOptions, ...options.parserOptions });
|
|
582
600
|
var altParser = new XMLParser(defaultXMLParserOptions);
|
|
583
601
|
var s = altParser.parse(response.data);
|
|
584
|
-
this.logger.log(`Response: ${JSON.stringify(s)}
|
|
602
|
+
this.logger.log(requestLogLevel ?? 'debug', `Response: ${JSON.stringify(s)}`);
|
|
585
603
|
return s;
|
|
586
604
|
} else if (response.headers['content-type'].toString().includes('json')) {
|
|
587
|
-
this.logger.log(`Response: ${JSON.stringify(response.data)}
|
|
605
|
+
this.logger.log(responseLogLevel ?? 'debug', `Response: ${JSON.stringify(response.data)}`);
|
|
588
606
|
return JSON.parse(response.data);
|
|
589
607
|
} else {
|
|
590
|
-
this.logger.log(`Response Header: ${JSON.stringify(response.headers)} Response: ${JSON.stringify(response.data)}
|
|
608
|
+
this.logger.log(responseLogLevel ?? 'debug', `Response Header: ${JSON.stringify(response.headers)} Response: ${JSON.stringify(response.data)}`);
|
|
591
609
|
return response.data;
|
|
592
610
|
}
|
|
593
611
|
}
|
|
594
612
|
} catch (error) {
|
|
595
|
-
|
|
596
|
-
|
|
613
|
+
if (options.errorLogLevel) {
|
|
614
|
+
this.logger.log(options.errorLogLevel, `Error sending request to ISY: ${error?.message}`);
|
|
615
|
+
} else {
|
|
616
|
+
this.logger.error(`Error sending request to ISY: ${error?.message}`);
|
|
617
|
+
}
|
|
597
618
|
}
|
|
598
619
|
}
|
|
599
620
|
|
|
@@ -604,11 +625,19 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
604
625
|
return this.sendRequest(uriToUse);
|
|
605
626
|
}
|
|
606
627
|
|
|
607
|
-
|
|
628
|
+
#variableChangedHandler(variable: { id: string; type: string }) {
|
|
608
629
|
this.logger.info(`Variable: ${variable.id} (${variable.type}) changed`);
|
|
609
630
|
}
|
|
610
631
|
|
|
611
|
-
|
|
632
|
+
public close() {
|
|
633
|
+
try {
|
|
634
|
+
this.webSocket?.close();
|
|
635
|
+
} catch (e) {
|
|
636
|
+
this.logger.error(`Error closing websocket: ${e.message}`);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// #endregion Public Methods (24)
|
|
612
641
|
|
|
613
642
|
// #region Private Methods (11)
|
|
614
643
|
|
|
@@ -645,12 +674,13 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
645
674
|
}
|
|
646
675
|
}
|
|
647
676
|
|
|
648
|
-
#guardian() {
|
|
677
|
+
async #guardian() {
|
|
649
678
|
const timeNow = new Date();
|
|
650
679
|
|
|
651
680
|
if (Number(timeNow) - Number(this.lastActivity) > 60000) {
|
|
652
681
|
this.logger.info('Guardian: Detected no activity in more then 60 seconds. Reinitializing web sockets');
|
|
653
|
-
this.
|
|
682
|
+
await this.refreshStatuses();
|
|
683
|
+
await this.initializeWebSocket();
|
|
654
684
|
}
|
|
655
685
|
}
|
|
656
686
|
|
|
@@ -681,17 +711,17 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
681
711
|
});
|
|
682
712
|
}
|
|
683
713
|
|
|
684
|
-
#loadElkNodes(result: any) {
|
|
714
|
+
/* #loadElkNodes(result: any) {
|
|
685
715
|
const document = new XmlDocument(result);
|
|
686
716
|
const nodes = document.childNamed('areas').childNamed('area').childrenNamed('zone');
|
|
687
717
|
for (let index = 0; index < nodes.length; index++) {
|
|
688
718
|
const id = nodes[index].attr.id;
|
|
689
719
|
const name = nodes[index].attr.name;
|
|
690
720
|
const alarmDef = nodes[index].attr.alarmDef;
|
|
691
|
-
const newDevice = new ElkAlarmSensorDevice(this, name, 1, id
|
|
721
|
+
const newDevice = new ElkAlarmSensorDevice(this, name, 1, id TODO: Handle CO Sensor vs. Door/Window Sensor );
|
|
692
722
|
this.zoneMap[newDevice.zone] = newDevice;
|
|
693
723
|
}
|
|
694
|
-
}
|
|
724
|
+
} */
|
|
695
725
|
|
|
696
726
|
async #readDeviceNodes(obj: { nodes: { node: NodeInfo[] } }) {
|
|
697
727
|
this.logger.info('Loading Device Nodes');
|
|
@@ -762,7 +792,7 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
762
792
|
this.logger.info('Loading Folder Nodes');
|
|
763
793
|
if (result?.nodes?.folder) {
|
|
764
794
|
for (const folder of result.nodes.folder) {
|
|
765
|
-
this.logger.
|
|
795
|
+
this.logger.debug(`Loading Folder Node: ${JSON.stringify(folder)}`);
|
|
766
796
|
this.folderMap.set(folder.address, folder.name);
|
|
767
797
|
}
|
|
768
798
|
}
|
|
@@ -798,13 +828,9 @@ export class ISY extends EventEmitter implements Disposable {
|
|
|
798
828
|
}
|
|
799
829
|
}
|
|
800
830
|
|
|
801
|
-
[Symbol.dispose](): void {
|
|
802
|
-
try {
|
|
803
|
-
this.webSocket.close();
|
|
804
|
-
} catch (e) {
|
|
805
|
-
this.logger.error(`Error closing websocket: ${e.message}`);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
|
|
809
831
|
// #endregion Private Methods (11)
|
|
810
832
|
}
|
|
833
|
+
|
|
834
|
+
export namespace ISY {
|
|
835
|
+
export interface Config extends ISYConfig {}
|
|
836
|
+
}
|
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 {
|
|
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';
|
|
@@ -106,7 +106,7 @@ export class ISYNode<
|
|
|
106
106
|
.trim();
|
|
107
107
|
if (this.parentType === NodeType.Folder) {
|
|
108
108
|
this.folder = isy.folderMap.get(this.parent._);
|
|
109
|
-
isy.logger.
|
|
109
|
+
isy.logger.debug(`${this.name} is in folder ${this.folder}`);
|
|
110
110
|
this.logger = (msg: any, level: keyof CliConfigSetLevels = 'debug', ...meta: any[]) => {
|
|
111
111
|
isy.logger[level](`${this.folder} ${this.name} (${this.address}): ${msg}`, meta);
|
|
112
112
|
return isy.logger;
|
|
@@ -168,7 +168,7 @@ export class ISYNode<
|
|
|
168
168
|
if (from === to) return value;
|
|
169
169
|
else {
|
|
170
170
|
try {
|
|
171
|
-
return
|
|
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: '
|
|
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
|
}
|
|
@@ -219,7 +219,7 @@ export class ISYNode<
|
|
|
219
219
|
|
|
220
220
|
public async getNotes(): Promise<NodeNotes> {
|
|
221
221
|
try {
|
|
222
|
-
const result = await this.isy.sendRequest(`nodes/${this.address}/notes
|
|
222
|
+
const result = await this.isy.sendRequest(`nodes/${this.address}/notes`, { trailingSlash: false, errorLogLevel: 'debug' });
|
|
223
223
|
if (result !== null && result !== undefined) {
|
|
224
224
|
return result.NodeProperties;
|
|
225
225
|
} else {
|
|
@@ -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('
|
|
235
|
+
this.events.emit('controlTriggered', controlName);
|
|
236
236
|
return true;
|
|
237
237
|
}
|
|
238
238
|
|
|
@@ -253,23 +253,26 @@ export class ISYNode<
|
|
|
253
253
|
} else {
|
|
254
254
|
// this.logger(event.control);
|
|
255
255
|
const e = event.control;
|
|
256
|
-
const dispName = this.commands[e]
|
|
256
|
+
const dispName = this.commands[e]?.name;
|
|
257
257
|
if (dispName !== undefined && dispName !== null) {
|
|
258
|
-
this.logger(`Command ${dispName} (${e})
|
|
258
|
+
this.logger(`Command ${dispName} (${e}) event sent.`);
|
|
259
259
|
} else {
|
|
260
|
-
this.logger(`Command ${e}
|
|
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,
|
|
267
|
+
public handlePropertyChange(propertyName: StringKeys<D>, value: any, uom: UnitOfMeasure, prec?: number, formattedValue?: string): boolean {
|
|
268
268
|
this.lastChanged = new Date();
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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);
|
|
275
|
+
this.scenes?.forEach((element) => {
|
|
273
276
|
this.logger(`Recalulating ${element.deviceFriendlyName}`);
|
|
274
277
|
element.recalculateState();
|
|
275
278
|
});
|
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
|
|
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('
|
|
113
|
+
this.emit('propertyChanged', 'isOn', this.isOn, this.isOn, this.isOn ? 'on' : 'off');
|
|
114
114
|
|
|
115
115
|
if (this.isDimmable) {
|
|
116
|
-
this.emit('
|
|
116
|
+
this.emit('propertyChanged', 'brightnesslevel', this.brightnessLevel, this.brightnessLevel, this.brightnessLevel + '%');
|
|
117
117
|
|
|
118
118
|
}
|
|
119
119
|
}
|