@marcel2215/homebridge-supla-plugin 2.1.29 → 2.1.31
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/README.md +25 -1
- package/config.schema.json +26 -5
- package/dist/Accesories/ActionTriggerAccessory.d.ts +0 -1
- package/dist/Accesories/ActionTriggerAccessory.d.ts.map +1 -1
- package/dist/Accesories/ActionTriggerAccessory.js +15 -9
- package/dist/Accesories/ActionTriggerAccessory.js.map +1 -1
- package/dist/Accesories/AirQualityAccessory.d.ts +3 -1
- package/dist/Accesories/AirQualityAccessory.d.ts.map +1 -1
- package/dist/Accesories/AirQualityAccessory.js +47 -5
- package/dist/Accesories/AirQualityAccessory.js.map +1 -1
- package/dist/Accesories/ContactSensorAccessory.d.ts +3 -1
- package/dist/Accesories/ContactSensorAccessory.d.ts.map +1 -1
- package/dist/Accesories/ContactSensorAccessory.js +32 -4
- package/dist/Accesories/ContactSensorAccessory.js.map +1 -1
- package/dist/Accesories/DimmerAccessory.d.ts +5 -3
- package/dist/Accesories/DimmerAccessory.d.ts.map +1 -1
- package/dist/Accesories/DimmerAccessory.js +50 -14
- package/dist/Accesories/DimmerAccessory.js.map +1 -1
- package/dist/Accesories/DimmerRgbLightAccessory.d.ts +11 -3
- package/dist/Accesories/DimmerRgbLightAccessory.d.ts.map +1 -1
- package/dist/Accesories/DimmerRgbLightAccessory.js +148 -26
- package/dist/Accesories/DimmerRgbLightAccessory.js.map +1 -1
- package/dist/Accesories/DoorAccessory.d.ts +14 -1
- package/dist/Accesories/DoorAccessory.d.ts.map +1 -1
- package/dist/Accesories/DoorAccessory.js +146 -20
- package/dist/Accesories/DoorAccessory.js.map +1 -1
- package/dist/Accesories/ElectricityMeterAccessory.d.ts +13 -1
- package/dist/Accesories/ElectricityMeterAccessory.d.ts.map +1 -1
- package/dist/Accesories/ElectricityMeterAccessory.js +127 -12
- package/dist/Accesories/ElectricityMeterAccessory.js.map +1 -1
- package/dist/Accesories/FacadeBlindAccessory.d.ts +6 -0
- package/dist/Accesories/FacadeBlindAccessory.d.ts.map +1 -1
- package/dist/Accesories/FacadeBlindAccessory.js +205 -64
- package/dist/Accesories/FacadeBlindAccessory.js.map +1 -1
- package/dist/Accesories/FrontGateFsm.d.ts +8 -2
- package/dist/Accesories/FrontGateFsm.d.ts.map +1 -1
- package/dist/Accesories/FrontGateFsm.js +79 -19
- package/dist/Accesories/FrontGateFsm.js.map +1 -1
- package/dist/Accesories/GarageDoorOpenerAccesory.d.ts +12 -3
- package/dist/Accesories/GarageDoorOpenerAccesory.d.ts.map +1 -1
- package/dist/Accesories/GarageDoorOpenerAccesory.js +168 -21
- package/dist/Accesories/GarageDoorOpenerAccesory.js.map +1 -1
- package/dist/Accesories/GateAccessory.d.ts +6 -0
- package/dist/Accesories/GateAccessory.d.ts.map +1 -1
- package/dist/Accesories/GateAccessory.js +140 -18
- package/dist/Accesories/GateAccessory.js.map +1 -1
- package/dist/Accesories/GateLockAccessory.d.ts +17 -1
- package/dist/Accesories/GateLockAccessory.d.ts.map +1 -1
- package/dist/Accesories/GateLockAccessory.js +375 -50
- package/dist/Accesories/GateLockAccessory.js.map +1 -1
- package/dist/Accesories/LeakSensorAccessory.d.ts +3 -1
- package/dist/Accesories/LeakSensorAccessory.d.ts.map +1 -1
- package/dist/Accesories/LeakSensorAccessory.js +32 -4
- package/dist/Accesories/LeakSensorAccessory.js.map +1 -1
- package/dist/Accesories/LightBulbAccesory.d.ts +4 -3
- package/dist/Accesories/LightBulbAccesory.d.ts.map +1 -1
- package/dist/Accesories/LightBulbAccesory.js +40 -12
- package/dist/Accesories/LightBulbAccesory.js.map +1 -1
- package/dist/Accesories/PressureAccessory.d.ts +3 -1
- package/dist/Accesories/PressureAccessory.d.ts.map +1 -1
- package/dist/Accesories/PressureAccessory.js +28 -5
- package/dist/Accesories/PressureAccessory.js.map +1 -1
- package/dist/Accesories/RGBLightBulbAccesory.d.ts +10 -1
- package/dist/Accesories/RGBLightBulbAccesory.d.ts.map +1 -1
- package/dist/Accesories/RGBLightBulbAccesory.js +136 -17
- package/dist/Accesories/RGBLightBulbAccesory.js.map +1 -1
- package/dist/Accesories/RollerShutterAccessory.d.ts +6 -0
- package/dist/Accesories/RollerShutterAccessory.d.ts.map +1 -1
- package/dist/Accesories/RollerShutterAccessory.js +219 -74
- package/dist/Accesories/RollerShutterAccessory.js.map +1 -1
- package/dist/Accesories/SwitchAccessory.d.ts +4 -3
- package/dist/Accesories/SwitchAccessory.d.ts.map +1 -1
- package/dist/Accesories/SwitchAccessory.js +40 -12
- package/dist/Accesories/SwitchAccessory.js.map +1 -1
- package/dist/Accesories/TemperatureAccessory.d.ts +3 -1
- package/dist/Accesories/TemperatureAccessory.d.ts.map +1 -1
- package/dist/Accesories/TemperatureAccessory.js +28 -5
- package/dist/Accesories/TemperatureAccessory.js.map +1 -1
- package/dist/Accesories/TemperatureHumidityAccessory.d.ts +5 -1
- package/dist/Accesories/TemperatureHumidityAccessory.d.ts.map +1 -1
- package/dist/Accesories/TemperatureHumidityAccessory.js +40 -9
- package/dist/Accesories/TemperatureHumidityAccessory.js.map +1 -1
- package/dist/Accesories/ThermostatAccessory.d.ts +18 -1
- package/dist/Accesories/ThermostatAccessory.d.ts.map +1 -1
- package/dist/Accesories/ThermostatAccessory.js +193 -34
- package/dist/Accesories/ThermostatAccessory.js.map +1 -1
- package/dist/Accesories/ValveAccessory.d.ts +5 -2
- package/dist/Accesories/ValveAccessory.d.ts.map +1 -1
- package/dist/Accesories/ValveAccessory.js +47 -8
- package/dist/Accesories/ValveAccessory.js.map +1 -1
- package/dist/Accesories/WicketAccesory.d.ts +18 -3
- package/dist/Accesories/WicketAccesory.d.ts.map +1 -1
- package/dist/Accesories/WicketAccesory.js +154 -14
- package/dist/Accesories/WicketAccesory.js.map +1 -1
- package/dist/Heplers/ColorConverters.d.ts +2 -2
- package/dist/Heplers/ColorConverters.d.ts.map +1 -1
- package/dist/Heplers/ColorConverters.js +7 -3
- package/dist/Heplers/ColorConverters.js.map +1 -1
- package/dist/Heplers/DisplayName.d.ts +15 -0
- package/dist/Heplers/DisplayName.d.ts.map +1 -0
- package/dist/Heplers/DisplayName.js +174 -0
- package/dist/Heplers/DisplayName.js.map +1 -0
- package/dist/Heplers/SuplaChannelContext.d.ts +3 -1
- package/dist/Heplers/SuplaChannelContext.d.ts.map +1 -1
- package/dist/Heplers/SuplaChannelContext.js +3 -1
- package/dist/Heplers/SuplaChannelContext.js.map +1 -1
- package/dist/Heplers/SuplaMqttClient.d.ts +12 -4
- package/dist/Heplers/SuplaMqttClient.d.ts.map +1 -1
- package/dist/Heplers/SuplaMqttClient.js +214 -112
- package/dist/Heplers/SuplaMqttClient.js.map +1 -1
- package/dist/platform.d.ts +59 -3
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +1119 -116
- package/dist/platform.js.map +1 -1
- package/package.json +7 -3
- package/config.json +0 -3
package/README.md
CHANGED
|
@@ -14,12 +14,36 @@
|
|
|
14
14
|
|
|
15
15
|
This is an accessory plugin for Supla devices. It allows you to control your Supla devices with HomeKit and Siri.
|
|
16
16
|
|
|
17
|
-
Supports Homebridge 1.6 or later, including Homebridge 2.1.1
|
|
17
|
+
Supports Homebridge 1.6 or later, including Homebridge 2.1.1, on Node.js 22.12+ or Node.js 24.
|
|
18
18
|
|
|
19
19
|
### How it works
|
|
20
20
|
|
|
21
21
|
This plugin uses the mqtt protocol to communicate with the Supla server. It subscribes to the topics of the devices you want to control and publishes the commands you send to the devices.
|
|
22
22
|
|
|
23
|
+
Discovered channel metadata is cached in a versioned, per-platform-instance file under Homebridge's storage directory. A legacy
|
|
24
|
+
`channels` value is migrated once for compatibility; the plugin does not rewrite Homebridge's `config.json` at runtime.
|
|
25
|
+
Cached cloud-topic accessories can be safely migrated in place because their topic contains the Supla account name. Older
|
|
26
|
+
roller-shutter topics contain no account identity, so they receive a new account-scoped HomeKit identity by default. Set
|
|
27
|
+
`migrateUnscopedLegacyAccessories` to `true` only for a one-time migration when you know the cached accessories belong to the
|
|
28
|
+
currently configured account; do not enable it when changing accounts.
|
|
29
|
+
|
|
30
|
+
Supla captions are retained in Unicode NFC form, so Polish diacritics and other scripts are not passed through an ASCII-only
|
|
31
|
+
sanitizer. HomeKit-facing names preserve Unicode letters and numbers while mapping only typography unsupported by HAP and respecting
|
|
32
|
+
the Name characteristic's 64 UTF-16-code-unit limit. Generated, blank, malformed, or partial-discovery captions never replace a
|
|
33
|
+
meaningful cached name; an existing name changes only with durable retained-caption evidence or a complete authoritative snapshot.
|
|
34
|
+
The plugin does not write HomeKit's user-controlled `ConfiguredName` characteristic.
|
|
35
|
+
Accessory UUIDs and service identities are based only on the account plus channel IDs (or a stable legacy topic), never on captions;
|
|
36
|
+
renaming a channel therefore does not create a new HomeKit accessory.
|
|
37
|
+
|
|
38
|
+
MQTT publish completion confirms delivery to the MQTT client/broker, not physical-device application. HomeKit setters surface
|
|
39
|
+
transport failures, and state is reconciled from subsequent Supla state topics.
|
|
40
|
+
|
|
41
|
+
Electricity meters retain the existing HomeKit `LightSensor` service for automation and accessory-identity compatibility.
|
|
42
|
+
`CurrentAmbientLightLevel` is therefore a compatibility carrier, not a lux reading: its numeric value uses the one Supla metric and
|
|
43
|
+
unit shown explicitly in the service name (for example, `Voltage; V` or `Active power; W`). On first setup the plugin selects one
|
|
44
|
+
metric deterministically from the retained snapshot and persists that choice. It will not silently switch units on later starts; if
|
|
45
|
+
the selected metric is absent, the service remains unavailable. The generic `value` metric is labeled `unknown unit`.
|
|
46
|
+
|
|
23
47
|
|
|
24
48
|
### How to use
|
|
25
49
|
|
package/config.schema.json
CHANGED
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
"pluginAlias": "SuplaPlatform",
|
|
3
3
|
"pluginType": "platform",
|
|
4
4
|
"singular": true,
|
|
5
|
+
"strictValidation": false,
|
|
5
6
|
"schema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"required": [
|
|
9
|
+
"name",
|
|
10
|
+
"host",
|
|
11
|
+
"port",
|
|
12
|
+
"username",
|
|
13
|
+
"password"
|
|
14
|
+
],
|
|
15
|
+
"additionalProperties": true,
|
|
16
|
+
"properties": {
|
|
6
17
|
"name": {
|
|
7
18
|
"title": "Name",
|
|
8
19
|
"type": "string",
|
|
@@ -58,6 +69,12 @@
|
|
|
58
69
|
"auto"
|
|
59
70
|
]
|
|
60
71
|
},
|
|
72
|
+
"migrateUnscopedLegacyAccessories": {
|
|
73
|
+
"title": "Adopt Legacy Unscoped Accessories",
|
|
74
|
+
"type": "boolean",
|
|
75
|
+
"default": false,
|
|
76
|
+
"description": "One-time compatibility opt-in for legacy roller-shutter accessories whose cached topics contain no Supla account identity. Leave disabled after changing accounts."
|
|
77
|
+
},
|
|
61
78
|
"gateExecuteActionToggle": {
|
|
62
79
|
"title": "Front Gate Toggle Action",
|
|
63
80
|
"type": "string",
|
|
@@ -157,7 +174,9 @@
|
|
|
157
174
|
"gateLockPulseSeconds": {
|
|
158
175
|
"title": "Gate Lock Pulse Seconds",
|
|
159
176
|
"type": "number",
|
|
160
|
-
"default":
|
|
177
|
+
"default": 1,
|
|
178
|
+
"minimum": 0.1,
|
|
179
|
+
"maximum": 60
|
|
161
180
|
},
|
|
162
181
|
"gateLockSetOnPayload": {
|
|
163
182
|
"title": "Gate Lock Set On Payload",
|
|
@@ -235,18 +254,20 @@
|
|
|
235
254
|
},
|
|
236
255
|
"username": {
|
|
237
256
|
"title": "Username",
|
|
238
|
-
"type": "string"
|
|
239
|
-
"default": "admin"
|
|
257
|
+
"type": "string"
|
|
240
258
|
},
|
|
241
259
|
"password": {
|
|
242
260
|
"title": "Password",
|
|
243
261
|
"type": "string",
|
|
244
|
-
"
|
|
262
|
+
"format": "password"
|
|
245
263
|
},
|
|
246
264
|
"channels": {
|
|
247
265
|
"title": "Cached Channels",
|
|
248
266
|
"type": "string",
|
|
249
|
-
"
|
|
267
|
+
"description": "Deprecated legacy cache. It is read once for migration and is no longer written.",
|
|
268
|
+
"deprecated": true,
|
|
269
|
+
"hidden": true
|
|
270
|
+
}
|
|
250
271
|
}
|
|
251
272
|
}
|
|
252
273
|
}
|
|
@@ -6,7 +6,6 @@ export declare class ActionTriggerAccessory {
|
|
|
6
6
|
private readonly accessory;
|
|
7
7
|
private readonly context;
|
|
8
8
|
private service;
|
|
9
|
-
private connected;
|
|
10
9
|
constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
|
|
11
10
|
private parseEvent;
|
|
12
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionTriggerAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/ActionTriggerAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ActionTriggerAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/ActionTriggerAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,OAAO,CAAU;gBAGN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAoC/C,OAAO,CAAC,UAAU;CAanB"}
|
|
@@ -6,32 +6,38 @@ class ActionTriggerAccessory {
|
|
|
6
6
|
this.platform = platform;
|
|
7
7
|
this.accessory = accessory;
|
|
8
8
|
this.context = context;
|
|
9
|
-
this.connected = true;
|
|
10
9
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
11
10
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Supla')
|
|
12
11
|
.setCharacteristic(this.platform.Characteristic.Model, 'ActionTrigger');
|
|
13
12
|
this.service = this.accessory.getService(this.platform.Service.StatelessProgrammableSwitch)
|
|
14
13
|
|| this.accessory.addService(this.platform.Service.StatelessProgrammableSwitch);
|
|
15
14
|
this.service.setCharacteristic(this.platform.Characteristic.Name, accessory.displayName);
|
|
16
|
-
this.platform.registerMqttHandler(`${this.context.topic}/state/action`, (message) => {
|
|
15
|
+
this.platform.registerMqttHandler(`${this.context.topic}/state/action`, (message, _topic, packet) => {
|
|
16
|
+
if (packet.retain) {
|
|
17
|
+
this.platform.log.debug(`Ignoring retained action trigger event for ${this.context.channelCaption}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
17
20
|
const event = this.parseEvent(message.toString());
|
|
21
|
+
if (event === undefined) {
|
|
22
|
+
this.platform.log.debug(`Ignoring unknown action trigger payload for ${this.context.channelCaption}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
18
25
|
this.platform.log.debug(`Action trigger ${this.context.channelCaption} event=${event}`);
|
|
19
26
|
this.service.updateCharacteristic(this.platform.Characteristic.ProgrammableSwitchEvent, event);
|
|
20
27
|
}, this.accessory.UUID);
|
|
21
|
-
this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
|
|
22
|
-
this.connected = this.platform.parseBoolean(message.toString());
|
|
23
|
-
this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
|
|
24
|
-
}, this.accessory.UUID);
|
|
25
28
|
}
|
|
26
29
|
parseEvent(payload) {
|
|
27
30
|
const value = payload.trim().toLowerCase();
|
|
28
|
-
if (
|
|
31
|
+
if (['1', 'double', 'double_press'].includes(value)) {
|
|
29
32
|
return this.platform.Characteristic.ProgrammableSwitchEvent.DOUBLE_PRESS;
|
|
30
33
|
}
|
|
31
|
-
if (
|
|
34
|
+
if (['2', 'long', 'long_press', 'hold'].includes(value)) {
|
|
32
35
|
return this.platform.Characteristic.ProgrammableSwitchEvent.LONG_PRESS;
|
|
33
36
|
}
|
|
34
|
-
|
|
37
|
+
if (['0', 'single', 'single_press', 'click'].includes(value)) {
|
|
38
|
+
return this.platform.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS;
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
exports.ActionTriggerAccessory = ActionTriggerAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionTriggerAccessory.js","sourceRoot":"","sources":["../../src/Accesories/ActionTriggerAccessory.ts"],"names":[],"mappings":";;;AAIA,MAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ActionTriggerAccessory.js","sourceRoot":"","sources":["../../src/Accesories/ActionTriggerAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,10 +7,12 @@ export declare class AirQualityAccessory {
|
|
|
7
7
|
private readonly context;
|
|
8
8
|
private service;
|
|
9
9
|
private value;
|
|
10
|
-
private connected
|
|
10
|
+
private connected?;
|
|
11
|
+
private hasValue;
|
|
11
12
|
private kind;
|
|
12
13
|
constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
|
|
13
14
|
handleAirQualityGet(): Promise<CharacteristicValue>;
|
|
15
|
+
private updateFault;
|
|
14
16
|
private updateMeasurements;
|
|
15
17
|
private resolveKind;
|
|
16
18
|
private toAirQuality;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AirQualityAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/AirQualityAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrE,qBAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"AirQualityAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/AirQualityAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrE,qBAAa,mBAAmB;IAQ5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAiB;gBAGV,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAyDzC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IASzD,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,YAAY;CA8BrB"}
|
|
@@ -7,8 +7,12 @@ class AirQualityAccessory {
|
|
|
7
7
|
this.accessory = accessory;
|
|
8
8
|
this.context = context;
|
|
9
9
|
this.value = 0;
|
|
10
|
-
this.
|
|
10
|
+
this.hasValue = false;
|
|
11
11
|
this.kind = this.resolveKind();
|
|
12
|
+
// Caption heuristics are only a legacy bootstrap. Persist the selected
|
|
13
|
+
// measurement semantics so a later channel rename cannot silently switch
|
|
14
|
+
// PM10 thresholds/characteristics to PM2.5 (or vice versa) after restart.
|
|
15
|
+
this.accessory.context.suplaAirQualityKind = this.kind;
|
|
12
16
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
13
17
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Supla')
|
|
14
18
|
.setCharacteristic(this.platform.Characteristic.Model, 'AirQualitySensor');
|
|
@@ -18,20 +22,43 @@ class AirQualityAccessory {
|
|
|
18
22
|
this.service.getCharacteristic(this.platform.Characteristic.AirQuality)
|
|
19
23
|
.onGet(this.handleAirQualityGet.bind(this));
|
|
20
24
|
this.platform.registerMqttHandler(`${this.context.topic}/state/value`, (message) => {
|
|
21
|
-
const value =
|
|
22
|
-
if (
|
|
25
|
+
const value = this.platform.parseFiniteNumberStrict(message.toString());
|
|
26
|
+
if (value !== undefined && value >= 0) {
|
|
23
27
|
this.value = value;
|
|
28
|
+
this.hasValue = true;
|
|
24
29
|
this.updateMeasurements();
|
|
30
|
+
this.updateFault();
|
|
25
31
|
}
|
|
26
32
|
}, this.accessory.UUID);
|
|
27
33
|
this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
const connected = this.platform.parseBooleanStrict(message.toString());
|
|
35
|
+
if (connected === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.connected = connected;
|
|
39
|
+
if (!connected) {
|
|
40
|
+
this.hasValue = false;
|
|
41
|
+
}
|
|
42
|
+
this.updateFault();
|
|
43
|
+
}, this.accessory.UUID);
|
|
44
|
+
this.platform.registerMqttTransportHandler?.((transportConnected) => {
|
|
45
|
+
if (!transportConnected) {
|
|
46
|
+
this.connected = undefined;
|
|
47
|
+
this.hasValue = false;
|
|
48
|
+
this.updateFault();
|
|
49
|
+
}
|
|
30
50
|
}, this.accessory.UUID);
|
|
51
|
+
this.updateFault();
|
|
31
52
|
}
|
|
32
53
|
async handleAirQualityGet() {
|
|
54
|
+
if (this.connected !== true || !this.hasValue) {
|
|
55
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
56
|
+
}
|
|
33
57
|
return this.toAirQuality(this.value);
|
|
34
58
|
}
|
|
59
|
+
updateFault() {
|
|
60
|
+
this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected === true && this.hasValue ? 0 : 1);
|
|
61
|
+
}
|
|
35
62
|
updateMeasurements() {
|
|
36
63
|
if (this.kind === 'pm25') {
|
|
37
64
|
this.service.updateCharacteristic(this.platform.Characteristic.PM2_5Density, this.value);
|
|
@@ -42,6 +69,21 @@ class AirQualityAccessory {
|
|
|
42
69
|
this.service.updateCharacteristic(this.platform.Characteristic.AirQuality, this.toAirQuality(this.value));
|
|
43
70
|
}
|
|
44
71
|
resolveKind() {
|
|
72
|
+
const persisted = this.accessory.context.suplaAirQualityKind;
|
|
73
|
+
if (persisted === 'pm10' || persisted === 'pm25') {
|
|
74
|
+
return persisted;
|
|
75
|
+
}
|
|
76
|
+
const functionName = (this.context.channelFunction ?? '')
|
|
77
|
+
.toUpperCase()
|
|
78
|
+
.replace(/[^A-Z0-9]+/g, '');
|
|
79
|
+
if (functionName.includes('PM10')) {
|
|
80
|
+
return 'pm10';
|
|
81
|
+
}
|
|
82
|
+
if (functionName.includes('PM25') || functionName.includes('PM2')) {
|
|
83
|
+
return 'pm25';
|
|
84
|
+
}
|
|
85
|
+
// Old Supla metadata can expose only GENERAL_PURPOSE_MEASUREMENT. Retain
|
|
86
|
+
// the former caption inference once, then use the persisted value above.
|
|
45
87
|
const caption = (this.context.channelCaption ?? '').toLowerCase();
|
|
46
88
|
if (caption.includes('pm10')) {
|
|
47
89
|
return 'pm10';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AirQualityAccessory.js","sourceRoot":"","sources":["../../src/Accesories/AirQualityAccessory.ts"],"names":[],"mappings":";;;AAMA,MAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"AirQualityAccessory.js","sourceRoot":"","sources":["../../src/Accesories/AirQualityAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,10 @@ export declare class ContactSensorAccessory {
|
|
|
7
7
|
private readonly context;
|
|
8
8
|
private service;
|
|
9
9
|
private state;
|
|
10
|
-
private connected
|
|
10
|
+
private connected?;
|
|
11
|
+
private hasState;
|
|
11
12
|
constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
|
|
12
13
|
handleStateGet(): Promise<CharacteristicValue>;
|
|
14
|
+
private updateFault;
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=ContactSensorAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactSensorAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/ContactSensorAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ContactSensorAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/ContactSensorAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAoE;IACjF,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAS;gBAGN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAuDzC,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IASpD,OAAO,CAAC,WAAW;CAQpB"}
|
|
@@ -7,7 +7,7 @@ class ContactSensorAccessory {
|
|
|
7
7
|
this.accessory = accessory;
|
|
8
8
|
this.context = context;
|
|
9
9
|
this.state = this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
10
|
-
this.
|
|
10
|
+
this.hasState = false;
|
|
11
11
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
12
12
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Supla')
|
|
13
13
|
.setCharacteristic(this.platform.Characteristic.Model, 'ContactSensor');
|
|
@@ -17,20 +17,48 @@ class ContactSensorAccessory {
|
|
|
17
17
|
this.service.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
18
18
|
.onGet(this.handleStateGet.bind(this));
|
|
19
19
|
this.platform.registerMqttHandler(`${this.context.topic}/state/hi`, (message) => {
|
|
20
|
-
const closed = this.platform.
|
|
20
|
+
const closed = this.platform.parseBooleanStrict(message.toString());
|
|
21
|
+
if (closed === undefined) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this.hasState = true;
|
|
21
25
|
this.state = closed
|
|
22
26
|
? this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED
|
|
23
27
|
: this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
24
28
|
this.service.updateCharacteristic(this.platform.Characteristic.ContactSensorState, this.state);
|
|
29
|
+
this.updateFault();
|
|
25
30
|
}, this.accessory.UUID);
|
|
26
31
|
this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
const connected = this.platform.parseBooleanStrict(message.toString());
|
|
33
|
+
if (connected === undefined) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.connected = connected;
|
|
37
|
+
if (!connected) {
|
|
38
|
+
this.hasState = false;
|
|
39
|
+
}
|
|
40
|
+
this.updateFault();
|
|
29
41
|
}, this.accessory.UUID);
|
|
42
|
+
this.platform.registerMqttTransportHandler?.((transportConnected) => {
|
|
43
|
+
if (!transportConnected) {
|
|
44
|
+
this.connected = undefined;
|
|
45
|
+
this.hasState = false;
|
|
46
|
+
this.updateFault();
|
|
47
|
+
}
|
|
48
|
+
}, this.accessory.UUID);
|
|
49
|
+
this.updateFault();
|
|
30
50
|
}
|
|
31
51
|
async handleStateGet() {
|
|
52
|
+
if (this.connected !== true || !this.hasState) {
|
|
53
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
54
|
+
}
|
|
32
55
|
return this.state;
|
|
33
56
|
}
|
|
57
|
+
updateFault() {
|
|
58
|
+
this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected === true && this.hasState
|
|
59
|
+
? this.platform.Characteristic.StatusFault.NO_FAULT
|
|
60
|
+
: this.platform.Characteristic.StatusFault.GENERAL_FAULT);
|
|
61
|
+
}
|
|
34
62
|
}
|
|
35
63
|
exports.ContactSensorAccessory = ContactSensorAccessory;
|
|
36
64
|
//# sourceMappingURL=ContactSensorAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactSensorAccessory.js","sourceRoot":"","sources":["../../src/Accesories/ContactSensorAccessory.ts"],"names":[],"mappings":";;;AAIA,MAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ContactSensorAccessory.js","sourceRoot":"","sources":["../../src/Accesories/ContactSensorAccessory.ts"],"names":[],"mappings":";;;AAIA,MAAa,sBAAsB;IAMjC,YACmB,QAAuB,EACvB,SAA4B,EAC5B,OAA4B;QAF5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAC5B,YAAO,GAAP,OAAO,CAAqB;QAPvC,UAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;QAEzE,aAAQ,GAAG,KAAK,CAAC;QAOvB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;eACxE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAEzF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;aAC5E,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,WAAW,EAChC,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,MAAM;gBACjB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,gBAAgB;gBAClE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;YACzE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/F,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,EACD,IAAI,CAAC,SAAS,CAAC,IAAI,CACpB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,EACvC,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,EACD,IAAI,CAAC,SAAS,CAAC,IAAI,CACpB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE;YAClE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,4EAE7C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EACxC,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ;YACtC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ;YACnD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,CAC3D,CAAC;IACJ,CAAC;CACF;AAjFD,wDAiFC"}
|
|
@@ -8,15 +8,17 @@ export declare class DimmerAccessory {
|
|
|
8
8
|
private service;
|
|
9
9
|
private state;
|
|
10
10
|
private brightness;
|
|
11
|
-
private connected
|
|
12
|
-
private overcurrent
|
|
11
|
+
private connected?;
|
|
12
|
+
private overcurrent?;
|
|
13
|
+
private hasState;
|
|
14
|
+
private hasBrightness;
|
|
13
15
|
private updateTimer?;
|
|
14
16
|
constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
|
|
15
17
|
handleOnGet(): Promise<CharacteristicValue>;
|
|
16
18
|
handleOnSet(value: CharacteristicValue): Promise<void>;
|
|
17
19
|
handleBrightnessGet(): Promise<CharacteristicValue>;
|
|
18
20
|
handleBrightnessSet(value: CharacteristicValue): Promise<void>;
|
|
19
|
-
private updateFault;
|
|
20
21
|
private clearUpdateTimer;
|
|
22
|
+
private assertAvailable;
|
|
21
23
|
}
|
|
22
24
|
//# sourceMappingURL=DimmerAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DimmerAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/DimmerAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAEnE,qBAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"DimmerAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/DimmerAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAEnE,qBAAa,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAiB;gBAGlB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IA0FzC,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAK3C,WAAW,CAAC,KAAK,EAAE,mBAAmB;IActC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKnD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAUpD,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,eAAe;CAOxB"}
|
|
@@ -8,8 +8,8 @@ class DimmerAccessory {
|
|
|
8
8
|
this.context = context;
|
|
9
9
|
this.state = false;
|
|
10
10
|
this.brightness = 0;
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
11
|
+
this.hasState = false;
|
|
12
|
+
this.hasBrightness = false;
|
|
13
13
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
14
14
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Supla')
|
|
15
15
|
.setCharacteristic(this.platform.Characteristic.Model, 'DimmerController');
|
|
@@ -27,44 +27,75 @@ class DimmerAccessory {
|
|
|
27
27
|
});
|
|
28
28
|
this.platform.registerMqttHandler(`${this.context.topic}/state/on`, (message) => {
|
|
29
29
|
this.platform.log.info(`Light ${this.context.channelCaption} state changed to ${message.toString()}`);
|
|
30
|
-
|
|
30
|
+
const state = this.platform.parseBooleanStrict(message.toString());
|
|
31
|
+
if (state === undefined) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.state = state;
|
|
35
|
+
this.hasState = true;
|
|
31
36
|
this.service.updateCharacteristic(this.platform.Characteristic.On, this.state);
|
|
32
37
|
}, this.accessory.UUID);
|
|
33
38
|
this.platform.registerMqttHandler(`${this.context.topic}/state/brightness`, (message) => {
|
|
34
39
|
this.platform.log.info(`Light ${this.context.channelCaption} brightness changed to ${message.toString()}`);
|
|
35
|
-
|
|
40
|
+
const brightness = this.platform.parseFiniteNumberStrict(message.toString());
|
|
41
|
+
if (brightness === undefined || brightness < 0 || brightness > 100) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.brightness = brightness;
|
|
45
|
+
this.hasBrightness = true;
|
|
36
46
|
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, this.brightness);
|
|
37
47
|
}, this.accessory.UUID);
|
|
38
48
|
this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
const connected = this.platform.parseBooleanStrict(message.toString());
|
|
50
|
+
if (connected === undefined) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.connected = connected;
|
|
54
|
+
if (!connected) {
|
|
55
|
+
this.hasState = false;
|
|
56
|
+
this.hasBrightness = false;
|
|
57
|
+
this.overcurrent = undefined;
|
|
58
|
+
this.clearUpdateTimer();
|
|
59
|
+
}
|
|
41
60
|
}, this.accessory.UUID);
|
|
42
61
|
this.platform.registerMqttHandler(`${this.context.topic}/state/overcurrent_relay_off`, (message) => {
|
|
43
|
-
|
|
44
|
-
|
|
62
|
+
const overcurrent = this.platform.parseBooleanStrict(message.toString());
|
|
63
|
+
if (overcurrent === undefined) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.overcurrent = overcurrent;
|
|
67
|
+
}, this.accessory.UUID);
|
|
68
|
+
this.platform.registerMqttTransportHandler?.((transportConnected) => {
|
|
69
|
+
this.connected = transportConnected ? undefined : false;
|
|
70
|
+
if (!transportConnected) {
|
|
71
|
+
this.hasState = false;
|
|
72
|
+
this.hasBrightness = false;
|
|
73
|
+
this.overcurrent = undefined;
|
|
74
|
+
this.clearUpdateTimer();
|
|
75
|
+
}
|
|
45
76
|
}, this.accessory.UUID);
|
|
46
77
|
}
|
|
47
78
|
async handleOnGet() {
|
|
79
|
+
this.assertAvailable(this.hasState);
|
|
48
80
|
return this.state;
|
|
49
81
|
}
|
|
50
82
|
async handleOnSet(value) {
|
|
83
|
+
this.assertAvailable(this.hasState);
|
|
51
84
|
this.platform.log.debug(`Publishing ${this.context.topic}/set/on = ${value.toString()}`);
|
|
52
|
-
this.platform.
|
|
85
|
+
await this.platform.publishCommandAsync(`${this.context.topic}/set/on`, value.toString());
|
|
53
86
|
this.clearUpdateTimer();
|
|
54
87
|
this.updateTimer = setTimeout(() => {
|
|
55
88
|
this.service.updateCharacteristic(this.platform.Characteristic.On, this.state);
|
|
56
89
|
}, 300);
|
|
57
90
|
}
|
|
58
91
|
async handleBrightnessGet() {
|
|
92
|
+
this.assertAvailable(this.hasBrightness);
|
|
59
93
|
return this.brightness;
|
|
60
94
|
}
|
|
61
95
|
async handleBrightnessSet(value) {
|
|
96
|
+
this.assertAvailable(this.hasBrightness);
|
|
62
97
|
this.platform.log.debug(`Publishing ${this.context.topic}/set/brightness = ${value.toString()}`);
|
|
63
|
-
this.platform.
|
|
64
|
-
}
|
|
65
|
-
updateFault() {
|
|
66
|
-
const fault = this.connected && !this.overcurrent ? 0 : 1;
|
|
67
|
-
this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, fault);
|
|
98
|
+
await this.platform.publishCommandAsync(`${this.context.topic}/set/brightness`, value.toString());
|
|
68
99
|
}
|
|
69
100
|
clearUpdateTimer() {
|
|
70
101
|
if (this.updateTimer) {
|
|
@@ -72,6 +103,11 @@ class DimmerAccessory {
|
|
|
72
103
|
this.updateTimer = undefined;
|
|
73
104
|
}
|
|
74
105
|
}
|
|
106
|
+
assertAvailable(hasValue) {
|
|
107
|
+
if (this.connected === false || !hasValue || this.overcurrent === true) {
|
|
108
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
75
111
|
}
|
|
76
112
|
exports.DimmerAccessory = DimmerAccessory;
|
|
77
113
|
//# sourceMappingURL=DimmerAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DimmerAccessory.js","sourceRoot":"","sources":["../../src/Accesories/DimmerAccessory.ts"],"names":[],"mappings":";;;AAKA,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"DimmerAccessory.js","sourceRoot":"","sources":["../../src/Accesories/DimmerAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,13 @@ export declare class DimmerRgbLightAccessory {
|
|
|
11
11
|
private rgb;
|
|
12
12
|
private brightness;
|
|
13
13
|
private hasDimmerBrightness;
|
|
14
|
-
private connected
|
|
15
|
-
private overcurrent
|
|
14
|
+
private connected?;
|
|
15
|
+
private overcurrent?;
|
|
16
|
+
private hasState;
|
|
17
|
+
private hasColor;
|
|
18
|
+
private hasColorBrightness;
|
|
19
|
+
private colorWriteTimer?;
|
|
20
|
+
private colorWriteWaiters;
|
|
16
21
|
constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
|
|
17
22
|
handleOnGet(): Promise<CharacteristicValue>;
|
|
18
23
|
handleOnSet(value: CharacteristicValue): Promise<void>;
|
|
@@ -23,6 +28,9 @@ export declare class DimmerRgbLightAccessory {
|
|
|
23
28
|
handleSaturationGet(): Promise<CharacteristicValue>;
|
|
24
29
|
handleSaturationSet(value: CharacteristicValue): Promise<void>;
|
|
25
30
|
private updateColor;
|
|
26
|
-
private
|
|
31
|
+
private queueColorWrite;
|
|
32
|
+
private flushColorWrite;
|
|
33
|
+
private communicationError;
|
|
34
|
+
private assertAvailable;
|
|
27
35
|
}
|
|
28
36
|
//# sourceMappingURL=DimmerRgbLightAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DimmerRgbLightAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/DimmerRgbLightAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,uBAAuB;
|
|
1
|
+
{"version":3,"file":"DimmerRgbLightAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/DimmerRgbLightAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,uBAAuB;IAgBhC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjB1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,iBAAiB,CAAoE;gBAG1E,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IA2JzC,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAK3C,WAAW,CAAC,KAAK,EAAE,mBAAmB;IAWtC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAOnD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAyB9C,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAK5C,YAAY,CAAC,KAAK,EAAE,mBAAmB;IAYvC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKnD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAYpD,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,eAAe;YAcT,eAAe;IAiB7B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,eAAe;CAKxB"}
|