homebridge-securitysystem 11.0.0-beta.1 → 11.0.0-beta.3
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/CHANGELOG.md +24 -0
- package/config.schema.json +6 -7
- package/dist/conditions/already-triggered-condition.js +3 -1
- package/dist/conditions/already-triggered-condition.js.map +1 -1
- package/dist/conditions/arming-in-progress-condition.js +3 -1
- package/dist/conditions/arming-in-progress-condition.js.map +1 -1
- package/dist/conditions/arming-lock-condition.js +13 -5
- package/dist/conditions/arming-lock-condition.js.map +1 -1
- package/dist/conditions/condition.d.ts +8 -1
- package/dist/conditions/condition.js +11 -1
- package/dist/conditions/condition.js.map +1 -1
- package/dist/conditions/double-knock-condition.js +3 -1
- package/dist/conditions/double-knock-condition.js.map +1 -1
- package/dist/conditions/not-armed-condition.js +3 -1
- package/dist/conditions/not-armed-condition.js.map +1 -1
- package/dist/conditions/trigger-already-running-condition.js +3 -1
- package/dist/conditions/trigger-already-running-condition.js.map +1 -1
- package/dist/handlers/state-handler.d.ts +7 -2
- package/dist/handlers/state-handler.js +15 -10
- package/dist/handlers/state-handler.js.map +1 -1
- package/dist/handlers/switch-handler.d.ts +2 -1
- package/dist/handlers/switch-handler.js +2 -2
- package/dist/handlers/switch-handler.js.map +1 -1
- package/dist/handlers/trip-handler.d.ts +10 -3
- package/dist/handlers/trip-handler.js +32 -15
- package/dist/handlers/trip-handler.js.map +1 -1
- package/dist/homekit/homekit-registrar.js +9 -6
- package/dist/homekit/homekit-registrar.js.map +1 -1
- package/dist/interfaces/options-interface.d.ts +1 -1
- package/dist/interfaces/system-state-interface.d.ts +1 -1
- package/dist/schemas/mode-request-schema.js +2 -2
- package/dist/schemas/mode-request-schema.js.map +1 -1
- package/dist/security-system.js +1 -1
- package/dist/security-system.js.map +1 -1
- package/dist/services/configuration-service.js +2 -1
- package/dist/services/configuration-service.js.map +1 -1
- package/dist/services/server-service.d.ts +1 -1
- package/dist/services/server-service.js +30 -31
- package/dist/services/server-service.js.map +1 -1
- package/dist/tests/conditions.test.js +1 -1
- package/dist/tests/conditions.test.js.map +1 -1
- package/dist/tests/state-handler.test.js +5 -5
- package/dist/tests/state-handler.test.js.map +1 -1
- package/dist/tests/trip-handler.test.js +21 -16
- package/dist/tests/trip-handler.test.js.map +1 -1
- package/dist/types/service-result-type.d.ts +4 -0
- package/dist/types/service-result-type.js +2 -0
- package/dist/types/service-result-type.js.map +1 -0
- package/package.json +1 -1
- package/src/conditions/already-triggered-condition.ts +3 -1
- package/src/conditions/arming-in-progress-condition.ts +3 -1
- package/src/conditions/arming-lock-condition.ts +18 -8
- package/src/conditions/condition.ts +15 -1
- package/src/conditions/double-knock-condition.ts +3 -1
- package/src/conditions/not-armed-condition.ts +3 -1
- package/src/conditions/trigger-already-running-condition.ts +3 -1
- package/src/handlers/state-handler.ts +17 -11
- package/src/handlers/switch-handler.ts +4 -3
- package/src/handlers/trip-handler.ts +39 -18
- package/src/homekit/homekit-registrar.ts +9 -6
- package/src/interfaces/options-interface.ts +1 -1
- package/src/interfaces/system-state-interface.ts +1 -1
- package/src/schemas/mode-request-schema.ts +2 -2
- package/src/security-system.ts +1 -1
- package/src/services/configuration-service.ts +2 -1
- package/src/services/server-service.ts +31 -32
- package/src/tests/conditions.test.ts +1 -1
- package/src/tests/state-handler.test.ts +5 -5
- package/src/tests/trip-handler.test.ts +21 -16
- package/src/types/service-result-type.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v11.0.0-beta.2 - 2026-04-18
|
|
4
|
+
|
|
5
|
+
<!-- Release notes generated using configuration in .github/release.yml at v11.0.0-beta.2 -->
|
|
6
|
+
|
|
7
|
+
## What's Changed
|
|
8
|
+
### 🛠️ Other Changes
|
|
9
|
+
* Replace numeric server code with string-based API key authentication by @MiguelRipoll23 in https://github.com/MiguelRipoll23/homebridge-securitysystem/pull/760
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
**Full Changelog**: https://github.com/MiguelRipoll23/homebridge-securitysystem/compare/v11.0.0-beta.1...v11.0.0-beta.2
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## v11.0.0-beta.1 - 2026-04-18
|
|
16
|
+
|
|
17
|
+
<!-- Release notes generated using configuration in .github/release.yml at v11.0.0-beta.1 -->
|
|
18
|
+
|
|
19
|
+
## What's Changed
|
|
20
|
+
### 💥 Breaking Changes
|
|
21
|
+
* Add OpenAPI documentation and refactor API endpoints by @MiguelRipoll23 in https://github.com/MiguelRipoll23/homebridge-securitysystem/pull/758
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
**Full Changelog**: https://github.com/MiguelRipoll23/homebridge-securitysystem/compare/v10.1.0...v11.0.0-beta.1
|
|
25
|
+
|
|
26
|
+
|
|
3
27
|
## v10.1.0 - 2026-04-18
|
|
4
28
|
|
|
5
29
|
<!-- Release notes generated using configuration in .github/release.yml at v10.1.0 -->
|
package/config.schema.json
CHANGED
|
@@ -536,13 +536,12 @@
|
|
|
536
536
|
"minimum": 0,
|
|
537
537
|
"placeholder": 80
|
|
538
538
|
},
|
|
539
|
-
"
|
|
540
|
-
"title": "
|
|
541
|
-
"description": "
|
|
542
|
-
"type": "
|
|
539
|
+
"server_api_key": {
|
|
540
|
+
"title": "API Key",
|
|
541
|
+
"description": "A key used to protect the server and authenticate requests.",
|
|
542
|
+
"type": "string",
|
|
543
543
|
"required": false,
|
|
544
|
-
"
|
|
545
|
-
"placeholder": "XXXX"
|
|
544
|
+
"placeholder": "your-api-key"
|
|
546
545
|
},
|
|
547
546
|
"webhook_url": {
|
|
548
547
|
"title": "Base URL",
|
|
@@ -891,7 +890,7 @@
|
|
|
891
890
|
"description": "Expose a server to interact with the security system remotely.",
|
|
892
891
|
"expandable": true,
|
|
893
892
|
"expanded": false,
|
|
894
|
-
"items": ["server_port", "
|
|
893
|
+
"items": ["server_port", "server_api_key"]
|
|
895
894
|
},
|
|
896
895
|
{
|
|
897
896
|
"type": "fieldset",
|
|
@@ -7,12 +7,14 @@ import { Condition } from './condition.js';
|
|
|
7
7
|
export class AlreadyTriggeredCondition extends Condition {
|
|
8
8
|
name = 'already-triggered';
|
|
9
9
|
evaluate({ state, value, log }) {
|
|
10
|
+
this.clearFailureReason();
|
|
10
11
|
if (!value) {
|
|
11
12
|
return false;
|
|
12
13
|
}
|
|
13
14
|
const blocked = state.currentState === SecurityState.TRIGGERED;
|
|
14
15
|
if (blocked) {
|
|
15
|
-
|
|
16
|
+
this._failureReason = 'Security System (Already triggered): alarm is already active';
|
|
17
|
+
log.warn(this._failureReason);
|
|
16
18
|
}
|
|
17
19
|
return blocked;
|
|
18
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"already-triggered-condition.js","sourceRoot":"","sources":["../../src/conditions/already-triggered-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC7C,IAAI,GAAG,mBAAmB,CAAC;IAEpC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,SAAS,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"already-triggered-condition.js","sourceRoot":"","sources":["../../src/conditions/already-triggered-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC7C,IAAI,GAAG,mBAAmB,CAAC;IAEpC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,SAAS,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,GAAG,8DAA8D,CAAC;YACrF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -6,11 +6,13 @@ import { Condition } from './condition.js';
|
|
|
6
6
|
export class ArmingInProgressCondition extends Condition {
|
|
7
7
|
name = 'arming-in-progress';
|
|
8
8
|
evaluate({ state, value, log }) {
|
|
9
|
+
this.clearFailureReason();
|
|
9
10
|
if (!value) {
|
|
10
11
|
return false;
|
|
11
12
|
}
|
|
12
13
|
if (state.isArming) {
|
|
13
|
-
|
|
14
|
+
this._failureReason = 'Trip Switch (Still arming): arm delay countdown is still in progress';
|
|
15
|
+
log.warn(this._failureReason);
|
|
14
16
|
return true;
|
|
15
17
|
}
|
|
16
18
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arming-in-progress-condition.js","sourceRoot":"","sources":["../../src/conditions/arming-in-progress-condition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC7C,IAAI,GAAG,oBAAoB,CAAC;IAErC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"arming-in-progress-condition.js","sourceRoot":"","sources":["../../src/conditions/arming-in-progress-condition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC7C,IAAI,GAAG,oBAAoB,CAAC;IAErC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,sEAAsE,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -12,6 +12,7 @@ export class ArmingLockCondition extends Condition {
|
|
|
12
12
|
this.Characteristic = Characteristic;
|
|
13
13
|
}
|
|
14
14
|
evaluate({ state, services, options }) {
|
|
15
|
+
this.clearFailureReason();
|
|
15
16
|
const hasLockFeature = options.armingLockSwitch || options.armingLockSwitches;
|
|
16
17
|
if (!hasLockFeature) {
|
|
17
18
|
return false;
|
|
@@ -24,19 +25,26 @@ export class ArmingLockCondition extends Condition {
|
|
|
24
25
|
const globalOn = services.armingLockSwitchService
|
|
25
26
|
.getCharacteristic(this.Characteristic.On).value;
|
|
26
27
|
if (globalOn) {
|
|
28
|
+
this._failureReason = 'arming is blocked by the global arming lock switch';
|
|
27
29
|
return true;
|
|
28
30
|
}
|
|
29
31
|
// Check mode-specific arming-lock switch.
|
|
32
|
+
let blocked = false;
|
|
30
33
|
switch (targetState) {
|
|
31
34
|
case SecurityState.HOME:
|
|
32
|
-
|
|
35
|
+
blocked = Boolean(services.armingLockHomeSwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
36
|
+
break;
|
|
33
37
|
case SecurityState.AWAY:
|
|
34
|
-
|
|
38
|
+
blocked = Boolean(services.armingLockAwaySwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
39
|
+
break;
|
|
35
40
|
case SecurityState.NIGHT:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return false;
|
|
41
|
+
blocked = Boolean(services.armingLockNightSwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
42
|
+
break;
|
|
39
43
|
}
|
|
44
|
+
if (blocked) {
|
|
45
|
+
this._failureReason = 'arming is blocked by a mode-specific arming lock switch';
|
|
46
|
+
}
|
|
47
|
+
return blocked;
|
|
40
48
|
}
|
|
41
49
|
}
|
|
42
50
|
//# sourceMappingURL=arming-lock-condition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arming-lock-condition.js","sourceRoot":"","sources":["../../src/conditions/arming-lock-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAGnB;IAFpB,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,cAAyC;QACpE,KAAK,EAAE,CAAC;QADmB,mBAAc,GAAd,cAAc,CAA2B;IAEtE,CAAC;IAED,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAoB;QACrD,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC;QAC9E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,WAAW,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB;aAC9C,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QAEnD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,QAAQ,WAAW,EAAE,CAAC;YACtB,KAAK,aAAa,CAAC,IAAI;gBACrB,OAAO,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"arming-lock-condition.js","sourceRoot":"","sources":["../../src/conditions/arming-lock-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAGnB;IAFpB,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,cAAyC;QACpE,KAAK,EAAE,CAAC;QADmB,mBAAc,GAAd,cAAc,CAA2B;IAEtE,CAAC;IAED,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAoB;QACrD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC;QAC9E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,WAAW,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB;aAC9C,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QAEnD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,GAAG,oDAAoD,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,QAAQ,WAAW,EAAE,CAAC;YACtB,KAAK,aAAa,CAAC,IAAI;gBACrB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBACxG,MAAM;YACR,KAAK,aAAa,CAAC,IAAI;gBACrB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBACxG,MAAM;YACR,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzG,MAAM;QACR,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,GAAG,yDAAyD,CAAC;QAClF,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -3,13 +3,20 @@ import type { ConditionContext } from '../interfaces/condition-context-interface
|
|
|
3
3
|
* Base class for all conditions that can block a trip/trigger action.
|
|
4
4
|
*
|
|
5
5
|
* Extend this class and implement `evaluate()` to return `true` when the
|
|
6
|
-
* condition should prevent the action from proceeding.
|
|
6
|
+
* condition should prevent the action from proceeding. Set `_failureReason`
|
|
7
|
+
* before returning `true` so callers can retrieve it via `failureReason`.
|
|
7
8
|
*/
|
|
8
9
|
export declare abstract class Condition {
|
|
9
10
|
abstract readonly name: string;
|
|
11
|
+
protected _failureReason: string | undefined;
|
|
12
|
+
/** Returns the reason the condition blocked the last evaluated action, if any. */
|
|
13
|
+
get failureReason(): string | undefined;
|
|
14
|
+
/** Must be called at the top of every evaluate() implementation to clear any stale reason. */
|
|
15
|
+
protected clearFailureReason(): void;
|
|
10
16
|
/**
|
|
11
17
|
* Returns `true` if this condition blocks the action described by `context`.
|
|
12
18
|
* When `true` is returned the caller must reject the HomeKit request.
|
|
19
|
+
* Implementations must call `this.clearFailureReason()` before any allow/deny logic.
|
|
13
20
|
*/
|
|
14
21
|
abstract evaluate(context: ConditionContext): boolean;
|
|
15
22
|
}
|
|
@@ -2,8 +2,18 @@
|
|
|
2
2
|
* Base class for all conditions that can block a trip/trigger action.
|
|
3
3
|
*
|
|
4
4
|
* Extend this class and implement `evaluate()` to return `true` when the
|
|
5
|
-
* condition should prevent the action from proceeding.
|
|
5
|
+
* condition should prevent the action from proceeding. Set `_failureReason`
|
|
6
|
+
* before returning `true` so callers can retrieve it via `failureReason`.
|
|
6
7
|
*/
|
|
7
8
|
export class Condition {
|
|
9
|
+
_failureReason;
|
|
10
|
+
/** Returns the reason the condition blocked the last evaluated action, if any. */
|
|
11
|
+
get failureReason() {
|
|
12
|
+
return this._failureReason;
|
|
13
|
+
}
|
|
14
|
+
/** Must be called at the top of every evaluate() implementation to clear any stale reason. */
|
|
15
|
+
clearFailureReason() {
|
|
16
|
+
this._failureReason = undefined;
|
|
17
|
+
}
|
|
8
18
|
}
|
|
9
19
|
//# sourceMappingURL=condition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition.js","sourceRoot":"","sources":["../../src/conditions/condition.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"condition.js","sourceRoot":"","sources":["../../src/conditions/condition.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAgB,SAAS;IAGnB,cAAc,CAAqB;IAE7C,kFAAkF;IAClF,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,8FAA8F;IACpF,kBAAkB;QAC1B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;CAQF"}
|
|
@@ -26,6 +26,7 @@ export class DoubleKnockCondition extends Condition {
|
|
|
26
26
|
this.onCancelTimer = onCancelTimer;
|
|
27
27
|
}
|
|
28
28
|
evaluate({ state, options, value, origin, log }) {
|
|
29
|
+
this.clearFailureReason();
|
|
29
30
|
if (!value || !options.doubleKnock) {
|
|
30
31
|
return false;
|
|
31
32
|
}
|
|
@@ -52,7 +53,8 @@ export class DoubleKnockCondition extends Condition {
|
|
|
52
53
|
state.isKnocked = false;
|
|
53
54
|
log.info('Trip Switch (Reset): double-knock window expired without second activation');
|
|
54
55
|
});
|
|
55
|
-
|
|
56
|
+
this._failureReason = 'Trip Switch (Knock): double-knock is required, waiting for second activation';
|
|
57
|
+
log.warn(this._failureReason);
|
|
56
58
|
return true;
|
|
57
59
|
}
|
|
58
60
|
resolveWindow(currentState, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"double-knock-condition.js","sourceRoot":"","sources":["../../src/conditions/double-knock-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAU9B;IACA;IAVV,IAAI,GAAG,cAAc,CAAC;IAE/B;;;;;OAKG;IACH,YACmB,YAA6D,EAC7D,aAAyB;QAE1C,KAAK,EAAE,CAAC;QAHS,iBAAY,GAAZ,YAAY,CAAiD;QAC7D,kBAAa,GAAb,aAAa,CAAY;IAG5C,CAAC;IAED,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAoB;QAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,iFAAiF;YACjF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2CAA2C;QAC3C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE;YAC9B,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"double-knock-condition.js","sourceRoot":"","sources":["../../src/conditions/double-knock-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAU9B;IACA;IAVV,IAAI,GAAG,cAAc,CAAC;IAE/B;;;;;OAKG;IACH,YACmB,YAA6D,EAC7D,aAAyB;QAE1C,KAAK,EAAE,CAAC;QAHS,iBAAY,GAAZ,YAAY,CAAiD;QAC7D,kBAAa,GAAb,aAAa,CAAY;IAG5C,CAAC;IAED,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAoB;QAC/D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,iFAAiF;YACjF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2CAA2C;QAC3C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE;YAC9B,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,8EAA8E,CAAC;QACrG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CACnB,YAA2B,EAC3B,OAAoC;QAEpC,IAAI,YAAY,KAAK,aAAa,CAAC,IAAI,IAAI,OAAO,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;YACnF,OAAO,OAAO,CAAC,sBAAsB,CAAC;QACxC,CAAC;QACD,IAAI,YAAY,KAAK,aAAa,CAAC,IAAI,IAAI,OAAO,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;YACnF,OAAO,OAAO,CAAC,sBAAsB,CAAC;QACxC,CAAC;QACD,IAAI,YAAY,KAAK,aAAa,CAAC,KAAK,IAAI,OAAO,CAAC,uBAAuB,KAAK,IAAI,EAAE,CAAC;YACrF,OAAO,OAAO,CAAC,uBAAuB,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,CAAC,kBAAkB,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -8,6 +8,7 @@ import { Condition } from './condition.js';
|
|
|
8
8
|
export class NotArmedCondition extends Condition {
|
|
9
9
|
name = 'not-armed';
|
|
10
10
|
evaluate({ state, options, value, origin, log }) {
|
|
11
|
+
this.clearFailureReason();
|
|
11
12
|
if (!value) {
|
|
12
13
|
return false;
|
|
13
14
|
}
|
|
@@ -16,7 +17,8 @@ export class NotArmedCondition extends Condition {
|
|
|
16
17
|
const isNotOverrideSwitch = origin !== OriginType.OVERRIDE_SWITCH;
|
|
17
18
|
const blocked = isDisarmed && isNotOverridingOff && isNotOverrideSwitch;
|
|
18
19
|
if (blocked) {
|
|
19
|
-
|
|
20
|
+
this._failureReason = 'Trip Switch (Not armed): system is disarmed and override is not enabled';
|
|
21
|
+
log.warn(this._failureReason);
|
|
20
22
|
}
|
|
21
23
|
return blocked;
|
|
22
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-armed-condition.js","sourceRoot":"","sources":["../../src/conditions/not-armed-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IACrC,IAAI,GAAG,WAAW,CAAC;IAE5B,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAoB;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,GAAG,CAAC;QAC5D,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,MAAM,mBAAmB,GAAG,MAAM,KAAK,UAAU,CAAC,eAAe,CAAC;QAElE,MAAM,OAAO,GAAG,UAAU,IAAI,kBAAkB,IAAI,mBAAmB,CAAC;QACxE,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"not-armed-condition.js","sourceRoot":"","sources":["../../src/conditions/not-armed-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IACrC,IAAI,GAAG,WAAW,CAAC;IAE5B,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAoB;QAC/D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,GAAG,CAAC;QAC5D,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,MAAM,mBAAmB,GAAG,MAAM,KAAK,UAAU,CAAC,eAAe,CAAC;QAElE,MAAM,OAAO,GAAG,UAAU,IAAI,kBAAkB,IAAI,mBAAmB,CAAC;QACxE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,GAAG,yEAAyE,CAAC;YAChG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -6,11 +6,13 @@ import { Condition } from './condition.js';
|
|
|
6
6
|
export class TriggerAlreadyRunningCondition extends Condition {
|
|
7
7
|
name = 'trigger-already-running';
|
|
8
8
|
evaluate({ state, value, log }) {
|
|
9
|
+
this.clearFailureReason();
|
|
9
10
|
if (!value) {
|
|
10
11
|
return false;
|
|
11
12
|
}
|
|
12
13
|
if (state.isTripping) {
|
|
13
|
-
|
|
14
|
+
this._failureReason = 'Security System (Already tripped): trigger delay countdown is already running';
|
|
15
|
+
log.warn(this._failureReason);
|
|
14
16
|
return true;
|
|
15
17
|
}
|
|
16
18
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-already-running-condition.js","sourceRoot":"","sources":["../../src/conditions/trigger-already-running-condition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,8BAA+B,SAAQ,SAAS;IAClD,IAAI,GAAG,yBAAyB,CAAC;IAE1C,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,
|
|
1
|
+
{"version":3,"file":"trigger-already-running-condition.js","sourceRoot":"","sources":["../../src/conditions/trigger-already-running-condition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,OAAO,8BAA+B,SAAQ,SAAS;IAClD,IAAI,GAAG,yBAAyB,CAAC;IAE1C,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAoB;QAC9C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,cAAc,GAAG,+EAA+E,CAAC;YACtG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -10,6 +10,7 @@ import type { StorageService } from '../services/storage-service.js';
|
|
|
10
10
|
import type { AudioService } from '../services/audio-service.js';
|
|
11
11
|
import type { SensorHandler } from './sensor-handler.js';
|
|
12
12
|
import type { TimerManager } from '../timers/timer-manager.js';
|
|
13
|
+
import type { ServiceResult } from '../types/service-result-type.js';
|
|
13
14
|
/**
|
|
14
15
|
* Manages the core security-system state machine: arming, triggering, and resetting.
|
|
15
16
|
* Cross-handler side effects are signalled via the event bus so that this class has
|
|
@@ -28,7 +29,7 @@ export declare class StateHandler {
|
|
|
28
29
|
private readonly sensorHandler;
|
|
29
30
|
constructor(services: ServiceRegistry, state: SystemState, options: SecuritySystemOptions, Characteristic: CharacteristicConstructor, log: Logging, bus: EventBusService, storageService: StorageService, audio: AudioService, timers: TimerManager, sensorHandler: SensorHandler);
|
|
30
31
|
setCurrentState(state: SecurityState, origin: OriginType): void;
|
|
31
|
-
updateTargetState(state: SecurityState, origin: OriginType, delay: number):
|
|
32
|
+
updateTargetState(state: SecurityState, origin: OriginType, delay: number): ServiceResult;
|
|
32
33
|
getArmingSeconds(targetState: SecurityState): number;
|
|
33
34
|
resetTimers(): void;
|
|
34
35
|
/** Returns true while the trigger delay is counting down (trip switch is active). */
|
|
@@ -37,7 +38,11 @@ export declare class StateHandler {
|
|
|
37
38
|
isArmingLocked(targetState: SecurityState): boolean;
|
|
38
39
|
getAvailableTargetStates(): SecurityState[];
|
|
39
40
|
logMode(type: string, state: SecurityState | string): void;
|
|
40
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Returns a human-readable reason string if `state` is an invalid target,
|
|
43
|
+
* or `null` if the transition is permitted.
|
|
44
|
+
*/
|
|
45
|
+
private getBadTargetStateReason;
|
|
41
46
|
private handleTargetStateChange;
|
|
42
47
|
private handleCurrentStateChange;
|
|
43
48
|
private handleTriggeredState;
|
|
@@ -47,8 +47,9 @@ export class StateHandler {
|
|
|
47
47
|
this.storageService.save(this.state);
|
|
48
48
|
}
|
|
49
49
|
updateTargetState(state, origin, delay) {
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
const reason = this.getBadTargetStateReason(state);
|
|
51
|
+
if (reason !== null) {
|
|
52
|
+
return { success: false, reason };
|
|
52
53
|
}
|
|
53
54
|
this.state.targetState = state;
|
|
54
55
|
this.logMode('Target', state);
|
|
@@ -58,12 +59,12 @@ export class StateHandler {
|
|
|
58
59
|
this.handleTargetStateChange(origin);
|
|
59
60
|
if (state === this.state.currentState) {
|
|
60
61
|
this.setCurrentState(state, origin);
|
|
61
|
-
return
|
|
62
|
+
return { success: true };
|
|
62
63
|
}
|
|
63
64
|
const armSeconds = delay > 0 ? delay : 0;
|
|
64
65
|
if (armSeconds === 0) {
|
|
65
66
|
this.setCurrentState(state, origin);
|
|
66
|
-
return
|
|
67
|
+
return { success: true };
|
|
67
68
|
}
|
|
68
69
|
this.state.isArming = true;
|
|
69
70
|
this.handleArmingState();
|
|
@@ -72,7 +73,7 @@ export class StateHandler {
|
|
|
72
73
|
this.state.isArming = false;
|
|
73
74
|
this.setCurrentState(state, origin);
|
|
74
75
|
});
|
|
75
|
-
return true;
|
|
76
|
+
return { success: true };
|
|
76
77
|
}
|
|
77
78
|
getArmingSeconds(targetState) {
|
|
78
79
|
return getArmingSeconds(this.state, this.options, targetState);
|
|
@@ -109,23 +110,27 @@ export class StateHandler {
|
|
|
109
110
|
this.log.info(`${type} mode (${mode})`);
|
|
110
111
|
}
|
|
111
112
|
// ── Private helpers ────────────────────────────────────────────────────────
|
|
112
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Returns a human-readable reason string if `state` is an invalid target,
|
|
115
|
+
* or `null` if the transition is permitted.
|
|
116
|
+
*/
|
|
117
|
+
getBadTargetStateReason(state) {
|
|
113
118
|
const isTriggered = this.state.currentState === SecurityState.TRIGGERED;
|
|
114
119
|
const alreadySet = this.state.targetState === state;
|
|
115
120
|
if (alreadySet && !isTriggered) {
|
|
116
121
|
this.log.warn('Target mode (Already set)');
|
|
117
|
-
return
|
|
122
|
+
return 'target mode is already set';
|
|
118
123
|
}
|
|
119
124
|
if (!this.state.availableTargetStates.includes(state)) {
|
|
120
125
|
this.log.warn('Target mode (Disabled)');
|
|
121
|
-
return
|
|
126
|
+
return 'target mode is disabled';
|
|
122
127
|
}
|
|
123
128
|
const hasLock = this.options.armingLockSwitch || this.options.armingLockSwitches;
|
|
124
129
|
if (state !== SecurityState.OFF && hasLock && this.isArmingLocked(state)) {
|
|
125
130
|
this.log.warn('Arming lock (Not allowed)');
|
|
126
|
-
return
|
|
131
|
+
return 'arming is blocked by an arming lock switch';
|
|
127
132
|
}
|
|
128
|
-
return
|
|
133
|
+
return null;
|
|
129
134
|
}
|
|
130
135
|
handleTargetStateChange(origin) {
|
|
131
136
|
this.resetTimers();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-handler.js","sourceRoot":"","sources":["../../src/handlers/state-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"state-handler.js","sourceRoot":"","sources":["../../src/handlers/state-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import type { SecuritySystemOptions } from '../interfaces/options-interface.js';
|
|
|
7
7
|
import type { StateHandler } from './state-handler.js';
|
|
8
8
|
import type { TimerManager } from '../timers/timer-manager.js';
|
|
9
9
|
import type { EventBusService } from '../services/event-bus-service.js';
|
|
10
|
+
import type { ServiceResult } from '../types/service-result-type.js';
|
|
10
11
|
/**
|
|
11
12
|
* Handles all mode switches and the pause/extended switches.
|
|
12
13
|
* Calls StateHandler directly (one-way dependency — no cycle).
|
|
@@ -27,7 +28,7 @@ export declare class SwitchHandler {
|
|
|
27
28
|
setModeOffSwitch(value: boolean): number | null;
|
|
28
29
|
setModeAwayExtendedSwitch(value: boolean): number | null;
|
|
29
30
|
setModePauseSwitch(value: boolean): number | null;
|
|
30
|
-
updateArmingLock(mode: string, value: boolean):
|
|
31
|
+
updateArmingLock(mode: string, value: boolean): ServiceResult;
|
|
31
32
|
resetModeSwitches(): void;
|
|
32
33
|
updateModeSwitches(): void;
|
|
33
34
|
private logArmingLock;
|
|
@@ -95,10 +95,10 @@ export class SwitchHandler {
|
|
|
95
95
|
const key = map[mode];
|
|
96
96
|
if (!key) {
|
|
97
97
|
this.log.debug(`Unknown arming lock mode (${mode})`);
|
|
98
|
-
return false;
|
|
98
|
+
return { success: false, reason: `unknown arming lock mode: ${mode}` };
|
|
99
99
|
}
|
|
100
100
|
this.services[key].getCharacteristic(this.Characteristic.On).updateValue(value);
|
|
101
|
-
return true;
|
|
101
|
+
return { success: true };
|
|
102
102
|
}
|
|
103
103
|
// ── Mode switch display ────────────────────────────────────────────────────
|
|
104
104
|
resetModeSwitches() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch-handler.js","sourceRoot":"","sources":["../../src/handlers/switch-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAKnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"switch-handler.js","sourceRoot":"","sources":["../../src/handlers/switch-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import type { EventBusService } from '../services/event-bus-service.js';
|
|
|
9
9
|
import type { AudioService } from '../services/audio-service.js';
|
|
10
10
|
import type { SensorHandler } from './sensor-handler.js';
|
|
11
11
|
import type { TimerManager } from '../timers/timer-manager.js';
|
|
12
|
+
import type { ServiceResult } from '../types/service-result-type.js';
|
|
12
13
|
/**
|
|
13
14
|
* Handles the trip switch and trigger-delay logic, including all blocking conditions.
|
|
14
15
|
* Communicates state transitions back to the state machine via the event bus so that
|
|
@@ -26,17 +27,23 @@ export declare class TripHandler {
|
|
|
26
27
|
private readonly timers;
|
|
27
28
|
private readonly conditions;
|
|
28
29
|
constructor(services: ServiceRegistry, state: SystemState, options: SecuritySystemOptions, Characteristic: CharacteristicConstructor, log: Logging, bus: EventBusService, audio: AudioService, sensorHandler: SensorHandler, timers: TimerManager);
|
|
30
|
+
/**
|
|
31
|
+
* Evaluates all blocking conditions for a trip action without side effects.
|
|
32
|
+
* Returns a failed result with the condition's reason if any condition blocks the action.
|
|
33
|
+
*/
|
|
34
|
+
checkTripConditions(value: boolean, origin: OriginType): ServiceResult;
|
|
29
35
|
/**
|
|
30
36
|
* Core trip-switch logic shared by all trip/trigger paths.
|
|
31
|
-
* Returns
|
|
37
|
+
* Returns a result object indicating success or the reason for failure.
|
|
32
38
|
*/
|
|
33
|
-
updateTripSwitch(value: boolean, origin: OriginType, stateChanged: boolean):
|
|
39
|
+
updateTripSwitch(value: boolean, origin: OriginType, stateChanged: boolean): ServiceResult;
|
|
34
40
|
/**
|
|
35
41
|
* Trip a mode-specific switch. Only triggers if the system is currently in
|
|
36
42
|
* the required mode (or the alarm is triggered and target matches).
|
|
37
43
|
*/
|
|
38
|
-
triggerIfModeSet(requiredState: SecurityState, value: boolean):
|
|
44
|
+
triggerIfModeSet(requiredState: SecurityState, value: boolean): ServiceResult;
|
|
39
45
|
resetTripSwitches(): void;
|
|
46
|
+
private makeContext;
|
|
40
47
|
private activateTrip;
|
|
41
48
|
private cancelTrip;
|
|
42
49
|
private resolveTriggerSeconds;
|
|
@@ -45,24 +45,31 @@ export class TripHandler {
|
|
|
45
45
|
new TriggerAlreadyRunningCondition(),
|
|
46
46
|
];
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Evaluates all blocking conditions for a trip action without side effects.
|
|
50
|
+
* Returns a failed result with the condition's reason if any condition blocks the action.
|
|
51
|
+
*/
|
|
52
|
+
checkTripConditions(value, origin) {
|
|
53
|
+
if (!value) {
|
|
54
|
+
return { success: true };
|
|
55
|
+
}
|
|
56
|
+
const ctx = this.makeContext(value, origin);
|
|
57
|
+
for (const condition of this.conditions) {
|
|
58
|
+
if (condition.evaluate(ctx)) {
|
|
59
|
+
return { success: false, reason: condition.failureReason };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { success: true };
|
|
63
|
+
}
|
|
48
64
|
/**
|
|
49
65
|
* Core trip-switch logic shared by all trip/trigger paths.
|
|
50
|
-
* Returns
|
|
66
|
+
* Returns a result object indicating success or the reason for failure.
|
|
51
67
|
*/
|
|
52
68
|
updateTripSwitch(value, origin, stateChanged) {
|
|
53
|
-
const ctx = {
|
|
54
|
-
state: this.state,
|
|
55
|
-
services: this.services,
|
|
56
|
-
options: this.options,
|
|
57
|
-
value,
|
|
58
|
-
origin,
|
|
59
|
-
log: this.log,
|
|
60
|
-
};
|
|
61
69
|
if (value) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
70
|
+
const conditionResult = this.checkTripConditions(value, origin);
|
|
71
|
+
if (!conditionResult.success) {
|
|
72
|
+
return conditionResult;
|
|
66
73
|
}
|
|
67
74
|
this.activateTrip(origin);
|
|
68
75
|
}
|
|
@@ -73,7 +80,7 @@ export class TripHandler {
|
|
|
73
80
|
if (origin === OriginType.INTERNAL || origin === OriginType.EXTERNAL) {
|
|
74
81
|
this.services.tripSwitchService.updateCharacteristic(this.Characteristic.On, value);
|
|
75
82
|
}
|
|
76
|
-
return true;
|
|
83
|
+
return { success: true };
|
|
77
84
|
}
|
|
78
85
|
/**
|
|
79
86
|
* Trip a mode-specific switch. Only triggers if the system is currently in
|
|
@@ -86,7 +93,7 @@ export class TripHandler {
|
|
|
86
93
|
|| (isTriggered && this.state.targetState === requiredState);
|
|
87
94
|
if (!modeMatches) {
|
|
88
95
|
this.log.debug('Security System (Trip mode not set)');
|
|
89
|
-
return false;
|
|
96
|
+
return { success: false, reason: 'mode not set' };
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
99
|
return this.updateTripSwitch(value, OriginType.REGULAR_SWITCH, false);
|
|
@@ -119,6 +126,16 @@ export class TripHandler {
|
|
|
119
126
|
}
|
|
120
127
|
}
|
|
121
128
|
}
|
|
129
|
+
makeContext(value, origin) {
|
|
130
|
+
return {
|
|
131
|
+
state: this.state,
|
|
132
|
+
services: this.services,
|
|
133
|
+
options: this.options,
|
|
134
|
+
value,
|
|
135
|
+
origin,
|
|
136
|
+
log: this.log,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
122
139
|
activateTrip(origin) {
|
|
123
140
|
this.log.info('Security System (Tripped)');
|
|
124
141
|
if (this.options.trippedMotionSensor) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trip-handler.js","sourceRoot":"","sources":["../../src/handlers/trip-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"trip-handler.js","sourceRoot":"","sources":["../../src/handlers/trip-handler.ts"],"names":[],"mappings":"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"}
|