matterbridge-dyson-robot 0.1.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/CHANGELOG.md +15 -0
- package/LICENSE +14 -0
- package/README.md +365 -0
- package/dist/async-eventemitter.d.ts +9 -0
- package/dist/async-eventemitter.d.ts.map +1 -0
- package/dist/async-eventemitter.js +35 -0
- package/dist/async-eventemitter.js.map +1 -0
- package/dist/check-configuration.d.ts +5 -0
- package/dist/check-configuration.d.ts.map +1 -0
- package/dist/check-configuration.js +35 -0
- package/dist/check-configuration.js.map +1 -0
- package/dist/check-versions.d.ts +3 -0
- package/dist/check-versions.d.ts.map +1 -0
- package/dist/check-versions.js +31 -0
- package/dist/check-versions.js.map +1 -0
- package/dist/config-types.d.ts +48 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-types.js +4 -0
- package/dist/config-types.js.map +1 -0
- package/dist/decorator-changed.d.ts +16 -0
- package/dist/decorator-changed.d.ts.map +1 -0
- package/dist/decorator-changed.js +62 -0
- package/dist/decorator-changed.js.map +1 -0
- package/dist/dyson-360-msg-types.d.ts +113 -0
- package/dist/dyson-360-msg-types.d.ts.map +1 -0
- package/dist/dyson-360-msg-types.js +4 -0
- package/dist/dyson-360-msg-types.js.map +1 -0
- package/dist/dyson-360-types.d.ts +76 -0
- package/dist/dyson-360-types.d.ts.map +1 -0
- package/dist/dyson-360-types.js +72 -0
- package/dist/dyson-360-types.js.map +1 -0
- package/dist/dyson-air-msg-types.d.ts +99 -0
- package/dist/dyson-air-msg-types.d.ts.map +1 -0
- package/dist/dyson-air-msg-types.js +4 -0
- package/dist/dyson-air-msg-types.js.map +1 -0
- package/dist/dyson-air-sensor-types.d.ts +59 -0
- package/dist/dyson-air-sensor-types.d.ts.map +1 -0
- package/dist/dyson-air-sensor-types.js +4 -0
- package/dist/dyson-air-sensor-types.js.map +1 -0
- package/dist/dyson-air-state-types.d.ts +96 -0
- package/dist/dyson-air-state-types.d.ts.map +1 -0
- package/dist/dyson-air-state-types.js +4 -0
- package/dist/dyson-air-state-types.js.map +1 -0
- package/dist/dyson-air-types.d.ts +325 -0
- package/dist/dyson-air-types.d.ts.map +1 -0
- package/dist/dyson-air-types.js +382 -0
- package/dist/dyson-air-types.js.map +1 -0
- package/dist/dyson-device-360-base.d.ts +35 -0
- package/dist/dyson-device-360-base.d.ts.map +1 -0
- package/dist/dyson-device-360-base.js +233 -0
- package/dist/dyson-device-360-base.js.map +1 -0
- package/dist/dyson-device-360-commands.d.ts +7 -0
- package/dist/dyson-device-360-commands.d.ts.map +1 -0
- package/dist/dyson-device-360-commands.js +129 -0
- package/dist/dyson-device-360-commands.js.map +1 -0
- package/dist/dyson-device-360-faults-table.d.ts +20 -0
- package/dist/dyson-device-360-faults-table.d.ts.map +1 -0
- package/dist/dyson-device-360-faults-table.js +161 -0
- package/dist/dyson-device-360-faults-table.js.map +1 -0
- package/dist/dyson-device-360-faults.d.ts +10 -0
- package/dist/dyson-device-360-faults.d.ts.map +1 -0
- package/dist/dyson-device-360-faults.js +123 -0
- package/dist/dyson-device-360-faults.js.map +1 -0
- package/dist/dyson-device-360.d.ts +38 -0
- package/dist/dyson-device-360.d.ts.map +1 -0
- package/dist/dyson-device-360.js +45 -0
- package/dist/dyson-device-360.js.map +1 -0
- package/dist/dyson-device-air-base.d.ts +41 -0
- package/dist/dyson-device-air-base.d.ts.map +1 -0
- package/dist/dyson-device-air-base.js +446 -0
- package/dist/dyson-device-air-base.js.map +1 -0
- package/dist/dyson-device-air-heat.d.ts +52 -0
- package/dist/dyson-device-air-heat.d.ts.map +1 -0
- package/dist/dyson-device-air-heat.js +71 -0
- package/dist/dyson-device-air-heat.js.map +1 -0
- package/dist/dyson-device-air-quality.d.ts +7 -0
- package/dist/dyson-device-air-quality.d.ts.map +1 -0
- package/dist/dyson-device-air-quality.js +101 -0
- package/dist/dyson-device-air-quality.js.map +1 -0
- package/dist/dyson-device-air.d.ts +216 -0
- package/dist/dyson-device-air.d.ts.map +1 -0
- package/dist/dyson-device-air.js +80 -0
- package/dist/dyson-device-air.js.map +1 -0
- package/dist/dyson-device-base.d.ts +49 -0
- package/dist/dyson-device-base.d.ts.map +1 -0
- package/dist/dyson-device-base.js +46 -0
- package/dist/dyson-device-base.js.map +1 -0
- package/dist/dyson-device.d.ts +5 -0
- package/dist/dyson-device.d.ts.map +1 -0
- package/dist/dyson-device.js +43 -0
- package/dist/dyson-device.js.map +1 -0
- package/dist/dyson-mqtt-360.d.ts +16 -0
- package/dist/dyson-mqtt-360.d.ts.map +1 -0
- package/dist/dyson-mqtt-360.js +83 -0
- package/dist/dyson-mqtt-360.js.map +1 -0
- package/dist/dyson-mqtt-air.d.ts +48 -0
- package/dist/dyson-mqtt-air.d.ts.map +1 -0
- package/dist/dyson-mqtt-air.js +216 -0
- package/dist/dyson-mqtt-air.js.map +1 -0
- package/dist/dyson-mqtt-config.d.ts +6 -0
- package/dist/dyson-mqtt-config.d.ts.map +1 -0
- package/dist/dyson-mqtt-config.js +47 -0
- package/dist/dyson-mqtt-config.js.map +1 -0
- package/dist/dyson-mqtt-connect.d.ts +22 -0
- package/dist/dyson-mqtt-connect.d.ts.map +1 -0
- package/dist/dyson-mqtt-connect.js +145 -0
- package/dist/dyson-mqtt-connect.js.map +1 -0
- package/dist/dyson-mqtt-filter.d.ts +10 -0
- package/dist/dyson-mqtt-filter.d.ts.map +1 -0
- package/dist/dyson-mqtt-filter.js +25 -0
- package/dist/dyson-mqtt-filter.js.map +1 -0
- package/dist/dyson-mqtt-parse.d.ts +16 -0
- package/dist/dyson-mqtt-parse.d.ts.map +1 -0
- package/dist/dyson-mqtt-parse.js +100 -0
- package/dist/dyson-mqtt-parse.js.map +1 -0
- package/dist/dyson-mqtt-subscribe.d.ts +28 -0
- package/dist/dyson-mqtt-subscribe.d.ts.map +1 -0
- package/dist/dyson-mqtt-subscribe.js +85 -0
- package/dist/dyson-mqtt-subscribe.js.map +1 -0
- package/dist/dyson-mqtt.d.ts +51 -0
- package/dist/dyson-mqtt.d.ts.map +1 -0
- package/dist/dyson-mqtt.js +138 -0
- package/dist/dyson-mqtt.js.map +1 -0
- package/dist/dyson-types.d.ts +18 -0
- package/dist/dyson-types.d.ts.map +1 -0
- package/dist/dyson-types.js +20 -0
- package/dist/dyson-types.js.map +1 -0
- package/dist/endpoint-360-behavior.d.ts +55 -0
- package/dist/endpoint-360-behavior.d.ts.map +1 -0
- package/dist/endpoint-360-behavior.js +156 -0
- package/dist/endpoint-360-behavior.js.map +1 -0
- package/dist/endpoint-360-rvc.d.ts +14 -0
- package/dist/endpoint-360-rvc.d.ts.map +1 -0
- package/dist/endpoint-360-rvc.js +149 -0
- package/dist/endpoint-360-rvc.js.map +1 -0
- package/dist/endpoint-360.d.ts +35 -0
- package/dist/endpoint-360.d.ts.map +1 -0
- package/dist/endpoint-360.js +197 -0
- package/dist/endpoint-360.js.map +1 -0
- package/dist/endpoint-air-purifier.d.ts +24 -0
- package/dist/endpoint-air-purifier.d.ts.map +1 -0
- package/dist/endpoint-air-purifier.js +97 -0
- package/dist/endpoint-air-purifier.js.map +1 -0
- package/dist/endpoint-air-quality.d.ts +11 -0
- package/dist/endpoint-air-quality.d.ts.map +1 -0
- package/dist/endpoint-air-quality.js +104 -0
- package/dist/endpoint-air-quality.js.map +1 -0
- package/dist/endpoint-air-thermostat.d.ts +358 -0
- package/dist/endpoint-air-thermostat.d.ts.map +1 -0
- package/dist/endpoint-air-thermostat.js +67 -0
- package/dist/endpoint-air-thermostat.js.map +1 -0
- package/dist/endpoint-air.d.ts +125 -0
- package/dist/endpoint-air.d.ts.map +1 -0
- package/dist/endpoint-air.js +459 -0
- package/dist/endpoint-air.js.map +1 -0
- package/dist/endpoint-base.d.ts +36 -0
- package/dist/endpoint-base.d.ts.map +1 -0
- package/dist/endpoint-base.js +137 -0
- package/dist/endpoint-base.js.map +1 -0
- package/dist/error-360.d.ts +35 -0
- package/dist/error-360.d.ts.map +1 -0
- package/dist/error-360.js +105 -0
- package/dist/error-360.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/logger-filter.d.ts +23 -0
- package/dist/logger-filter.d.ts.map +1 -0
- package/dist/logger-filter.js +104 -0
- package/dist/logger-filter.js.map +1 -0
- package/dist/logger-options.d.ts +18 -0
- package/dist/logger-options.d.ts.map +1 -0
- package/dist/logger-options.js +41 -0
- package/dist/logger-options.js.map +1 -0
- package/dist/logger-prefix.d.ts +12 -0
- package/dist/logger-prefix.d.ts.map +1 -0
- package/dist/logger-prefix.js +37 -0
- package/dist/logger-prefix.js.map +1 -0
- package/dist/periodic.d.ts +31 -0
- package/dist/periodic.d.ts.map +1 -0
- package/dist/periodic.js +102 -0
- package/dist/periodic.js.map +1 -0
- package/dist/platform.d.ts +18 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +138 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +9 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +28 -0
- package/dist/settings.js.map +1 -0
- package/dist/ti/config-types-ti.d.ts +16 -0
- package/dist/ti/config-types-ti.d.ts.map +1 -0
- package/dist/ti/config-types-ti.js +65 -0
- package/dist/ti/config-types-ti.js.map +1 -0
- package/dist/ti/config-types.d.ts +37 -0
- package/dist/ti/config-types.d.ts.map +1 -0
- package/dist/ti/config-types.js +11 -0
- package/dist/ti/config-types.js.map +1 -0
- package/dist/ti/dyson-360-msg-types-ti.d.ts +22 -0
- package/dist/ti/dyson-360-msg-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-360-msg-types-ti.js +134 -0
- package/dist/ti/dyson-360-msg-types-ti.js.map +1 -0
- package/dist/ti/dyson-360-msg-types.d.ts +55 -0
- package/dist/ti/dyson-360-msg-types.d.ts.map +1 -0
- package/dist/ti/dyson-360-msg-types.js +13 -0
- package/dist/ti/dyson-360-msg-types.js.map +1 -0
- package/dist/ti/dyson-360-types-ti.d.ts +17 -0
- package/dist/ti/dyson-360-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-360-types-ti.js +94 -0
- package/dist/ti/dyson-360-types-ti.js.map +1 -0
- package/dist/ti/dyson-360-types.d.ts +40 -0
- package/dist/ti/dyson-360-types.d.ts.map +1 -0
- package/dist/ti/dyson-360-types.js +11 -0
- package/dist/ti/dyson-360-types.js.map +1 -0
- package/dist/ti/dyson-air-msg-types-ti.d.ts +19 -0
- package/dist/ti/dyson-air-msg-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-air-msg-types-ti.js +115 -0
- package/dist/ti/dyson-air-msg-types-ti.js.map +1 -0
- package/dist/ti/dyson-air-msg-types.d.ts +46 -0
- package/dist/ti/dyson-air-msg-types.d.ts.map +1 -0
- package/dist/ti/dyson-air-msg-types.js +15 -0
- package/dist/ti/dyson-air-msg-types.js.map +1 -0
- package/dist/ti/dyson-air-sensor-types-ti.d.ts +9 -0
- package/dist/ti/dyson-air-sensor-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-air-sensor-types-ti.js +68 -0
- package/dist/ti/dyson-air-sensor-types-ti.js.map +1 -0
- package/dist/ti/dyson-air-sensor-types.d.ts +16 -0
- package/dist/ti/dyson-air-sensor-types.d.ts.map +1 -0
- package/dist/ti/dyson-air-sensor-types.js +12 -0
- package/dist/ti/dyson-air-sensor-types.js.map +1 -0
- package/dist/ti/dyson-air-state-types-ti.d.ts +9 -0
- package/dist/ti/dyson-air-state-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-air-state-types-ti.js +105 -0
- package/dist/ti/dyson-air-state-types-ti.js.map +1 -0
- package/dist/ti/dyson-air-state-types.d.ts +16 -0
- package/dist/ti/dyson-air-state-types.d.ts.map +1 -0
- package/dist/ti/dyson-air-state-types.js +12 -0
- package/dist/ti/dyson-air-state-types.js.map +1 -0
- package/dist/ti/dyson-air-types-ti.d.ts +59 -0
- package/dist/ti/dyson-air-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-air-types-ti.js +385 -0
- package/dist/ti/dyson-air-types-ti.js.map +1 -0
- package/dist/ti/dyson-air-types.d.ts +166 -0
- package/dist/ti/dyson-air-types.d.ts.map +1 -0
- package/dist/ti/dyson-air-types.js +11 -0
- package/dist/ti/dyson-air-types.js.map +1 -0
- package/dist/ti/dyson-types-ti.d.ts +10 -0
- package/dist/ti/dyson-types-ti.d.ts.map +1 -0
- package/dist/ti/dyson-types-ti.js +29 -0
- package/dist/ti/dyson-types-ti.js.map +1 -0
- package/dist/ti/dyson-types.d.ts +19 -0
- package/dist/ti/dyson-types.d.ts.map +1 -0
- package/dist/ti/dyson-types.js +11 -0
- package/dist/ti/dyson-types.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +150 -0
- package/dist/utils.js.map +1 -0
- package/matterbridge-dyson-robot.schema.json +359 -0
- package/package.json +93 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
|
|
2
|
+
// Copyright © 2025 Alexander Thoukydides
|
|
3
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
4
|
+
var useValue = arguments.length > 2;
|
|
5
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
6
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
7
|
+
}
|
|
8
|
+
return useValue ? value : void 0;
|
|
9
|
+
};
|
|
10
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
11
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
12
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
13
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
14
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
15
|
+
var _, done = false;
|
|
16
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
17
|
+
var context = {};
|
|
18
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
19
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
20
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
21
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
22
|
+
if (kind === "accessor") {
|
|
23
|
+
if (result === void 0) continue;
|
|
24
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
25
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
26
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
27
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
28
|
+
}
|
|
29
|
+
else if (_ = accept(result)) {
|
|
30
|
+
if (kind === "field") initializers.unshift(_);
|
|
31
|
+
else descriptor[key] = _;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
35
|
+
done = true;
|
|
36
|
+
};
|
|
37
|
+
import { DysonDevice } from './dyson-device-base.js';
|
|
38
|
+
import { DysonMqtt360 } from './dyson-mqtt-360.js';
|
|
39
|
+
import { assertIsDefined, tryListener } from './utils.js';
|
|
40
|
+
import { ifValueChanged } from './decorator-changed.js';
|
|
41
|
+
import { Endpoint360 } from './endpoint-360.js';
|
|
42
|
+
import { PLUGIN_URL, VENDOR_NAME } from './settings.js';
|
|
43
|
+
import { RvcRunMode360 } from './endpoint-360-behavior.js';
|
|
44
|
+
import { PowerSource, RvcOperationalState } from 'matterbridge/matter/clusters';
|
|
45
|
+
import { Dyson360State } from './dyson-360-types.js';
|
|
46
|
+
import { mapDyson360Faults } from './dyson-device-360-faults.js';
|
|
47
|
+
import { assert } from 'console';
|
|
48
|
+
import { attachDevice360CommandHandlers } from './dyson-device-360-commands.js';
|
|
49
|
+
const STATE_MAP = {
|
|
50
|
+
// RunMode OperationalState isDocked
|
|
51
|
+
[Dyson360State.FaultCallHelpline]: ['Idle', 'Error', false],
|
|
52
|
+
[Dyson360State.FaultContactHelpline]: ['Idle', 'Error', false],
|
|
53
|
+
[Dyson360State.FaultCritical]: ['Idle', 'Error', false],
|
|
54
|
+
[Dyson360State.FaultGettingInfo]: ['Idle', 'Error', false],
|
|
55
|
+
[Dyson360State.FaultLost]: ['Idle', 'Error', false],
|
|
56
|
+
[Dyson360State.FaultOnDock]: ['Idle', 'Error', true],
|
|
57
|
+
[Dyson360State.FaultOnDockCharged]: ['Idle', 'Error', true],
|
|
58
|
+
[Dyson360State.FaultOnDockCharging]: ['Idle', 'Error', true],
|
|
59
|
+
[Dyson360State.FaultReplaceOnDock]: ['Idle', 'Error', false],
|
|
60
|
+
[Dyson360State.FaultReturnToDock]: ['Idle', 'Error', false],
|
|
61
|
+
[Dyson360State.FaultRunningDiagnostic]: ['Idle', 'Error', false],
|
|
62
|
+
[Dyson360State.FaultUserRecoverable]: ['Idle', 'Error', false],
|
|
63
|
+
[Dyson360State.FullCleanAbandoned]: ['Idle', 'SeekingCharger', false],
|
|
64
|
+
[Dyson360State.FullCleanAborted]: ['Idle', 'SeekingCharger', false],
|
|
65
|
+
[Dyson360State.FullCleanCharging]: ['Cleaning', 'Charging', true],
|
|
66
|
+
[Dyson360State.FullCleanDiscovering]: ['Cleaning', 'Running', false],
|
|
67
|
+
[Dyson360State.FullCleanFinished]: ['Idle', 'SeekingCharger', false],
|
|
68
|
+
[Dyson360State.FullCleanInitiated]: ['Cleaning', 'Running', false],
|
|
69
|
+
[Dyson360State.FullCleanNeedsCharge]: ['Cleaning', 'SeekingCharger', false],
|
|
70
|
+
[Dyson360State.FullCleanPaused]: ['Cleaning', 'Paused', false],
|
|
71
|
+
[Dyson360State.FullCleanRunning]: ['Cleaning', 'Running', false],
|
|
72
|
+
[Dyson360State.FullCleanTraversing]: ['Cleaning', 'Running', false],
|
|
73
|
+
[Dyson360State.InactiveCharged]: ['Idle', 'Docked', true],
|
|
74
|
+
[Dyson360State.InactiveCharging]: ['Idle', 'Charging', true],
|
|
75
|
+
[Dyson360State.InactiveDischarging]: ['Idle', 'Stopped', false],
|
|
76
|
+
[Dyson360State.MappingAborted]: ['Idle', 'SeekingCharger', false],
|
|
77
|
+
[Dyson360State.MappingCharging]: ['Mapping', 'Charging', true],
|
|
78
|
+
[Dyson360State.MappingFinished]: ['Idle', 'SeekingCharger', false],
|
|
79
|
+
[Dyson360State.MappingInitiated]: ['Mapping', 'Running', false],
|
|
80
|
+
[Dyson360State.MappingNeedsCharge]: ['Mapping', 'SeekingCharger', false],
|
|
81
|
+
[Dyson360State.MappingPaused]: ['Mapping', 'Paused', false],
|
|
82
|
+
[Dyson360State.MappingRunning]: ['Mapping', 'Running', false]
|
|
83
|
+
};
|
|
84
|
+
function mapState(state) {
|
|
85
|
+
const [runMode, operationState, isDocked] = STATE_MAP[state];
|
|
86
|
+
return {
|
|
87
|
+
runMode: RvcRunMode360[runMode],
|
|
88
|
+
operationalState: RvcOperationalState.OperationalState[operationState],
|
|
89
|
+
isDocked
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Thresholds for battery levels
|
|
93
|
+
const BATTERY_THRESHOLD_CRITICAL = 10;
|
|
94
|
+
const BATTERY_THRESHOLD_WARNING = 25;
|
|
95
|
+
const BATTERY_THRESHOLD_FULL = 100;
|
|
96
|
+
// A Dyson robot vacuum device
|
|
97
|
+
let DysonDevice360Base = (() => {
|
|
98
|
+
let _classSuper = DysonDevice;
|
|
99
|
+
let _instanceExtraInitializers = [];
|
|
100
|
+
let _updateClusterAttributes_decorators;
|
|
101
|
+
return class DysonDevice360Base extends _classSuper {
|
|
102
|
+
static {
|
|
103
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
104
|
+
_updateClusterAttributes_decorators = [ifValueChanged];
|
|
105
|
+
__esDecorate(this, null, _updateClusterAttributes_decorators, { kind: "method", name: "updateClusterAttributes", static: false, private: false, access: { has: obj => "updateClusterAttributes" in obj, get: obj => obj.updateClusterAttributes }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
106
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
107
|
+
}
|
|
108
|
+
// The MQTT client and status update listener
|
|
109
|
+
static mqttConstructor = DysonMqtt360;
|
|
110
|
+
mqttListener = __runInitializers(this, _instanceExtraInitializers);
|
|
111
|
+
// The RVC device endpoint
|
|
112
|
+
endpoint;
|
|
113
|
+
// Construct a new Dyson device instance
|
|
114
|
+
constructor(...args) {
|
|
115
|
+
super(...args);
|
|
116
|
+
// Prepare a listener for MQTT updates
|
|
117
|
+
this.mqttListener = tryListener(this.mqtt, () => this.updateClusterAttributes(this.mqtt.status));
|
|
118
|
+
}
|
|
119
|
+
// Create the endpoint for this device
|
|
120
|
+
makeEndpoint() {
|
|
121
|
+
const rvcCleanModeLabels = this.getPowerModeMaps().map(([, mode, label]) => [mode, label]);
|
|
122
|
+
// Static configuration of the RVC clusters
|
|
123
|
+
const endpointOptions = {
|
|
124
|
+
uniqueStorageKey: this.uniqueId,
|
|
125
|
+
matterbridgeDeviceName: this.deviceName,
|
|
126
|
+
deviceBasicInformation: {
|
|
127
|
+
nodeLabel: this.deviceName,
|
|
128
|
+
partNumber: this.modelNumber,
|
|
129
|
+
productAppearance: this.getProductAppearance(),
|
|
130
|
+
productLabel: this.modelNumber,
|
|
131
|
+
productName: this.modelName,
|
|
132
|
+
productUrl: PLUGIN_URL,
|
|
133
|
+
serialNumber: this.serialNumber,
|
|
134
|
+
uniqueId: this.uniqueId,
|
|
135
|
+
vendorName: VENDOR_NAME
|
|
136
|
+
},
|
|
137
|
+
powerSource: {
|
|
138
|
+
batteryPartNumber: this.getBatteryPartNumber()
|
|
139
|
+
},
|
|
140
|
+
rvcCleanMode: {
|
|
141
|
+
labels: rvcCleanModeLabels
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
// Create the endpoint and attach a command handler
|
|
145
|
+
const endpoint = new Endpoint360(this.log, this.config, endpointOptions);
|
|
146
|
+
attachDevice360CommandHandlers(this.log, this.mqtt, endpoint, this.cleanModeToPowerMode.bind(this));
|
|
147
|
+
return endpoint;
|
|
148
|
+
}
|
|
149
|
+
// List of endpoint function names and descriptions to validate
|
|
150
|
+
getEntities() {
|
|
151
|
+
return []; // Single endpoint, so no entity selection
|
|
152
|
+
}
|
|
153
|
+
// Retrieve the root device endpoints after validation
|
|
154
|
+
getEndpoints(_validatedNames) {
|
|
155
|
+
return [this.endpoint ??= this.makeEndpoint()];
|
|
156
|
+
}
|
|
157
|
+
// Start the device after the endpoints are active
|
|
158
|
+
async start() {
|
|
159
|
+
this.mqtt.on('status', this.mqttListener);
|
|
160
|
+
await this.updateClusterAttributes(this.mqtt.status);
|
|
161
|
+
}
|
|
162
|
+
// Stop the device when Matterbridge is shutting down
|
|
163
|
+
async stop() {
|
|
164
|
+
this.mqtt.off('status', this.mqttListener);
|
|
165
|
+
await super.stop();
|
|
166
|
+
}
|
|
167
|
+
// Map an RVC Clean Mode to its corresponding Dyson power mode
|
|
168
|
+
cleanModeToPowerMode(cleanMode) {
|
|
169
|
+
const map = this.getPowerModeMaps().find(([, m]) => m === cleanMode);
|
|
170
|
+
assertIsDefined(map);
|
|
171
|
+
return map[0];
|
|
172
|
+
}
|
|
173
|
+
// Map a Dyson power mode to its corresponding RVC Clean Mode
|
|
174
|
+
powerModeToCleanMode(powerMode) {
|
|
175
|
+
const map = this.getPowerModeMaps().find(([m]) => m === powerMode);
|
|
176
|
+
assertIsDefined(map);
|
|
177
|
+
return map[1];
|
|
178
|
+
}
|
|
179
|
+
// Update cluster attributes when the MQTT status is updated
|
|
180
|
+
async updateClusterAttributes(status) {
|
|
181
|
+
assertIsDefined(this.endpoint);
|
|
182
|
+
// Map the state to cluster attribute values
|
|
183
|
+
const faults = mapDyson360Faults(this.log, status.state, status.faults);
|
|
184
|
+
const cleanMode = this.powerModeToCleanMode(status.currentVacuumPowerMode);
|
|
185
|
+
const { runMode } = mapState(status.state);
|
|
186
|
+
const operationalState = this.mapOperationalState(status, faults);
|
|
187
|
+
const batteryStatus = this.mapBatteryStatus(status, faults);
|
|
188
|
+
// Update all of the clusters
|
|
189
|
+
await Promise.all([
|
|
190
|
+
this.endpoint.updateReachable(status.reachable),
|
|
191
|
+
this.endpoint.updateRvcCleanMode(cleanMode),
|
|
192
|
+
this.endpoint.updateRvcRunMode(runMode),
|
|
193
|
+
this.endpoint.updateRvcOperationalState(operationalState),
|
|
194
|
+
this.endpoint.updatePowerSource(batteryStatus)
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
// Convert the battery status to Power Source cluster attributes
|
|
198
|
+
mapBatteryStatus(status, faults) {
|
|
199
|
+
const { operationalState, isDocked } = mapState(status.state);
|
|
200
|
+
const { batteryChargeLevel } = status;
|
|
201
|
+
const { activeBatFaults, activeBatChargeFaults } = faults;
|
|
202
|
+
return {
|
|
203
|
+
activeBatFaults,
|
|
204
|
+
activeBatChargeFaults: isDocked ? activeBatChargeFaults : [],
|
|
205
|
+
batPercentRemaining: batteryChargeLevel * 2, // ×2, e.g. 200 for 100%
|
|
206
|
+
batChargeLevel: PowerSource.BatChargeLevel[batteryChargeLevel < BATTERY_THRESHOLD_CRITICAL ? 'Critical'
|
|
207
|
+
: batteryChargeLevel < BATTERY_THRESHOLD_WARNING ? 'Warning' : 'Ok'],
|
|
208
|
+
batChargeState: PowerSource.BatChargeState[(operationalState === RvcOperationalState.OperationalState.Charging) ? 'IsCharging'
|
|
209
|
+
: batteryChargeLevel < BATTERY_THRESHOLD_FULL ? 'IsNotCharging' : 'IsAtFullCharge'],
|
|
210
|
+
status: PowerSource.PowerSourceStatus.Active
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Convert the status to RVC Operational State cluster attributes
|
|
214
|
+
mapOperationalState(status, faults) {
|
|
215
|
+
const mappedState = mapState(status.state);
|
|
216
|
+
const isActive = mappedState.runMode !== RvcRunMode360.Idle;
|
|
217
|
+
// Ensure consistent Operational State and Operational Error
|
|
218
|
+
const { operationalError } = faults;
|
|
219
|
+
let { operationalState } = mapState(status.state);
|
|
220
|
+
if (operationalError.errorStateId !== RvcOperationalState.ErrorState.NoError) {
|
|
221
|
+
// Force Error state if an error is being reported
|
|
222
|
+
operationalState = RvcOperationalState.OperationalState.Error;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Otherwise the state should not have been mapped to Error
|
|
226
|
+
assert(operationalState !== RvcOperationalState.OperationalState.Error);
|
|
227
|
+
}
|
|
228
|
+
return { isActive, operationalState, operationalError };
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
})();
|
|
232
|
+
export { DysonDevice360Base };
|
|
233
|
+
//# sourceMappingURL=dyson-device-360-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyson-device-360-base.js","sourceRoot":"","sources":["../src/dyson-device-360-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AnsiLogger } from 'matterbridge/logger';
|
|
2
|
+
import { DysonMqtt360 } from './dyson-mqtt-360.js';
|
|
3
|
+
import { Endpoint360 } from './endpoint-360.js';
|
|
4
|
+
import { RvcCleanMode360 } from './endpoint-360-behavior.js';
|
|
5
|
+
import { Dyson360PowerMode } from './dyson-360-types.js';
|
|
6
|
+
export declare function attachDevice360CommandHandlers(log: AnsiLogger, mqtt: DysonMqtt360, endpoint: Endpoint360, powerMap: (cleanMode: RvcCleanMode360) => Dyson360PowerMode): void;
|
|
7
|
+
//# sourceMappingURL=dyson-device-360-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyson-device-360-commands.d.ts","sourceRoot":"","sources":["../src/dyson-device-360-commands.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAiB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAiB,MAAM,sBAAsB,CAAC;AAoDxE,wBAAgB,8BAA8B,CAC1C,GAAG,EAAS,UAAU,EACtB,IAAI,EAAQ,YAAY,EACxB,QAAQ,EAAI,WAAW,EACvB,QAAQ,EAAI,CAAC,SAAS,EAAE,eAAe,KAAK,iBAAiB,GAC9D,IAAI,CAkGN"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
|
|
2
|
+
// Copyright © 2025 Alexander Thoukydides
|
|
3
|
+
import { RvcCleanMode360, RvcRunMode360 } from './endpoint-360-behavior.js';
|
|
4
|
+
import { Dyson360State } from './dyson-360-types.js';
|
|
5
|
+
import { CN, CV, RI } from './logger-options.js';
|
|
6
|
+
import { ChangeToModeError, RvcOperationalStateError } from './error-360.js';
|
|
7
|
+
import { MS } from './utils.js';
|
|
8
|
+
const STATE_COLUMNS = ['Idle', 'Cleaning', 'Mapping', 'Pause', 'Resume', 'GoHome'];
|
|
9
|
+
const STATE_MAP = {
|
|
10
|
+
[Dyson360State.FaultCallHelpline]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
11
|
+
[Dyson360State.FaultContactHelpline]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
12
|
+
[Dyson360State.FaultCritical]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
13
|
+
[Dyson360State.FaultGettingInfo]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
14
|
+
[Dyson360State.FaultLost]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
15
|
+
[Dyson360State.FaultOnDock]: ['abort', 'START', undefined, undefined, undefined, true],
|
|
16
|
+
[Dyson360State.FaultOnDockCharged]: ['abort', 'START', undefined, undefined, undefined, true],
|
|
17
|
+
[Dyson360State.FaultOnDockCharging]: ['abort', 'START', undefined, undefined, undefined, true],
|
|
18
|
+
[Dyson360State.FaultReplaceOnDock]: ['abort', 'START', undefined, undefined, undefined, undefined],
|
|
19
|
+
[Dyson360State.FaultReturnToDock]: ['abort', 'START', undefined, undefined, undefined, undefined],
|
|
20
|
+
[Dyson360State.FaultRunningDiagnostic]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
21
|
+
[Dyson360State.FaultUserRecoverable]: ['abort', 'START', undefined, undefined, undefined, 'ABORT'],
|
|
22
|
+
[Dyson360State.FullCleanAbandoned]: [true, 'START', undefined, undefined, undefined, true],
|
|
23
|
+
[Dyson360State.FullCleanAborted]: [true, 'START', undefined, undefined, undefined, true],
|
|
24
|
+
[Dyson360State.FullCleanCharging]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
25
|
+
[Dyson360State.FullCleanDiscovering]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
26
|
+
[Dyson360State.FullCleanFinished]: [true, 'START', undefined, undefined, undefined, true],
|
|
27
|
+
[Dyson360State.FullCleanInitiated]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
28
|
+
[Dyson360State.FullCleanNeedsCharge]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
29
|
+
[Dyson360State.FullCleanPaused]: ['ABORT', true, undefined, undefined, 'RESUME', 'ABORT'],
|
|
30
|
+
[Dyson360State.FullCleanRunning]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
31
|
+
[Dyson360State.FullCleanTraversing]: ['ABORT', true, undefined, 'PAUSE', undefined, 'ABORT'],
|
|
32
|
+
[Dyson360State.InactiveCharged]: [true, 'START', undefined, undefined, undefined, true],
|
|
33
|
+
[Dyson360State.InactiveCharging]: [true, 'START', undefined, undefined, undefined, true],
|
|
34
|
+
[Dyson360State.InactiveDischarging]: [true, 'START', undefined, undefined, undefined, 'ABORT'],
|
|
35
|
+
[Dyson360State.MappingAborted]: [true, 'START', undefined, undefined, undefined, true],
|
|
36
|
+
[Dyson360State.MappingCharging]: ['ABORT', 'START', true, 'PAUSE', undefined, 'ABORT'],
|
|
37
|
+
[Dyson360State.MappingFinished]: [true, 'START', undefined, undefined, undefined, true],
|
|
38
|
+
[Dyson360State.MappingInitiated]: ['ABORT', 'START', true, 'PAUSE', undefined, 'ABORT'],
|
|
39
|
+
[Dyson360State.MappingNeedsCharge]: ['ABORT', 'START', true, 'PAUSE', undefined, 'ABORT'],
|
|
40
|
+
[Dyson360State.MappingPaused]: ['ABORT', 'START', true, undefined, 'RESUME', 'ABORT'],
|
|
41
|
+
[Dyson360State.MappingRunning]: ['ABORT', 'START', true, 'PAUSE', undefined, 'ABORT']
|
|
42
|
+
};
|
|
43
|
+
// Timeout waiting for the next update
|
|
44
|
+
const UPDATE_TIMEOUT = 5 * MS; // 5 seconds
|
|
45
|
+
// Attach command handlers to a Dyson robot vacuum device RVC endpoint
|
|
46
|
+
export function attachDevice360CommandHandlers(log, mqtt, endpoint, powerMap) {
|
|
47
|
+
const context = {};
|
|
48
|
+
// Perform a command and wait for a status update
|
|
49
|
+
const issueCommandAndWaitForUpdate = async (description, command, condition) => {
|
|
50
|
+
try {
|
|
51
|
+
// Make the operation abortable with a timeout
|
|
52
|
+
context.abort?.abort();
|
|
53
|
+
context.abort = new AbortController();
|
|
54
|
+
const signal = AbortSignal.any([context.abort.signal, AbortSignal.timeout(UPDATE_TIMEOUT)]);
|
|
55
|
+
// Publish the command
|
|
56
|
+
await command();
|
|
57
|
+
// Wait for an update to satisfy the condition
|
|
58
|
+
while (!condition()) {
|
|
59
|
+
await mqtt.onceAsync('status', signal);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (cause) {
|
|
63
|
+
// Identify the underlying error
|
|
64
|
+
let err = cause instanceof Error ? cause : new Error(String(cause));
|
|
65
|
+
while (err.name === 'AbortError' && err.cause instanceof Error)
|
|
66
|
+
err = err.cause;
|
|
67
|
+
// Map the error type to a description
|
|
68
|
+
const errMap = {
|
|
69
|
+
AbortError: 'Aborted',
|
|
70
|
+
TimeoutError: 'Timed out'
|
|
71
|
+
};
|
|
72
|
+
const result = errMap[err.name] ?? 'Failed to';
|
|
73
|
+
log.warn(`${result} ${description}`);
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
// Lookup the action required for a particular target
|
|
78
|
+
const targetAction = (target) => {
|
|
79
|
+
const column = STATE_COLUMNS.indexOf(target);
|
|
80
|
+
return STATE_MAP[mqtt.status.state][column];
|
|
81
|
+
};
|
|
82
|
+
// Attempt to set a target state, returning false if not allowed
|
|
83
|
+
const setTarget = async (description, target) => {
|
|
84
|
+
// Check whether the target is allowed or already satisfied
|
|
85
|
+
const action = targetAction(target);
|
|
86
|
+
if (action === undefined) {
|
|
87
|
+
log.info(`${description} → not allowed in current state`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
else if (action === true) {
|
|
91
|
+
log.info(`${description} → no action required`);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
// Publish a command to change the robot state
|
|
95
|
+
log.info(`${description} → ${CV}${action}${RI}`);
|
|
96
|
+
const command = action.toUpperCase();
|
|
97
|
+
const isTargetAchieved = (action) => action === true || action === action?.toLowerCase();
|
|
98
|
+
await issueCommandAndWaitForUpdate(`perform action ${target}`, () => mqtt.commandAction(command), () => isTargetAchieved(targetAction(target)));
|
|
99
|
+
return true;
|
|
100
|
+
};
|
|
101
|
+
// Handle RVC Operational State Pause/Resume/GoHome commands
|
|
102
|
+
const operationStateAction = async (target) => {
|
|
103
|
+
if (!await setTarget(`${CN}RVC Operational State ${CV}${target}${RI}`, target)) {
|
|
104
|
+
throw new RvcOperationalStateError.CommandInvalidInState();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
endpoint.setCommandHandler360('Pause', () => operationStateAction('Pause'));
|
|
108
|
+
endpoint.setCommandHandler360('Resume', () => operationStateAction('Resume'));
|
|
109
|
+
endpoint.setCommandHandler360('GoHome', () => operationStateAction('GoHome'));
|
|
110
|
+
// Handle RVC Run Mode cluster ChangeToMode commands
|
|
111
|
+
endpoint.setCommandHandler360('ChangeRunMode', async (newMode) => {
|
|
112
|
+
const target = RvcRunMode360[newMode];
|
|
113
|
+
if (!await setTarget(`${CN}RVC Run Mode${RI} ChangeToMode ${formatEnumLog(RvcRunMode360, newMode)}`, target)) {
|
|
114
|
+
throw new ChangeToModeError.InvalidInMode();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// Reject all RVC Clean Mode cluster ChangeToMode commands
|
|
118
|
+
endpoint.setCommandHandler360('ChangeCleanMode', async (newMode) => {
|
|
119
|
+
const powerMode = powerMap(newMode);
|
|
120
|
+
log.info(`${CN}RVC Clean Mode${RI} ChangeToMode ${formatEnumLog(RvcCleanMode360, newMode)} → ${CV}${powerMode}${RI}`);
|
|
121
|
+
await issueCommandAndWaitForUpdate(`set power mode ${powerMode}`, () => mqtt.commandPower(powerMode), () => mqtt.status.defaultVacuumPowerMode === powerMode);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Format an enum value for logging
|
|
125
|
+
function formatEnumLog(enumMap, value) {
|
|
126
|
+
const label = enumMap[value];
|
|
127
|
+
return `${CV}${label}${RI} (${CV}${value}${RI})`;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=dyson-device-360-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyson-device-360-commands.js","sourceRoot":"","sources":["../src/dyson-device-360-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PowerSource, RvcOperationalState } from 'matterbridge/matter/clusters';
|
|
2
|
+
import { Dyson360Faults, Dyson360State } from './dyson-360-types.js';
|
|
3
|
+
export interface Dyson360FaultDetail {
|
|
4
|
+
msg: string;
|
|
5
|
+
opError?: keyof typeof RvcOperationalState.ErrorState;
|
|
6
|
+
batFault?: keyof typeof PowerSource.BatFault;
|
|
7
|
+
chargeFault?: keyof typeof PowerSource.BatChargeFault;
|
|
8
|
+
}
|
|
9
|
+
type FaultLevel1 = `${number}.#.#`;
|
|
10
|
+
type FaultLevel2 = `${number}.${number}.#`;
|
|
11
|
+
type FaultLevel3 = `${number}.${number}.${number}`;
|
|
12
|
+
export type Dyson360FaultPattern = FaultLevel1 | FaultLevel2 | FaultLevel3;
|
|
13
|
+
export type Dyson360FaultRange = [FaultLevel1, FaultLevel1] | [FaultLevel2, FaultLevel2] | [FaultLevel3, FaultLevel3];
|
|
14
|
+
export type Dyson360FaultPatternOrRange = Dyson360FaultPattern | Dyson360FaultRange;
|
|
15
|
+
export declare const DYSON_360_FAULT_STATES: Map<Dyson360State, Dyson360FaultDetail>;
|
|
16
|
+
export type Dyson360FaultCategory = keyof Dyson360Faults;
|
|
17
|
+
export declare const DYSON_360_FAULT_CATEGORIES: Record<Dyson360FaultCategory, Dyson360FaultDetail>;
|
|
18
|
+
export declare const DYSON_360_FAULT_CODES: [Dyson360FaultPatternOrRange, Dyson360FaultDetail][];
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=dyson-device-360-faults-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyson-device-360-faults-table.d.ts","sourceRoot":"","sources":["../src/dyson-device-360-faults-table.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAKrE,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAa,MAAM,CAAC;IACvB,OAAO,CAAC,EAAQ,MAAM,OAAO,mBAAmB,CAAC,UAAU,CAAC;IAC5D,QAAQ,CAAC,EAAO,MAAM,OAAO,WAAW,CAAC,QAAQ,CAAC;IAClD,WAAW,CAAC,EAAI,MAAM,OAAO,WAAW,CAAC,cAAc,CAAC;CAC3D;AAGD,KAAK,WAAW,GAAG,GAAG,MAAM,MAAM,CAAC;AACnC,KAAK,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;AAC3C,KAAK,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACtH,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAGpF,eAAO,MAAM,sBAAsB,yCAcjC,CAAC;AAGH,MAAM,MAAM,qBAAqB,GAAG,MAAM,cAAc,CAAC;AACzD,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAOzF,CAAC;AAGF,eAAO,MAAM,qBAAqB,EAAE,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,EAoIrF,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
|
|
2
|
+
// Copyright © 2025 Alexander Thoukydides
|
|
3
|
+
import { Dyson360State } from './dyson-360-types.js';
|
|
4
|
+
// Dyson robot vacuum states that map to errors
|
|
5
|
+
export const DYSON_360_FAULT_STATES = new Map([
|
|
6
|
+
[Dyson360State.FaultCallHelpline, { msg: 'Call Dyson helpline' }],
|
|
7
|
+
[Dyson360State.FaultContactHelpline, { msg: 'Contact Dyson helpline' }],
|
|
8
|
+
[Dyson360State.FaultCritical, { msg: 'Critical fault' }],
|
|
9
|
+
[Dyson360State.FaultGettingInfo, { msg: 'Getting info' }],
|
|
10
|
+
[Dyson360State.FaultLost, { msg: 'Lost location', opError: 'UnableToCompleteOperation' }],
|
|
11
|
+
[Dyson360State.FaultOnDock, { msg: 'Fault on dock' }],
|
|
12
|
+
[Dyson360State.FaultOnDockCharged, { msg: 'Fault on dock (charged)' }],
|
|
13
|
+
[Dyson360State.FaultOnDockCharging, { msg: 'Fault on dock (charging)' }],
|
|
14
|
+
[Dyson360State.FaultReplaceOnDock, { msg: 'Place on dock', opError: 'FailedToFindChargingDock' }],
|
|
15
|
+
[Dyson360State.FaultReturnToDock, { msg: 'Unable to return to dock', opError: 'FailedToFindChargingDock' }],
|
|
16
|
+
[Dyson360State.FaultRunningDiagnostic, { msg: 'Running diagnostic' }],
|
|
17
|
+
[Dyson360State.FaultUserRecoverable, { msg: 'User-recoverable fault', opError: 'Stuck' }],
|
|
18
|
+
[Dyson360State.FullCleanAbandoned, { msg: 'Abandoned clean', opError: 'UnableToCompleteOperation' }]
|
|
19
|
+
]);
|
|
20
|
+
export const DYSON_360_FAULT_CATEGORIES = {
|
|
21
|
+
AIRWAYS: { msg: 'Airways fault', /* Lights: 1 red */ opError: 'DustBinFull' },
|
|
22
|
+
BRUSH_BAR_AND_TRACTION: { msg: 'Robot stuck', /* Lights: 2 red */ opError: 'Stuck' },
|
|
23
|
+
CHARGE_STATION: { msg: 'Unable to return to dock', /* Lights: 3 red */ opError: 'FailedToFindChargingDock' },
|
|
24
|
+
OPTICS: { msg: 'Optical sensors fault' /* Lights: 4 red */ },
|
|
25
|
+
LOST: { msg: 'Navigation fault', /* Lights: Red battery */ opError: 'UnableToCompleteOperation' },
|
|
26
|
+
BATTERY: { msg: 'Battery fault', batFault: 'Unspecified', chargeFault: 'Unspecified' }
|
|
27
|
+
};
|
|
28
|
+
// Specific faults/ranges
|
|
29
|
+
export const DYSON_360_FAULT_CODES = [
|
|
30
|
+
// Dyson 360 Eye faults (observed)
|
|
31
|
+
['1.0.-1', { msg: 'Bin full or airways blocked', opError: 'DustBinFull' }],
|
|
32
|
+
['3.5.-1', { msg: 'Brush bar or tracks stuck', opError: 'Stuck' }],
|
|
33
|
+
['7.0.-1', { msg: 'Bin missing or not detected', opError: 'DustBinMissing' }],
|
|
34
|
+
['9.0.-1', { msg: 'Unable to return to dock', opError: 'FailedToFindChargingDock' }],
|
|
35
|
+
// Dyson 360 Vis Nav fault,
|
|
36
|
+
// https://support.dyson.com.au/supportHome/Vacuums/Robots/360visnav/304640-01/using-your-robot/fault-codes
|
|
37
|
+
['1.0.#', { msg: 'Airways blocked', opError: 'DustBinFull' }],
|
|
38
|
+
['1.2.#', { msg: 'Check bin level', opError: 'DustBinFull' }],
|
|
39
|
+
['1.4.#', { msg: 'Vacuum calibration missing' }],
|
|
40
|
+
[['1.5.#', '1.6.#'], { msg: 'Filter not detected', opError: 'DustBinMissing' }],
|
|
41
|
+
[['1.7.#', '1.8.#'], { msg: 'Check airways', opError: 'DustBinFull' }],
|
|
42
|
+
['3.3.#', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
|
|
43
|
+
['3.4.#', { msg: 'Wheel motor too hot', batFault: 'OverTemp' }],
|
|
44
|
+
['3.5.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
|
|
45
|
+
['3.6.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
|
|
46
|
+
[['3.7.#', '3.8.#'], { msg: 'Wheel hardware failure', opError: 'Stuck' }],
|
|
47
|
+
['3.9.#', { msg: 'Robot stuck', opError: 'Stuck' }],
|
|
48
|
+
[['3.10.#', '3.15.#'], { msg: 'ADC error' }],
|
|
49
|
+
['3.16.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
|
|
50
|
+
['3.16.12', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
|
|
51
|
+
['3.16.13', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
|
|
52
|
+
['3.16.16', { msg: 'Brush bar motor winding failure' }],
|
|
53
|
+
['3.16.30', { msg: 'Brush bar communication failure' }],
|
|
54
|
+
['3.16.33', { msg: 'Brush bar communication failure' }],
|
|
55
|
+
['3.17.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
|
|
56
|
+
['3.19.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
|
|
57
|
+
[['3.20.#', '3.21.#'], { msg: 'Edge actuator stuck', opError: 'Stuck' }],
|
|
58
|
+
['3.22.#', { msg: 'Edge actuator switch stuck', opError: 'Stuck' }],
|
|
59
|
+
['3.23.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
|
|
60
|
+
['3.23.12', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
|
|
61
|
+
['3.23.13', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
|
|
62
|
+
['3.23.16', { msg: 'Brush bar motor winding failure' }],
|
|
63
|
+
['3.23.30', { msg: 'Brush bar communication failure' }],
|
|
64
|
+
['3.23.33', { msg: 'Brush bar communication failure' }],
|
|
65
|
+
[['3.100.#', '3.112.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
66
|
+
['3.113.#', { msg: 'Left wheel - Wheel motor too cold', batFault: 'UnderTemp' }],
|
|
67
|
+
[['3.114.#', '3.115.#'], { msg: 'Left wheel - Wheel motor too hot', batFault: 'OverTemp' }],
|
|
68
|
+
[['3.116.#', '3.120.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
69
|
+
['3.121.#', { msg: 'Right wheel - Wheel motor too cold', batFault: 'UnderTemp' }],
|
|
70
|
+
[['3.122.#', '3.123.#'], { msg: 'Right wheel - Wheel motor too hot', batFault: 'OverTemp' }],
|
|
71
|
+
[['3.124.#', '3.128.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
72
|
+
['3.129.#', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
|
|
73
|
+
[['3.130.#', '3.131.#'], { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
|
|
74
|
+
[['5.0.#', '5.2.#'], { msg: 'Battery pack - ADC error', batFault: 'Unspecified', chargeFault: 'Unspecified' }],
|
|
75
|
+
['5.3.#', { msg: 'Battery locked out', batFault: 'Unspecified', chargeFault: 'SafetyTimeout' }],
|
|
76
|
+
['5.4.#', { msg: 'Battery disconnected', batFault: 'Unspecified', chargeFault: 'BatteryAbsent' }],
|
|
77
|
+
['5.5.#', { msg: 'Battery low voltage', batFault: 'Unspecified', chargeFault: 'BatteryUnderVoltage' }],
|
|
78
|
+
['5.6.#', { msg: 'Battery charge required', batFault: 'Unspecified' }],
|
|
79
|
+
[['5.7.#', '5.9.#'], { msg: 'Battery too hot', batFault: 'OverTemp', chargeFault: 'BatteryTooHot' }],
|
|
80
|
+
['5.10.#', { msg: 'Unable to shut down' }],
|
|
81
|
+
['7.#.#', { msg: 'Bin not detected', opError: 'DustBinMissing' }],
|
|
82
|
+
['9.#.#', { msg: 'Unable to dock', opError: 'FailedToFindChargingDock' }],
|
|
83
|
+
[['11.0.#', '11.1.#'], { msg: 'Distance sensor calibration error' }],
|
|
84
|
+
['11.2.#', { msg: 'ADC error' }],
|
|
85
|
+
['11.3.#', { msg: 'Distance sensor error' }],
|
|
86
|
+
['11.5.#', { msg: 'Camera calibration error' }],
|
|
87
|
+
['11.6.#', { msg: 'Camera unplugged' }],
|
|
88
|
+
['11.7.#', { msg: 'Distance sensor error' }],
|
|
89
|
+
['11.8.#', { msg: 'Distance sensor calibration error' }],
|
|
90
|
+
['11.9.#', { msg: 'Distance sensor calibration error' }],
|
|
91
|
+
['11.10.#', { msg: 'Drop detected at start of clean', opError: 'UnableToStartOrResume' }],
|
|
92
|
+
[['11.11.#', '11.14.#'], { msg: 'ADC error' }],
|
|
93
|
+
['11.15.#', { msg: 'Unclean distance sensor' }],
|
|
94
|
+
['11.16.#', { msg: 'Distance sensor error' }],
|
|
95
|
+
['11.17.#', { msg: 'Distance sensor communication error' }],
|
|
96
|
+
['11.18.#', { msg: 'Distance sensor calibration error' }],
|
|
97
|
+
['11.19.#', { msg: 'Drop sensor maintenance alert' }],
|
|
98
|
+
['11.20.#', { msg: 'Non-drop sensor maintenance alert' }],
|
|
99
|
+
['11.21.#', { msg: 'Distance sensor error' }],
|
|
100
|
+
['11.22.#', { msg: 'Unclean distance sensor' }],
|
|
101
|
+
[['13.0.-1', '13.0.1'], { msg: 'Dirty obstacle sensors - Cannot find a route back to dock', opError: 'FailedToFindChargingDock' }],
|
|
102
|
+
[['13.1.#', '13.2.#'], { msg: 'Navigation sensor error' }],
|
|
103
|
+
['13.3.-1', { msg: 'Low battery', opError: 'UnableToCompleteOperation' }],
|
|
104
|
+
['13.3.1', { msg: 'Dirty obstacle sensors - Low battery', opError: 'UnableToCompleteOperation' }],
|
|
105
|
+
['13.4.#', { msg: 'Low battery at clean start', opError: 'UnableToStartOrResume' }],
|
|
106
|
+
['13.5.#', { msg: 'Camera exposure not settled' }],
|
|
107
|
+
[['13.6.#', '13.7.#'], { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
|
|
108
|
+
['13.8.#', { msg: 'Failed to set state' }],
|
|
109
|
+
['13.9.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
|
|
110
|
+
['13.10.#', { msg: 'Insufficient features to find location', opError: 'UnableToCompleteOperation' }],
|
|
111
|
+
['13.12.#', { msg: 'High uncertainty in discovery', opError: 'UnableToCompleteOperation' }],
|
|
112
|
+
['13.13.#', { msg: 'Persistent location lost', opError: 'UnableToCompleteOperation' }],
|
|
113
|
+
['13.14.#', { msg: 'Discovered wrong floor', opError: 'UnableToCompleteOperation' }],
|
|
114
|
+
['13.15.#', { msg: 'Persistent location jump', opError: 'UnableToCompleteOperation' }],
|
|
115
|
+
['13.16.#', { msg: 'Software error' }],
|
|
116
|
+
['13.17.#', { msg: 'Replacement fault' }],
|
|
117
|
+
['13.18.#', { msg: 'Low battery', opError: 'FailedToFindChargingDock' }],
|
|
118
|
+
[['13.101.#', '13.102.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
119
|
+
[['13.105.#', '13.106.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
120
|
+
['13.132.#', { msg: 'Internal temperature too cold', batFault: 'UnderTemp' }],
|
|
121
|
+
[['13.133.#', '13.134.#'], { msg: 'Internal temperature too hot', batFault: 'OverTemp' }],
|
|
122
|
+
[['13.135.#', '13.151.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
123
|
+
[['13.157.#', '13.162.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
124
|
+
['17.0.#', { msg: 'Software error' }],
|
|
125
|
+
['17.2.#', { msg: 'Configuration data missing' }],
|
|
126
|
+
['17.3.#', { msg: 'Software error' }],
|
|
127
|
+
['17.4.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
|
|
128
|
+
['17.5.#', { msg: 'Configuration data missing' }],
|
|
129
|
+
[['17.6.#', '17.8.#'], { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
|
|
130
|
+
['17.9.#', { msg: 'Inconsistent Sensor Time - Software error' }],
|
|
131
|
+
['17.10.#', { msg: 'Software error' }],
|
|
132
|
+
['17.11.#', { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
133
|
+
['17.12.#', { msg: 'Edge actuator - Brush bar motor too hot', batFault: 'OverTemp' }],
|
|
134
|
+
['17.13.#', { msg: 'Could not start LCD screen' }],
|
|
135
|
+
['17.14.#', { msg: 'Low level PCB communication error' }],
|
|
136
|
+
['17.15.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
|
|
137
|
+
['17.16.#', { msg: 'Failed to upgrade' }],
|
|
138
|
+
['17.17.#', { msg: 'Low memory' }],
|
|
139
|
+
['17.18.#', { msg: 'Failed to save map' }],
|
|
140
|
+
['17.19.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
|
|
141
|
+
['17.20.#', { msg: 'Unable to upload robot logs' }],
|
|
142
|
+
['17.21.#', { msg: 'DHCP - Software error' }],
|
|
143
|
+
['17.22.#', { msg: 'IMU data error' }],
|
|
144
|
+
['17.23.#', { msg: 'Zoned map error' }],
|
|
145
|
+
[['17.100.#', '17.703.#'], { msg: 'Unhandled alert' }],
|
|
146
|
+
[['19.0.#', '19.2.#'], { msg: 'Robot too hot', batFault: 'OverTemp' }],
|
|
147
|
+
['19.3.#', { msg: 'Safety prevents motion', opError: 'Stuck' }],
|
|
148
|
+
['19.4.#', { msg: 'ADC error' }],
|
|
149
|
+
['19.5.#', { msg: 'Wheel motor too hot', batFault: 'OverTemp' }],
|
|
150
|
+
['19.6.#', { msg: 'Charge contact too hot', chargeFault: 'AmbientTooHot' }],
|
|
151
|
+
['19.7.#', { msg: 'Dirt detect sensor error' }],
|
|
152
|
+
['19.8.#', { msg: 'Optical flow sensor error' }],
|
|
153
|
+
['19.10.#', { msg: 'Vacuum fault', opError: 'DustBinFull' }],
|
|
154
|
+
['19.11.#', { msg: 'Illumination ring error' }],
|
|
155
|
+
['19.12.#', { msg: 'Routine maintenance' }],
|
|
156
|
+
['21.#.#', { msg: 'ADC error' }],
|
|
157
|
+
['23.0.#', { msg: 'Robot lifted', opError: 'Stuck' }],
|
|
158
|
+
[['23.1.#', '23.4.#'], { msg: 'Robot cannot recover from a drop', opError: 'Stuck' }],
|
|
159
|
+
['23.5.#', { msg: 'Rotated - Robot lifted', opError: 'Stuck' }]
|
|
160
|
+
];
|
|
161
|
+
//# sourceMappingURL=dyson-device-360-faults-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyson-device-360-faults-table.js","sourceRoot":"","sources":["../src/dyson-device-360-faults-table.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yCAAyC;AAGzC,OAAO,EAAkB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoBrE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAqC;IAC9E,CAAC,aAAa,CAAC,iBAAiB,EAAQ,EAAE,GAAG,EAAE,qBAAqB,EAAyF,CAAC;IAC9J,CAAC,aAAa,CAAC,oBAAoB,EAAK,EAAE,GAAG,EAAE,wBAAwB,EAAsF,CAAC;IAC9J,CAAC,aAAa,CAAC,aAAa,EAAY,EAAE,GAAG,EAAE,gBAAgB,EAA8F,CAAC;IAC9J,CAAC,aAAa,CAAC,gBAAgB,EAAS,EAAE,GAAG,EAAE,cAAc,EAAgG,CAAC;IAC9J,CAAC,aAAa,CAAC,SAAS,EAAgB,EAAE,GAAG,EAAE,eAAe,EAAkC,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,aAAa,CAAC,WAAW,EAAc,EAAE,GAAG,EAAE,eAAe,EAA+F,CAAC;IAC9J,CAAC,aAAa,CAAC,kBAAkB,EAAO,EAAE,GAAG,EAAE,yBAAyB,EAAqF,CAAC;IAC9J,CAAC,aAAa,CAAC,mBAAmB,EAAM,EAAE,GAAG,EAAE,0BAA0B,EAAoF,CAAC;IAC9J,CAAC,aAAa,CAAC,kBAAkB,EAAO,EAAE,GAAG,EAAE,eAAe,EAAkC,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAC9J,CAAC,aAAa,CAAC,iBAAiB,EAAQ,EAAE,GAAG,EAAE,0BAA0B,EAAuB,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAC9J,CAAC,aAAa,CAAC,sBAAsB,EAAG,EAAE,GAAG,EAAE,oBAAoB,EAA0F,CAAC;IAC9J,CAAC,aAAa,CAAC,oBAAoB,EAAK,EAAE,GAAG,EAAE,wBAAwB,EAAyB,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,aAAa,CAAC,kBAAkB,EAAO,EAAE,GAAG,EAAE,iBAAiB,EAAgC,OAAO,EAAE,2BAA2B,EAAyB,CAAC;CACjK,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,0BAA0B,GAAuD;IAC1F,OAAO,EAAqB,EAAE,GAAG,EAAE,eAAe,EAAc,mBAAmB,CAAa,OAAO,EAAE,aAAa,EAAuC;IAC7J,sBAAsB,EAAM,EAAE,GAAG,EAAE,aAAa,EAAgB,mBAAmB,CAAa,OAAO,EAAE,OAAO,EAA6C;IAC7J,cAAc,EAAc,EAAE,GAAG,EAAE,0BAA0B,EAAG,mBAAmB,CAAa,OAAO,EAAE,0BAA0B,EAA0B;IAC7J,MAAM,EAAsB,EAAE,GAAG,EAAE,uBAAuB,CAAM,mBAAmB,EAA0E;IAC7J,IAAI,EAAwB,EAAE,GAAG,EAAE,kBAAkB,EAAW,yBAAyB,CAAO,OAAO,EAAE,2BAA2B,EAAyB;IAC7J,OAAO,EAAqB,EAAE,GAAG,EAAE,eAAe,EAA8C,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAU;CAChK,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,qBAAqB,GAAyD;IACvF,kCAAkC;IAClC,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,6BAA6B,EAAgC,OAAO,EAAE,aAAa,EAAuC,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,2BAA2B,EAAkC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,6BAA6B,EAAgC,OAAO,EAAE,gBAAgB,EAAoC,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAE9J,2BAA2B;IAC3B,2GAA2G;IAC3G,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,aAAa,EAAuC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,aAAa,EAAuC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,4BAA4B,EAA8F,CAAC;IAC9J,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAS,EAAE,GAAG,EAAE,qBAAqB,EAAwC,OAAO,EAAE,gBAAgB,EAAoC,CAAC;IAC9J,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAS,EAAE,GAAG,EAAE,eAAe,EAA8C,OAAO,EAAE,aAAa,EAAuC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,yBAAyB,EAAoC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,qBAAqB,EAAwC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAS,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,WAAW,EAA+G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yBAAyB,EAAoC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,qBAAqB,EAAwC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,4BAA4B,EAAiC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yBAAyB,EAAoC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAAyF,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mCAAmC,EAA0B,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,kCAAkC,EAA2B,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,oCAAoC,EAAyB,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,mCAAmC,EAA0B,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,yBAAyB,EAAoC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAS,EAAE,GAAG,EAAE,0BAA0B,EAAmC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAU,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,oBAAoB,EAAyC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAQ,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,sBAAsB,EAAuC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAQ,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,qBAAqB,EAAwC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,yBAAyB,EAAoC,QAAQ,EAAE,aAAa,EAAsC,CAAC;IAC9J,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAS,EAAE,GAAG,EAAE,iBAAiB,EAA4C,QAAQ,EAAE,UAAU,EAAK,WAAW,EAAE,eAAe,EAAQ,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,qBAAqB,EAAqG,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,kBAAkB,EAA2C,OAAO,EAAE,gBAAgB,EAAoC,CAAC;IAC9J,CAAC,OAAO,EAAoB,EAAE,GAAG,EAAE,gBAAgB,EAA6C,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,WAAW,EAA+G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,uBAAuB,EAAmG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,0BAA0B,EAAgG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,kBAAkB,EAAwG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,uBAAuB,EAAmG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iCAAiC,EAA2B,OAAO,EAAE,uBAAuB,EAA8B,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAK,EAAE,GAAG,EAAE,WAAW,EAA+G,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yBAAyB,EAAiG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,uBAAuB,EAAmG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,qCAAqC,EAAqF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,+BAA+B,EAA2F,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,uBAAuB,EAAmG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yBAAyB,EAAiG,CAAC;IAC9J,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAM,EAAE,GAAG,EAAE,2DAA2D,EAAE,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,yBAAyB,EAAiG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,sCAAsC,EAAuB,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,4BAA4B,EAAiC,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,6BAA6B,EAA6F,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,qBAAqB,EAAqG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,wCAAwC,EAAqB,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,+BAA+B,EAA8B,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAmC,OAAO,EAAE,2BAA2B,EAAyB,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,gBAAgB,EAA0G,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mBAAmB,EAAuG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,0BAA0B,EAA0B,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,UAAU,EAAiB,EAAE,GAAG,EAAE,+BAA+B,EAA8B,QAAQ,EAAE,WAAW,EAAwC,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,8BAA8B,EAA+B,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,gBAAgB,EAA0G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,4BAA4B,EAA8F,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,gBAAgB,EAA0G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,4BAA4B,EAA8F,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,2CAA2C,EAA+E,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,gBAAgB,EAA0G,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yCAAyC,EAAoB,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,4BAA4B,EAA8F,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mCAAmC,EAAuF,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,aAAa,EAAgD,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,mBAAmB,EAAuG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,YAAY,EAA8G,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,oBAAoB,EAAsG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iBAAiB,EAA4C,OAAO,EAAE,uBAAuB,EAA6B,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,6BAA6B,EAA6F,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,uBAAuB,EAAmG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,gBAAgB,EAA0G,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,iBAAiB,EAAyG,CAAC;IAC9J,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAG,EAAE,GAAG,EAAE,iBAAiB,EAAyG,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,eAAe,EAA8C,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,WAAW,EAA+G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,qBAAqB,EAAwC,QAAQ,EAAE,UAAU,EAAyC,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,wBAAwB,EAAqC,WAAW,EAAE,eAAe,EAAiC,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,0BAA0B,EAAgG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,2BAA2B,EAA+F,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,cAAc,EAA+C,OAAO,EAAE,aAAa,EAAuC,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,yBAAyB,EAAiG,CAAC;IAC9J,CAAC,SAAS,EAAkB,EAAE,GAAG,EAAE,qBAAqB,EAAqG,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,WAAW,EAA+G,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,cAAc,EAA+C,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAO,EAAE,GAAG,EAAE,kCAAkC,EAA2B,OAAO,EAAE,OAAO,EAA6C,CAAC;IAC9J,CAAC,QAAQ,EAAmB,EAAE,GAAG,EAAE,wBAAwB,EAAqC,OAAO,EAAE,OAAO,EAA6C,CAAC;CACjK,CAAC"}
|