homebridge-securitysystem 12.0.0 → 13.0.0
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/.github/workflows/bump-version.yml +1 -1
- package/.gitignore +127 -0
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +30 -0
- package/config.schema.json +1 -145
- package/package.json +1 -1
- package/src/constants/default-constant.ts +0 -3
- package/src/constants/switch-uuid-constant.ts +0 -2
- package/src/handlers/sensor-handler.ts +0 -22
- package/src/handlers/state-handler.ts +0 -17
- package/src/handlers/trip-handler.ts +0 -3
- package/src/homekit/homekit-registrar.ts +1 -6
- package/src/homekit/service-factory.ts +0 -11
- package/src/interfaces/options-interface.ts +0 -19
- package/src/interfaces/service-registry-interface.ts +0 -4
- package/src/interfaces/system-state-interface.ts +0 -2
- package/src/security-system.ts +2 -14
- package/src/services/configuration-service.ts +0 -33
- package/src/services/event-bus-service.ts +1 -1
- package/src/tests/conditions.test.ts +0 -1
- package/src/tests/mqtt-service.test.ts +0 -1
- package/src/tests/server-service.test.ts +0 -1
- package/src/tests/state-handler.test.ts +14 -65
- package/src/tests/switch-handler.test.ts +2 -6
- package/src/tests/trip-handler.test.ts +7 -11
- package/src/timers/timer-manager.ts +0 -17
- package/src/types/mode-type.ts +1 -1
- package/dist/conditions/already-triggered-condition.d.ts +0 -10
- package/dist/conditions/already-triggered-condition.js +0 -22
- package/dist/conditions/already-triggered-condition.js.map +0 -1
- package/dist/conditions/arming-in-progress-condition.d.ts +0 -10
- package/dist/conditions/arming-in-progress-condition.js +0 -21
- package/dist/conditions/arming-in-progress-condition.js.map +0 -1
- package/dist/conditions/arming-lock-condition.d.ts +0 -13
- package/dist/conditions/arming-lock-condition.js +0 -50
- package/dist/conditions/arming-lock-condition.js.map +0 -1
- package/dist/conditions/condition.d.ts +0 -22
- package/dist/conditions/condition.js +0 -19
- package/dist/conditions/condition.js.map +0 -1
- package/dist/conditions/double-knock-condition.d.ts +0 -24
- package/dist/conditions/double-knock-condition.js +0 -73
- package/dist/conditions/double-knock-condition.js.map +0 -1
- package/dist/conditions/not-armed-condition.d.ts +0 -10
- package/dist/conditions/not-armed-condition.js +0 -26
- package/dist/conditions/not-armed-condition.js.map +0 -1
- package/dist/conditions/trigger-already-running-condition.d.ts +0 -10
- package/dist/conditions/trigger-already-running-condition.js +0 -21
- package/dist/conditions/trigger-already-running-condition.js.map +0 -1
- package/dist/constants/default-constant.d.ts +0 -27
- package/dist/constants/default-constant.js +0 -30
- package/dist/constants/default-constant.js.map +0 -1
- package/dist/constants/homekit-constant.d.ts +0 -4
- package/dist/constants/homekit-constant.js +0 -5
- package/dist/constants/homekit-constant.js.map +0 -1
- package/dist/constants/switch-uuid-constant.d.ts +0 -23
- package/dist/constants/switch-uuid-constant.js +0 -24
- package/dist/constants/switch-uuid-constant.js.map +0 -1
- package/dist/handlers/sensor-handler.d.ts +0 -20
- package/dist/handlers/sensor-handler.js +0 -66
- package/dist/handlers/sensor-handler.js.map +0 -1
- package/dist/handlers/state-handler.d.ts +0 -52
- package/dist/handlers/state-handler.js +0 -213
- package/dist/handlers/state-handler.js.map +0 -1
- package/dist/handlers/switch-handler.d.ts +0 -35
- package/dist/handlers/switch-handler.js +0 -134
- package/dist/handlers/switch-handler.js.map +0 -1
- package/dist/handlers/trip-handler.d.ts +0 -51
- package/dist/handlers/trip-handler.js +0 -198
- package/dist/handlers/trip-handler.js.map +0 -1
- package/dist/homekit/homekit-registrar.d.ts +0 -19
- package/dist/homekit/homekit-registrar.js +0 -156
- package/dist/homekit/homekit-registrar.js.map +0 -1
- package/dist/homekit/service-factory.d.ts +0 -9
- package/dist/homekit/service-factory.js +0 -124
- package/dist/homekit/service-factory.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js.map +0 -1
- package/dist/interfaces/condition-context-interface.d.ts +0 -16
- package/dist/interfaces/condition-context-interface.js +0 -2
- package/dist/interfaces/condition-context-interface.js.map +0 -1
- package/dist/interfaces/hap-types-interface.d.ts +0 -9
- package/dist/interfaces/hap-types-interface.js +0 -2
- package/dist/interfaces/hap-types-interface.js.map +0 -1
- package/dist/interfaces/mqtt-status-payload-interface.d.ts +0 -6
- package/dist/interfaces/mqtt-status-payload-interface.js +0 -2
- package/dist/interfaces/mqtt-status-payload-interface.js.map +0 -1
- package/dist/interfaces/options-interface.d.ts +0 -103
- package/dist/interfaces/options-interface.js +0 -2
- package/dist/interfaces/options-interface.js.map +0 -1
- package/dist/interfaces/persisted-state-interface.d.ts +0 -6
- package/dist/interfaces/persisted-state-interface.js +0 -2
- package/dist/interfaces/persisted-state-interface.js.map +0 -1
- package/dist/interfaces/service-registry-interface.d.ts +0 -33
- package/dist/interfaces/service-registry-interface.js +0 -2
- package/dist/interfaces/service-registry-interface.js.map +0 -1
- package/dist/interfaces/system-state-interface.d.ts +0 -15
- package/dist/interfaces/system-state-interface.js +0 -2
- package/dist/interfaces/system-state-interface.js.map +0 -1
- package/dist/schemas/arming-lock-schema.d.ts +0 -10
- package/dist/schemas/arming-lock-schema.js +0 -12
- package/dist/schemas/arming-lock-schema.js.map +0 -1
- package/dist/schemas/error-schema.d.ts +0 -4
- package/dist/schemas/error-schema.js +0 -7
- package/dist/schemas/error-schema.js.map +0 -1
- package/dist/schemas/mode-request-schema.d.ts +0 -10
- package/dist/schemas/mode-request-schema.js +0 -18
- package/dist/schemas/mode-request-schema.js.map +0 -1
- package/dist/schemas/status-response-schema.d.ts +0 -7
- package/dist/schemas/status-response-schema.js +0 -10
- package/dist/schemas/status-response-schema.js.map +0 -1
- package/dist/schemas/trip-mode-request-schema.d.ts +0 -9
- package/dist/schemas/trip-mode-request-schema.js +0 -24
- package/dist/schemas/trip-mode-request-schema.js.map +0 -1
- package/dist/security-system.d.ts +0 -22
- package/dist/security-system.js +0 -154
- package/dist/security-system.js.map +0 -1
- package/dist/services/audio-service.d.ts +0 -21
- package/dist/services/audio-service.js +0 -113
- package/dist/services/audio-service.js.map +0 -1
- package/dist/services/command-service.d.ts +0 -16
- package/dist/services/command-service.js +0 -65
- package/dist/services/command-service.js.map +0 -1
- package/dist/services/configuration-service.d.ts +0 -25
- package/dist/services/configuration-service.js +0 -218
- package/dist/services/configuration-service.js.map +0 -1
- package/dist/services/event-bus-service.d.ts +0 -12
- package/dist/services/event-bus-service.js +0 -17
- package/dist/services/event-bus-service.js.map +0 -1
- package/dist/services/mqtt-service.d.ts +0 -16
- package/dist/services/mqtt-service.js +0 -97
- package/dist/services/mqtt-service.js.map +0 -1
- package/dist/services/server-service.d.ts +0 -28
- package/dist/services/server-service.js +0 -275
- package/dist/services/server-service.js.map +0 -1
- package/dist/services/storage-service.d.ts +0 -14
- package/dist/services/storage-service.js +0 -70
- package/dist/services/storage-service.js.map +0 -1
- package/dist/services/webhook-service.d.ts +0 -16
- package/dist/services/webhook-service.js +0 -68
- package/dist/services/webhook-service.js.map +0 -1
- package/dist/tests/conditions.test.d.ts +0 -1
- package/dist/tests/conditions.test.js +0 -148
- package/dist/tests/conditions.test.js.map +0 -1
- package/dist/tests/mqtt-service.test.d.ts +0 -1
- package/dist/tests/mqtt-service.test.js +0 -167
- package/dist/tests/mqtt-service.test.js.map +0 -1
- package/dist/tests/server-service.test.d.ts +0 -1
- package/dist/tests/server-service.test.js +0 -187
- package/dist/tests/server-service.test.js.map +0 -1
- package/dist/tests/state-handler.test.d.ts +0 -1
- package/dist/tests/state-handler.test.js +0 -273
- package/dist/tests/state-handler.test.js.map +0 -1
- package/dist/tests/switch-handler.test.d.ts +0 -1
- package/dist/tests/switch-handler.test.js +0 -267
- package/dist/tests/switch-handler.test.js.map +0 -1
- package/dist/tests/trip-handler.test.d.ts +0 -1
- package/dist/tests/trip-handler.test.js +0 -289
- package/dist/tests/trip-handler.test.js.map +0 -1
- package/dist/timers/timer-manager.d.ts +0 -34
- package/dist/timers/timer-manager.js +0 -132
- package/dist/timers/timer-manager.js.map +0 -1
- package/dist/types/event-payload-map-type.d.ts +0 -14
- package/dist/types/event-payload-map-type.js +0 -2
- package/dist/types/event-payload-map-type.js.map +0 -1
- package/dist/types/event-type.d.ts +0 -38
- package/dist/types/event-type.js +0 -17
- package/dist/types/event-type.js.map +0 -1
- package/dist/types/mode-type.d.ts +0 -4
- package/dist/types/mode-type.js +0 -2
- package/dist/types/mode-type.js.map +0 -1
- package/dist/types/origin-type.d.ts +0 -9
- package/dist/types/origin-type.js +0 -11
- package/dist/types/origin-type.js.map +0 -1
- package/dist/types/security-state-type.d.ts +0 -11
- package/dist/types/security-state-type.js +0 -13
- package/dist/types/security-state-type.js.map +0 -1
- package/dist/types/service-result-type.d.ts +0 -4
- package/dist/types/service-result-type.js +0 -2
- package/dist/types/service-result-type.js.map +0 -1
- package/dist/utils/arming-util.d.ts +0 -19
- package/dist/utils/arming-util.js +0 -24
- package/dist/utils/arming-util.js.map +0 -1
- package/dist/utils/state-util.d.ts +0 -8
- package/dist/utils/state-util.js +0 -29
- package/dist/utils/state-util.js.map +0 -1
- package/sounds/README +0 -22
- package/sounds/de-DE/current-away.mp3 +0 -0
- package/sounds/de-DE/current-home.mp3 +0 -0
- package/sounds/de-DE/current-night.mp3 +0 -0
- package/sounds/de-DE/current-off.mp3 +0 -0
- package/sounds/de-DE/current-triggered.mp3 +0 -0
- package/sounds/de-DE/current-warning.mp3 +0 -0
- package/sounds/de-DE/target-away.mp3 +0 -0
- package/sounds/de-DE/target-home.mp3 +0 -0
- package/sounds/de-DE/target-night.mp3 +0 -0
- package/sounds/en-US/current-away.mp3 +0 -0
- package/sounds/en-US/current-home.mp3 +0 -0
- package/sounds/en-US/current-night.mp3 +0 -0
- package/sounds/en-US/current-off.mp3 +0 -0
- package/sounds/en-US/current-triggered.mp3 +0 -0
- package/sounds/en-US/current-warning.mp3 +0 -0
- package/sounds/en-US/target-away.mp3 +0 -0
- package/sounds/en-US/target-home.mp3 +0 -0
- package/sounds/en-US/target-night.mp3 +0 -0
- package/src/services/audio-service.ts +0 -133
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { SecurityState } from '../types/security-state-type.js';
|
|
2
|
-
import { Condition } from './condition.js';
|
|
3
|
-
/**
|
|
4
|
-
* Blocks arming when an arming-lock switch (global or mode-specific) is active.
|
|
5
|
-
* Does NOT block disarming.
|
|
6
|
-
*/
|
|
7
|
-
export class ArmingLockCondition extends Condition {
|
|
8
|
-
Characteristic;
|
|
9
|
-
name = 'arming-lock';
|
|
10
|
-
constructor(Characteristic) {
|
|
11
|
-
super();
|
|
12
|
-
this.Characteristic = Characteristic;
|
|
13
|
-
}
|
|
14
|
-
evaluate({ state, services, options }) {
|
|
15
|
-
this.clearFailureReason();
|
|
16
|
-
const hasLockFeature = options.armingLockSwitch || options.armingLockSwitches;
|
|
17
|
-
if (!hasLockFeature) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
const targetState = state.targetState;
|
|
21
|
-
if (targetState === SecurityState.OFF) {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
// Check global arming-lock switch.
|
|
25
|
-
const globalOn = services.armingLockSwitchService
|
|
26
|
-
.getCharacteristic(this.Characteristic.On).value;
|
|
27
|
-
if (globalOn) {
|
|
28
|
-
this._failureReason = 'arming is blocked by the global arming lock switch';
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
// Check mode-specific arming-lock switch.
|
|
32
|
-
let blocked = false;
|
|
33
|
-
switch (targetState) {
|
|
34
|
-
case SecurityState.HOME:
|
|
35
|
-
blocked = Boolean(services.armingLockHomeSwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
36
|
-
break;
|
|
37
|
-
case SecurityState.AWAY:
|
|
38
|
-
blocked = Boolean(services.armingLockAwaySwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
39
|
-
break;
|
|
40
|
-
case SecurityState.NIGHT:
|
|
41
|
-
blocked = Boolean(services.armingLockNightSwitchService.getCharacteristic(this.Characteristic.On).value);
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
if (blocked) {
|
|
45
|
-
this._failureReason = 'arming is blocked by a mode-specific arming lock switch';
|
|
46
|
-
}
|
|
47
|
-
return blocked;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=arming-lock-condition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,cAAc;IAFlC,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,cAAyC;QACpE,KAAK,EAAE,CAAC;8BADmB,cAAc;IAE3C,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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ConditionContext } from '../interfaces/condition-context-interface.js';
|
|
2
|
-
/**
|
|
3
|
-
* Base class for all conditions that can block a trip/trigger action.
|
|
4
|
-
*
|
|
5
|
-
* Extend this class and implement `evaluate()` to return `true` when the
|
|
6
|
-
* condition should prevent the action from proceeding. Set `_failureReason`
|
|
7
|
-
* before returning `true` so callers can retrieve it via `failureReason`.
|
|
8
|
-
*/
|
|
9
|
-
export declare abstract class Condition {
|
|
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;
|
|
16
|
-
/**
|
|
17
|
-
* Returns `true` if this condition blocks the action described by `context`.
|
|
18
|
-
* When `true` is returned the caller must reject the HomeKit request.
|
|
19
|
-
* Implementations must call `this.clearFailureReason()` before any allow/deny logic.
|
|
20
|
-
*/
|
|
21
|
-
abstract evaluate(context: ConditionContext): boolean;
|
|
22
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base class for all conditions that can block a trip/trigger action.
|
|
3
|
-
*
|
|
4
|
-
* Extend this class and implement `evaluate()` to return `true` when the
|
|
5
|
-
* condition should prevent the action from proceeding. Set `_failureReason`
|
|
6
|
-
* before returning `true` so callers can retrieve it via `failureReason`.
|
|
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
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=condition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ConditionContext } from '../interfaces/condition-context-interface.js';
|
|
2
|
-
import { Condition } from './condition.js';
|
|
3
|
-
/**
|
|
4
|
-
* Implements the double-knock pattern: the first activation within a mode that
|
|
5
|
-
* has double-knock enabled sets a "knocked" flag and rejects the trip. Only the
|
|
6
|
-
* second activation within the configured window proceeds.
|
|
7
|
-
*
|
|
8
|
-
* The caller is responsible for managing `state.isKnocked` and the timeout
|
|
9
|
-
* via the `onFirstKnock` callback injected at construction.
|
|
10
|
-
*/
|
|
11
|
-
export declare class DoubleKnockCondition extends Condition {
|
|
12
|
-
private readonly onFirstKnock;
|
|
13
|
-
private readonly onCancelTimer;
|
|
14
|
-
readonly name = "double-knock";
|
|
15
|
-
/**
|
|
16
|
-
* @param onFirstKnock Called when the first knock is detected.
|
|
17
|
-
* The callback receives the window duration in seconds and a reset function
|
|
18
|
-
* to invoke when the window expires.
|
|
19
|
-
* @param onCancelTimer Called on the second knock to cancel the running window timer.
|
|
20
|
-
*/
|
|
21
|
-
constructor(onFirstKnock: (seconds: number, onExpire: () => void) => void, onCancelTimer: () => void);
|
|
22
|
-
evaluate({ state, options, value, origin, log }: ConditionContext): boolean;
|
|
23
|
-
private resolveWindow;
|
|
24
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { SecurityState } from '../types/security-state-type.js';
|
|
2
|
-
import { OriginType } from '../types/origin-type.js';
|
|
3
|
-
import { modeToState } from '../utils/state-util.js';
|
|
4
|
-
import { Condition } from './condition.js';
|
|
5
|
-
/**
|
|
6
|
-
* Implements the double-knock pattern: the first activation within a mode that
|
|
7
|
-
* has double-knock enabled sets a "knocked" flag and rejects the trip. Only the
|
|
8
|
-
* second activation within the configured window proceeds.
|
|
9
|
-
*
|
|
10
|
-
* The caller is responsible for managing `state.isKnocked` and the timeout
|
|
11
|
-
* via the `onFirstKnock` callback injected at construction.
|
|
12
|
-
*/
|
|
13
|
-
export class DoubleKnockCondition extends Condition {
|
|
14
|
-
onFirstKnock;
|
|
15
|
-
onCancelTimer;
|
|
16
|
-
name = 'double-knock';
|
|
17
|
-
/**
|
|
18
|
-
* @param onFirstKnock Called when the first knock is detected.
|
|
19
|
-
* The callback receives the window duration in seconds and a reset function
|
|
20
|
-
* to invoke when the window expires.
|
|
21
|
-
* @param onCancelTimer Called on the second knock to cancel the running window timer.
|
|
22
|
-
*/
|
|
23
|
-
constructor(onFirstKnock, onCancelTimer) {
|
|
24
|
-
super();
|
|
25
|
-
this.onFirstKnock = onFirstKnock;
|
|
26
|
-
this.onCancelTimer = onCancelTimer;
|
|
27
|
-
}
|
|
28
|
-
evaluate({ state, options, value, origin, log }) {
|
|
29
|
-
this.clearFailureReason();
|
|
30
|
-
if (!value || !options.doubleKnock) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
if (origin === OriginType.OVERRIDE_SWITCH) {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
if (state.isArming) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
const knockableStates = options.doubleKnockModes.map(m => modeToState(m.toLowerCase()));
|
|
40
|
-
if (!knockableStates.includes(state.currentState)) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
if (state.isKnocked) {
|
|
44
|
-
// Second knock — clear the flag and cancel the window timer, then allow through.
|
|
45
|
-
state.isKnocked = false;
|
|
46
|
-
this.onCancelTimer();
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
// First knock — block and schedule expiry.
|
|
50
|
-
state.isKnocked = true;
|
|
51
|
-
const seconds = this.resolveWindow(state.currentState, options);
|
|
52
|
-
this.onFirstKnock(seconds, () => {
|
|
53
|
-
state.isKnocked = false;
|
|
54
|
-
log.info('Trip Switch (Reset): double-knock window expired without second activation');
|
|
55
|
-
});
|
|
56
|
-
this._failureReason = 'Trip Switch (Knock): double-knock is required, waiting for second activation';
|
|
57
|
-
log.warn(this._failureReason);
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
resolveWindow(currentState, options) {
|
|
61
|
-
if (currentState === SecurityState.HOME && options.homeDoubleKnockSeconds !== null) {
|
|
62
|
-
return options.homeDoubleKnockSeconds;
|
|
63
|
-
}
|
|
64
|
-
if (currentState === SecurityState.AWAY && options.awayDoubleKnockSeconds !== null) {
|
|
65
|
-
return options.awayDoubleKnockSeconds;
|
|
66
|
-
}
|
|
67
|
-
if (currentState === SecurityState.NIGHT && options.nightDoubleKnockSeconds !== null) {
|
|
68
|
-
return options.nightDoubleKnockSeconds;
|
|
69
|
-
}
|
|
70
|
-
return options.doubleKnockSeconds;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=double-knock-condition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,YAAY;IACZ,aAAa;IAVvB,IAAI,GAAG,cAAc,CAAC;IAE/B;;;;;OAKG;IACH,YACmB,YAA6D,EAC7D,aAAyB;QAE1C,KAAK,EAAE,CAAC;4BAHS,YAAY;6BACZ,aAAa;IAGhC,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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ConditionContext } from '../interfaces/condition-context-interface.js';
|
|
2
|
-
import { Condition } from './condition.js';
|
|
3
|
-
/**
|
|
4
|
-
* Blocks a trip action when the system is disarmed and neither
|
|
5
|
-
* `override_off` nor the override switch is in use.
|
|
6
|
-
*/
|
|
7
|
-
export declare class NotArmedCondition extends Condition {
|
|
8
|
-
readonly name = "not-armed";
|
|
9
|
-
evaluate({ state, options, value, origin, log }: ConditionContext): boolean;
|
|
10
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { SecurityState } from '../types/security-state-type.js';
|
|
2
|
-
import { OriginType } from '../types/origin-type.js';
|
|
3
|
-
import { Condition } from './condition.js';
|
|
4
|
-
/**
|
|
5
|
-
* Blocks a trip action when the system is disarmed and neither
|
|
6
|
-
* `override_off` nor the override switch is in use.
|
|
7
|
-
*/
|
|
8
|
-
export class NotArmedCondition extends Condition {
|
|
9
|
-
name = 'not-armed';
|
|
10
|
-
evaluate({ state, options, value, origin, log }) {
|
|
11
|
-
this.clearFailureReason();
|
|
12
|
-
if (!value) {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
const isDisarmed = state.currentState === SecurityState.OFF;
|
|
16
|
-
const isNotOverridingOff = !options.overrideOff;
|
|
17
|
-
const isNotOverrideSwitch = origin !== OriginType.OVERRIDE_SWITCH;
|
|
18
|
-
const blocked = isDisarmed && isNotOverridingOff && isNotOverrideSwitch;
|
|
19
|
-
if (blocked) {
|
|
20
|
-
this._failureReason = 'Trip Switch (Not armed): system is disarmed and override is not enabled';
|
|
21
|
-
log.warn(this._failureReason);
|
|
22
|
-
}
|
|
23
|
-
return blocked;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=not-armed-condition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ConditionContext } from '../interfaces/condition-context-interface.js';
|
|
2
|
-
import { Condition } from './condition.js';
|
|
3
|
-
/**
|
|
4
|
-
* Blocks a trip activation when the trigger-delay countdown is already running.
|
|
5
|
-
* Prevents stacking multiple trigger events during the pre-alarm window.
|
|
6
|
-
*/
|
|
7
|
-
export declare class TriggerAlreadyRunningCondition extends Condition {
|
|
8
|
-
readonly name = "trigger-already-running";
|
|
9
|
-
evaluate({ state, value, log }: ConditionContext): boolean;
|
|
10
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Condition } from './condition.js';
|
|
2
|
-
/**
|
|
3
|
-
* Blocks a trip activation when the trigger-delay countdown is already running.
|
|
4
|
-
* Prevents stacking multiple trigger events during the pre-alarm window.
|
|
5
|
-
*/
|
|
6
|
-
export class TriggerAlreadyRunningCondition extends Condition {
|
|
7
|
-
name = 'trigger-already-running';
|
|
8
|
-
evaluate({ state, value, log }) {
|
|
9
|
-
this.clearFailureReason();
|
|
10
|
-
if (!value) {
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
13
|
-
if (state.isTripping) {
|
|
14
|
-
this._failureReason = 'Security System (Already tripped): trigger delay countdown is already running';
|
|
15
|
-
log.warn(this._failureReason);
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=trigger-already-running-condition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/** Default configuration values applied when a config property is not set. */
|
|
2
|
-
export declare const DEFAULTS: {
|
|
3
|
-
readonly NAME: 'Security System';
|
|
4
|
-
readonly SERIAL_NUMBER: 'S3CUR1TYSYST3M';
|
|
5
|
-
readonly DEFAULT_MODE: 'off';
|
|
6
|
-
readonly ARM_SECONDS: 0;
|
|
7
|
-
readonly TRIGGER_SECONDS: 0;
|
|
8
|
-
readonly RESET_MINUTES: 10;
|
|
9
|
-
readonly DOUBLE_KNOCK_SECONDS: 90;
|
|
10
|
-
readonly TRIPPED_SENSOR_SECONDS: 5;
|
|
11
|
-
readonly TRIGGERED_SENSOR_SECONDS: 5;
|
|
12
|
-
readonly PAUSE_MINUTES: 0;
|
|
13
|
-
readonly AUDIO_LANGUAGE: 'en-US';
|
|
14
|
-
readonly TRIP_SWITCH_NAME: 'Trip';
|
|
15
|
-
readonly TRIP_HOME_SWITCH_NAME: 'Trip Home';
|
|
16
|
-
readonly TRIP_AWAY_SWITCH_NAME: 'Trip Away';
|
|
17
|
-
readonly TRIP_NIGHT_SWITCH_NAME: 'Trip Night';
|
|
18
|
-
readonly TRIP_OVERRIDE_SWITCH_NAME: 'Trip Override';
|
|
19
|
-
readonly MODE_HOME_SWITCH_NAME: 'Mode Home';
|
|
20
|
-
readonly MODE_AWAY_SWITCH_NAME: 'Mode Away';
|
|
21
|
-
readonly MODE_NIGHT_SWITCH_NAME: 'Mode Night';
|
|
22
|
-
readonly MODE_OFF_SWITCH_NAME: 'Mode Off';
|
|
23
|
-
readonly MODE_AWAY_EXTENDED_SWITCH_NAME: 'Mode Away Extended';
|
|
24
|
-
readonly MODE_PAUSE_SWITCH_NAME: 'Mode Pause';
|
|
25
|
-
readonly AUDIO_SWITCH_NAME: 'Audio';
|
|
26
|
-
readonly MQTT_TOPIC: 'security-system/state';
|
|
27
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/** Default configuration values applied when a config property is not set. */
|
|
2
|
-
export const DEFAULTS = {
|
|
3
|
-
NAME: 'Security System',
|
|
4
|
-
SERIAL_NUMBER: 'S3CUR1TYSYST3M',
|
|
5
|
-
DEFAULT_MODE: 'off',
|
|
6
|
-
ARM_SECONDS: 0,
|
|
7
|
-
TRIGGER_SECONDS: 0,
|
|
8
|
-
RESET_MINUTES: 10,
|
|
9
|
-
DOUBLE_KNOCK_SECONDS: 90,
|
|
10
|
-
TRIPPED_SENSOR_SECONDS: 5,
|
|
11
|
-
TRIGGERED_SENSOR_SECONDS: 5,
|
|
12
|
-
PAUSE_MINUTES: 0,
|
|
13
|
-
AUDIO_LANGUAGE: 'en-US',
|
|
14
|
-
// Switch display names
|
|
15
|
-
TRIP_SWITCH_NAME: 'Trip',
|
|
16
|
-
TRIP_HOME_SWITCH_NAME: 'Trip Home',
|
|
17
|
-
TRIP_AWAY_SWITCH_NAME: 'Trip Away',
|
|
18
|
-
TRIP_NIGHT_SWITCH_NAME: 'Trip Night',
|
|
19
|
-
TRIP_OVERRIDE_SWITCH_NAME: 'Trip Override',
|
|
20
|
-
MODE_HOME_SWITCH_NAME: 'Mode Home',
|
|
21
|
-
MODE_AWAY_SWITCH_NAME: 'Mode Away',
|
|
22
|
-
MODE_NIGHT_SWITCH_NAME: 'Mode Night',
|
|
23
|
-
MODE_OFF_SWITCH_NAME: 'Mode Off',
|
|
24
|
-
MODE_AWAY_EXTENDED_SWITCH_NAME: 'Mode Away Extended',
|
|
25
|
-
MODE_PAUSE_SWITCH_NAME: 'Mode Pause',
|
|
26
|
-
AUDIO_SWITCH_NAME: 'Audio',
|
|
27
|
-
// MQTT
|
|
28
|
-
MQTT_TOPIC: 'security-system/state',
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=default-constant.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-constant.js","sourceRoot":"","sources":["../../src/constants/default-constant.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,iBAAiB;IACvB,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,CAAC;IACd,eAAe,EAAE,CAAC;IAClB,aAAa,EAAE,EAAE;IACjB,oBAAoB,EAAE,EAAE;IACxB,sBAAsB,EAAE,CAAC;IACzB,wBAAwB,EAAE,CAAC;IAC3B,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,OAAO;IAEvB,uBAAuB;IACvB,gBAAgB,EAAE,MAAM;IACxB,qBAAqB,EAAE,WAAW;IAClC,qBAAqB,EAAE,WAAW;IAClC,sBAAsB,EAAE,YAAY;IACpC,yBAAyB,EAAE,eAAe;IAC1C,qBAAqB,EAAE,WAAW;IAClC,qBAAqB,EAAE,WAAW;IAClC,sBAAsB,EAAE,YAAY;IACpC,oBAAoB,EAAE,UAAU;IAChC,8BAA8B,EAAE,oBAAoB;IACpD,sBAAsB,EAAE,YAAY;IACpC,iBAAiB,EAAE,OAAO;IAE1B,OAAO;IACP,UAAU,EAAE,uBAAuB;CAC3B,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** HomeKit HAP status code returned when an action is not permitted in the current state. */
|
|
2
|
-
export declare const HK_NOT_ALLOWED_IN_CURRENT_STATE = -70412;
|
|
3
|
-
/** Pulse duration in ms used by motion sensors to emit a brief motion event. */
|
|
4
|
-
export declare const SENSOR_PULSE_MS = 750;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/** HomeKit HAP status code returned when an action is not permitted in the current state. */
|
|
2
|
-
export const HK_NOT_ALLOWED_IN_CURRENT_STATE = -70412;
|
|
3
|
-
/** Pulse duration in ms used by motion sensors to emit a brief motion event. */
|
|
4
|
-
export const SENSOR_PULSE_MS = 750;
|
|
5
|
-
//# sourceMappingURL=homekit-constant.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"homekit-constant.js","sourceRoot":"","sources":["../../src/constants/homekit-constant.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,KAAK,CAAC;AAEtD,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/** Stable subtype UUIDs for each HomeKit service. Must not change between restarts. */
|
|
2
|
-
export declare const SWITCH_UUIDS: {
|
|
3
|
-
readonly TRIP: 'siren-switch';
|
|
4
|
-
readonly TRIP_HOME: 'siren-home';
|
|
5
|
-
readonly TRIP_AWAY: 'siren-away';
|
|
6
|
-
readonly TRIP_NIGHT: 'siren-night';
|
|
7
|
-
readonly TRIP_OVERRIDE: 'pink-sheep';
|
|
8
|
-
readonly ARMING_LOCK: 'arming-lock';
|
|
9
|
-
readonly ARMING_LOCK_HOME: 'arming-lock-home';
|
|
10
|
-
readonly ARMING_LOCK_AWAY: 'arming-lock-away';
|
|
11
|
-
readonly ARMING_LOCK_NIGHT: 'arming-lock-night';
|
|
12
|
-
readonly MODE_HOME: 'mode-home';
|
|
13
|
-
readonly MODE_AWAY: 'mode-away';
|
|
14
|
-
readonly MODE_NIGHT: 'mode-night';
|
|
15
|
-
readonly MODE_OFF: 'mode-off';
|
|
16
|
-
readonly MODE_AWAY_EXTENDED: 'mode-away-extended';
|
|
17
|
-
readonly MODE_PAUSE: 'mode-pause';
|
|
18
|
-
readonly AUDIO: 'kx82r64zN3txDXKFiX9JDi';
|
|
19
|
-
readonly ARMING_SENSOR: 'arming-motion-sensor';
|
|
20
|
-
readonly TRIPPED_SENSOR: 'siren-tripped';
|
|
21
|
-
readonly TRIGGERED_SENSOR: 'siren-triggered';
|
|
22
|
-
readonly RESET_SENSOR: 'reset-event';
|
|
23
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/** Stable subtype UUIDs for each HomeKit service. Must not change between restarts. */
|
|
2
|
-
export const SWITCH_UUIDS = {
|
|
3
|
-
TRIP: 'siren-switch',
|
|
4
|
-
TRIP_HOME: 'siren-home',
|
|
5
|
-
TRIP_AWAY: 'siren-away',
|
|
6
|
-
TRIP_NIGHT: 'siren-night',
|
|
7
|
-
TRIP_OVERRIDE: 'pink-sheep',
|
|
8
|
-
ARMING_LOCK: 'arming-lock',
|
|
9
|
-
ARMING_LOCK_HOME: 'arming-lock-home',
|
|
10
|
-
ARMING_LOCK_AWAY: 'arming-lock-away',
|
|
11
|
-
ARMING_LOCK_NIGHT: 'arming-lock-night',
|
|
12
|
-
MODE_HOME: 'mode-home',
|
|
13
|
-
MODE_AWAY: 'mode-away',
|
|
14
|
-
MODE_NIGHT: 'mode-night',
|
|
15
|
-
MODE_OFF: 'mode-off',
|
|
16
|
-
MODE_AWAY_EXTENDED: 'mode-away-extended',
|
|
17
|
-
MODE_PAUSE: 'mode-pause',
|
|
18
|
-
AUDIO: 'kx82r64zN3txDXKFiX9JDi',
|
|
19
|
-
ARMING_SENSOR: 'arming-motion-sensor',
|
|
20
|
-
TRIPPED_SENSOR: 'siren-tripped',
|
|
21
|
-
TRIGGERED_SENSOR: 'siren-triggered',
|
|
22
|
-
RESET_SENSOR: 'reset-event',
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=switch-uuid-constant.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch-uuid-constant.js","sourceRoot":"","sources":["../../src/constants/switch-uuid-constant.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,YAAY;IAC3B,WAAW,EAAE,aAAa;IAC1B,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,kBAAkB,EAAE,oBAAoB;IACxC,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,wBAAwB;IAC/B,aAAa,EAAE,sBAAsB;IACrC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,YAAY,EAAE,aAAa;CACnB,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Logging } from 'homebridge';
|
|
2
|
-
import type { ServiceRegistry } from '../interfaces/service-registry-interface.js';
|
|
3
|
-
import type { CharacteristicConstructor } from '../interfaces/hap-types-interface.js';
|
|
4
|
-
/** Manages all motion sensor characteristic updates. */
|
|
5
|
-
export declare class SensorHandler {
|
|
6
|
-
private readonly services;
|
|
7
|
-
private readonly Characteristic;
|
|
8
|
-
private readonly log;
|
|
9
|
-
constructor(services: ServiceRegistry, Characteristic: CharacteristicConstructor, log: Logging);
|
|
10
|
-
updateArmingMotionSensor(value: boolean): void;
|
|
11
|
-
resetArmingMotionSensor(): void;
|
|
12
|
-
pulseTrippedMotionSensor(): void;
|
|
13
|
-
setTrippedMotionSensor(value: boolean): void;
|
|
14
|
-
resetTrippedMotionSensor(): void;
|
|
15
|
-
pulseTriggeredMotionSensor(): void;
|
|
16
|
-
setTriggeredMotionSensor(value: boolean): void;
|
|
17
|
-
resetTriggeredMotionSensor(): void;
|
|
18
|
-
pulseResetMotionSensor(): void;
|
|
19
|
-
private scheduleReset;
|
|
20
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { SENSOR_PULSE_MS } from '../constants/homekit-constant.js';
|
|
2
|
-
/** Manages all motion sensor characteristic updates. */
|
|
3
|
-
export class SensorHandler {
|
|
4
|
-
services;
|
|
5
|
-
Characteristic;
|
|
6
|
-
log;
|
|
7
|
-
constructor(services, Characteristic, log) {
|
|
8
|
-
this.services = services;
|
|
9
|
-
this.Characteristic = Characteristic;
|
|
10
|
-
this.log = log;
|
|
11
|
-
}
|
|
12
|
-
// ── Arming sensor ──────────────────────────────────────────────────────────
|
|
13
|
-
updateArmingMotionSensor(value) {
|
|
14
|
-
this.services.armingMotionSensorService.updateCharacteristic(this.Characteristic.MotionDetected, value);
|
|
15
|
-
}
|
|
16
|
-
resetArmingMotionSensor() {
|
|
17
|
-
const current = this.services.armingMotionSensorService
|
|
18
|
-
.getCharacteristic(this.Characteristic.MotionDetected).value;
|
|
19
|
-
if (current) {
|
|
20
|
-
this.services.armingMotionSensorService.updateCharacteristic(this.Characteristic.MotionDetected, false);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// ── Tripped sensor ─────────────────────────────────────────────────────────
|
|
24
|
-
pulseTrippedMotionSensor() {
|
|
25
|
-
this.setTrippedMotionSensor(true);
|
|
26
|
-
this.scheduleReset(this.services.trippedMotionSensorService);
|
|
27
|
-
}
|
|
28
|
-
setTrippedMotionSensor(value) {
|
|
29
|
-
this.services.trippedMotionSensorService.updateCharacteristic(this.Characteristic.MotionDetected, value);
|
|
30
|
-
}
|
|
31
|
-
resetTrippedMotionSensor() {
|
|
32
|
-
const char = this.services.trippedMotionSensorService
|
|
33
|
-
.getCharacteristic(this.Characteristic.MotionDetected);
|
|
34
|
-
if (char.value) {
|
|
35
|
-
char.updateValue(false);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
// ── Triggered sensor ───────────────────────────────────────────────────────
|
|
39
|
-
pulseTriggeredMotionSensor() {
|
|
40
|
-
this.setTriggeredMotionSensor(true);
|
|
41
|
-
this.scheduleReset(this.services.triggeredMotionSensorService);
|
|
42
|
-
}
|
|
43
|
-
setTriggeredMotionSensor(value) {
|
|
44
|
-
this.services.triggeredMotionSensorService.updateCharacteristic(this.Characteristic.MotionDetected, value);
|
|
45
|
-
}
|
|
46
|
-
resetTriggeredMotionSensor() {
|
|
47
|
-
const char = this.services.triggeredMotionSensorService
|
|
48
|
-
.getCharacteristic(this.Characteristic.MotionDetected);
|
|
49
|
-
if (char.value) {
|
|
50
|
-
char.updateValue(false);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// ── Reset sensor ───────────────────────────────────────────────────────────
|
|
54
|
-
pulseResetMotionSensor() {
|
|
55
|
-
this.services.triggeredResetMotionSensorService.updateCharacteristic(this.Characteristic.MotionDetected, true);
|
|
56
|
-
this.scheduleReset(this.services.triggeredResetMotionSensorService);
|
|
57
|
-
this.log.debug('Reset sensor (Triggered)');
|
|
58
|
-
}
|
|
59
|
-
// ── Private helpers ────────────────────────────────────────────────────────
|
|
60
|
-
scheduleReset(service) {
|
|
61
|
-
setTimeout(() => {
|
|
62
|
-
service.updateCharacteristic(this.Characteristic.MotionDetected, false);
|
|
63
|
-
}, SENSOR_PULSE_MS);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=sensor-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sensor-handler.js","sourceRoot":"","sources":["../../src/handlers/sensor-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAInE,wDAAwD;AACxD,MAAM,OAAO,aAAa;IAEL,QAAQ;IACR,cAAc;IACd,GAAG;IAHtB,YACmB,QAAyB,EACzB,cAAyC,EACzC,GAAY;wBAFZ,QAAQ;8BACR,cAAc;mBACd,GAAG;IACnB,CAAC;IAEJ,8EAA8E;IAE9E,wBAAwB,CAAC,KAAc;QACrC,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,oBAAoB,CAC1D,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,KAAK,CACN,CAAC;IACJ,CAAC;IAED,uBAAuB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB;aACpD,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC;QAE/D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,oBAAoB,CAC1D,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAE9E,wBAAwB;QACtB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAED,sBAAsB,CAAC,KAAc;QACnC,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,oBAAoB,CAC3D,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,KAAK,CACN,CAAC;IACJ,CAAC;IAED,wBAAwB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,0BAA0B;aAClD,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,8EAA8E;IAE9E,0BAA0B;QACxB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACjE,CAAC;IAED,wBAAwB,CAAC,KAAc;QACrC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,oBAAoB,CAC7D,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,KAAK,CACN,CAAC;IACJ,CAAC;IAED,0BAA0B;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B;aACpD,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,8EAA8E;IAE9E,sBAAsB;QACpB,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,oBAAoB,CAClE,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,IAAI,CACL,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAED,8EAA8E;IAEtE,aAAa,CAAC,OAAgB;QACpC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC1E,CAAC,EAAE,eAAe,CAAC,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { Logging } from 'homebridge';
|
|
2
|
-
import type { CharacteristicConstructor } from '../interfaces/hap-types-interface.js';
|
|
3
|
-
import { SecurityState } from '../types/security-state-type.js';
|
|
4
|
-
import { OriginType } from '../types/origin-type.js';
|
|
5
|
-
import type { ServiceRegistry } from '../interfaces/service-registry-interface.js';
|
|
6
|
-
import type { SystemState } from '../interfaces/system-state-interface.js';
|
|
7
|
-
import type { SecuritySystemOptions } from '../interfaces/options-interface.js';
|
|
8
|
-
import type { EventBusService } from '../services/event-bus-service.js';
|
|
9
|
-
import type { StorageService } from '../services/storage-service.js';
|
|
10
|
-
import type { AudioService } from '../services/audio-service.js';
|
|
11
|
-
import type { SensorHandler } from './sensor-handler.js';
|
|
12
|
-
import type { TimerManager } from '../timers/timer-manager.js';
|
|
13
|
-
import type { ServiceResult } from '../types/service-result-type.js';
|
|
14
|
-
/**
|
|
15
|
-
* Manages the core security-system state machine: arming, triggering, and resetting.
|
|
16
|
-
* Cross-handler side effects are signalled via the event bus so that this class has
|
|
17
|
-
* no direct dependencies on TripHandler or SwitchHandler.
|
|
18
|
-
*/
|
|
19
|
-
export declare class StateHandler {
|
|
20
|
-
private readonly services;
|
|
21
|
-
private readonly state;
|
|
22
|
-
private readonly options;
|
|
23
|
-
private readonly Characteristic;
|
|
24
|
-
private readonly log;
|
|
25
|
-
private readonly bus;
|
|
26
|
-
private readonly storageService;
|
|
27
|
-
private readonly audio;
|
|
28
|
-
private readonly timers;
|
|
29
|
-
private readonly sensorHandler;
|
|
30
|
-
constructor(services: ServiceRegistry, state: SystemState, options: SecuritySystemOptions, Characteristic: CharacteristicConstructor, log: Logging, bus: EventBusService, storageService: StorageService, audio: AudioService, timers: TimerManager, sensorHandler: SensorHandler);
|
|
31
|
-
setCurrentState(state: SecurityState, origin: OriginType): void;
|
|
32
|
-
updateTargetState(state: SecurityState, origin: OriginType, delay: number): ServiceResult;
|
|
33
|
-
getArmingSeconds(targetState: SecurityState): number;
|
|
34
|
-
resetTimers(): void;
|
|
35
|
-
/** Returns true while the trigger delay is counting down (trip switch is active). */
|
|
36
|
-
isTripping(): boolean;
|
|
37
|
-
/** Checks whether arming is currently blocked by an arming-lock switch. */
|
|
38
|
-
isArmingLocked(targetState: SecurityState): boolean;
|
|
39
|
-
getAvailableTargetStates(): SecurityState[];
|
|
40
|
-
logMode(type: string, state: SecurityState | string): void;
|
|
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;
|
|
46
|
-
private handleTargetStateChange;
|
|
47
|
-
private handleCurrentStateChange;
|
|
48
|
-
private handleTriggeredState;
|
|
49
|
-
private startTriggeredMotionSensor;
|
|
50
|
-
private handleArmingState;
|
|
51
|
-
private resetViaOffMode;
|
|
52
|
-
}
|