zigbee-herdsman-converters 25.48.0 → 25.50.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 +43 -0
- package/dist/converters/toZigbee.d.ts.map +1 -1
- package/dist/converters/toZigbee.js +22 -8
- package/dist/converters/toZigbee.js.map +1 -1
- package/dist/devices/bosch.d.ts.map +1 -1
- package/dist/devices/bosch.js +6 -121
- package/dist/devices/bosch.js.map +1 -1
- package/dist/devices/heiman.d.ts.map +1 -1
- package/dist/devices/heiman.js +13 -0
- package/dist/devices/heiman.js.map +1 -1
- package/dist/devices/innr.d.ts.map +1 -1
- package/dist/devices/innr.js +8 -0
- package/dist/devices/innr.js.map +1 -1
- package/dist/devices/ledvance.d.ts.map +1 -1
- package/dist/devices/ledvance.js +7 -0
- package/dist/devices/ledvance.js.map +1 -1
- package/dist/devices/lincukoo.d.ts.map +1 -1
- package/dist/devices/lincukoo.js +7 -0
- package/dist/devices/lincukoo.js.map +1 -1
- package/dist/devices/multir.d.ts.map +1 -1
- package/dist/devices/multir.js +14 -2
- package/dist/devices/multir.js.map +1 -1
- package/dist/devices/philips.d.ts.map +1 -1
- package/dist/devices/philips.js +14 -0
- package/dist/devices/philips.js.map +1 -1
- package/dist/devices/salus_controls.d.ts.map +1 -1
- package/dist/devices/salus_controls.js +2 -1
- package/dist/devices/salus_controls.js.map +1 -1
- package/dist/devices/shelly.d.ts.map +1 -1
- package/dist/devices/shelly.js +44 -8
- package/dist/devices/shelly.js.map +1 -1
- package/dist/devices/tuya.d.ts.map +1 -1
- package/dist/devices/tuya.js +70 -6
- package/dist/devices/tuya.js.map +1 -1
- package/dist/lib/bosch.d.ts +20 -1
- package/dist/lib/bosch.d.ts.map +1 -1
- package/dist/lib/bosch.js +207 -27
- package/dist/lib/bosch.js.map +1 -1
- package/dist/lib/heiman.d.ts +9 -0
- package/dist/lib/heiman.d.ts.map +1 -0
- package/dist/lib/heiman.js +198 -0
- package/dist/lib/heiman.js.map +1 -0
- package/dist/lib/tuya.d.ts +1 -1
- package/dist/lib/tuya.d.ts.map +1 -1
- package/dist/lib/tuya.js +8 -2
- package/dist/lib/tuya.js.map +1 -1
- package/dist/models-index.json +1 -1
- package/package.json +1 -1
package/dist/lib/bosch.d.ts
CHANGED
|
@@ -48,7 +48,10 @@ export declare const boschGeneralSensorDeviceExtend: {
|
|
|
48
48
|
customIasZoneCluster: () => ModernExtend;
|
|
49
49
|
testMode: (args: {
|
|
50
50
|
testModeDescription: string;
|
|
51
|
-
|
|
51
|
+
sensitivityLevelToUse: number;
|
|
52
|
+
variableTimeoutSupported?: boolean;
|
|
53
|
+
defaultTimeout?: number;
|
|
54
|
+
zoneStatusBit?: number;
|
|
52
55
|
}) => ModernExtend;
|
|
53
56
|
};
|
|
54
57
|
export interface BoschBmctCluster extends BoschGeneralEnergyDeviceCluster {
|
|
@@ -230,6 +233,22 @@ export declare const boschWaterAlarmExtend: {
|
|
|
230
233
|
alarmOnMotion: () => ModernExtend;
|
|
231
234
|
testMode: () => ModernExtend;
|
|
232
235
|
};
|
|
236
|
+
export declare const boschSmokeAlarmExtend: {
|
|
237
|
+
/** In previous implementations, the user was able to change the
|
|
238
|
+
* sensitivity level of the smoke detector. That is not supported
|
|
239
|
+
* when using the Bosch Smart Home Controller II. As the previous
|
|
240
|
+
* creator assumed that Bosch follows the ZCL specification for
|
|
241
|
+
* the sensitivity level (which isn't the case), this may result
|
|
242
|
+
* in an unintentionally lowered sensitivity level. Therefore,
|
|
243
|
+
* we set the manufacturer's default value here once to reverse
|
|
244
|
+
* any previous modifications for safety reasons, as we talk
|
|
245
|
+
* about a device that should save lives... */
|
|
246
|
+
enforceDefaultSensitivityLevel: () => ModernExtend;
|
|
247
|
+
smokeAlarmAndButtonPushes: () => ModernExtend;
|
|
248
|
+
alarmControl: () => ModernExtend;
|
|
249
|
+
testMode: () => ModernExtend;
|
|
250
|
+
battery: () => ModernExtend;
|
|
251
|
+
};
|
|
233
252
|
export declare const boschSmartPlugExtend: {
|
|
234
253
|
smartPlugCluster: () => ModernExtend;
|
|
235
254
|
onOff: () => ModernExtend;
|
package/dist/lib/bosch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bosch.d.ts","sourceRoot":"","sources":["../../src/lib/bosch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"bosch.d.ts","sourceRoot":"","sources":["../../src/lib/bosch.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/bosch.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.boschThermostatExtend = exports.boschSmartPlugExtend = exports.boschWaterAlarmExtend = exports.boschBsenExtend = exports.boschDoorWindowContactExtend = exports.boschBsirExtend = exports.boschBmctExtend = exports.boschGeneralSensorDeviceExtend = exports.boschGeneralEnergyDeviceExtend = exports.boschGeneralExtend = exports.manufacturerOptions = void 0;
|
|
36
|
+
exports.boschThermostatExtend = exports.boschSmartPlugExtend = exports.boschSmokeAlarmExtend = exports.boschWaterAlarmExtend = exports.boschBsenExtend = exports.boschDoorWindowContactExtend = exports.boschBsirExtend = exports.boschBmctExtend = exports.boschGeneralSensorDeviceExtend = exports.boschGeneralEnergyDeviceExtend = exports.boschGeneralExtend = exports.manufacturerOptions = void 0;
|
|
37
37
|
const zigbee_herdsman_1 = require("zigbee-herdsman");
|
|
38
38
|
const fz = __importStar(require("../converters/fromZigbee"));
|
|
39
39
|
const tz = __importStar(require("../converters/toZigbee"));
|
|
@@ -42,6 +42,7 @@ const m = __importStar(require("../lib/modernExtend"));
|
|
|
42
42
|
const constants_1 = require("./constants");
|
|
43
43
|
const logger_1 = require("./logger");
|
|
44
44
|
const reporting_1 = require("./reporting");
|
|
45
|
+
const globalStore = __importStar(require("./store"));
|
|
45
46
|
const utils = __importStar(require("./utils"));
|
|
46
47
|
const utils_1 = require("./utils");
|
|
47
48
|
const e = exposes.presets;
|
|
@@ -278,29 +279,38 @@ exports.boschGeneralEnergyDeviceExtend = {
|
|
|
278
279
|
exports.boschGeneralSensorDeviceExtend = {
|
|
279
280
|
customIasZoneCluster: () => m.deviceAddCustomCluster("ssIasZone", {
|
|
280
281
|
ID: zigbee_herdsman_1.Zcl.Clusters.ssIasZone.ID,
|
|
281
|
-
attributes: {
|
|
282
|
+
attributes: {
|
|
283
|
+
unknownAttribute1: { ID: 0x8f01, type: zigbee_herdsman_1.Zcl.DataType.UINT8, manufacturerCode: exports.manufacturerOptions.manufacturerCode },
|
|
284
|
+
unknownAttribute2: { ID: 0x8f06, type: zigbee_herdsman_1.Zcl.DataType.UINT8, manufacturerCode: exports.manufacturerOptions.manufacturerCode },
|
|
285
|
+
},
|
|
282
286
|
commands: {
|
|
283
|
-
|
|
287
|
+
initiateTestMode: {
|
|
284
288
|
ID: 0x02,
|
|
285
289
|
parameters: [
|
|
286
|
-
{ name: "
|
|
287
|
-
{ name: "
|
|
290
|
+
{ name: "testModeDuration", type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
|
|
291
|
+
{ name: "currentZoneSensitivityLevel", type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
292
|
+
],
|
|
293
|
+
},
|
|
294
|
+
alarmControl: {
|
|
295
|
+
ID: 0x80,
|
|
296
|
+
parameters: [
|
|
297
|
+
{ name: "alarmMode", type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
298
|
+
{ name: "alarmTimeout", type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
|
|
288
299
|
],
|
|
289
300
|
},
|
|
290
301
|
},
|
|
291
302
|
commandsResponse: {},
|
|
292
303
|
}),
|
|
293
304
|
testMode: (args) => {
|
|
294
|
-
const { testModeDescription,
|
|
305
|
+
const { testModeDescription, sensitivityLevelToUse, variableTimeoutSupported = false, defaultTimeout = 0, zoneStatusBit = 8 } = args;
|
|
295
306
|
const testModeLookup = {
|
|
296
307
|
ON: true,
|
|
297
308
|
OFF: false,
|
|
298
309
|
};
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
reportTestInZoneStatus: 0x80,
|
|
310
|
+
const enableTestMode = async (endpoint, sensitivityLevelToUse, timeoutInSeconds) => {
|
|
311
|
+
await endpoint.command("ssIasZone", "initiateTestMode", {
|
|
312
|
+
testModeDuration: timeoutInSeconds,
|
|
313
|
+
currentZoneSensitivityLevel: sensitivityLevelToUse,
|
|
304
314
|
});
|
|
305
315
|
};
|
|
306
316
|
const disableTestMode = async (endpoint) => {
|
|
@@ -312,7 +322,7 @@ exports.boschGeneralSensorDeviceExtend = {
|
|
|
312
322
|
.withDescription(testModeDescription)
|
|
313
323
|
.withCategory("config"),
|
|
314
324
|
];
|
|
315
|
-
if (
|
|
325
|
+
if (variableTimeoutSupported) {
|
|
316
326
|
exposes.push(e
|
|
317
327
|
.numeric("test_mode_timeout", ea.ALL)
|
|
318
328
|
.withDescription(`Determines how long the test mode should be activated. The default length is ${defaultTimeout} seconds.`)
|
|
@@ -331,7 +341,7 @@ exports.boschGeneralSensorDeviceExtend = {
|
|
|
331
341
|
return;
|
|
332
342
|
}
|
|
333
343
|
const result = {};
|
|
334
|
-
const testModeEnabled = (zoneStatus & (1 <<
|
|
344
|
+
const testModeEnabled = (zoneStatus & (1 << zoneStatusBit)) > 0;
|
|
335
345
|
result.test_mode = utils.getFromLookupByValue(testModeEnabled, testModeLookup);
|
|
336
346
|
return result;
|
|
337
347
|
},
|
|
@@ -343,21 +353,16 @@ exports.boschGeneralSensorDeviceExtend = {
|
|
|
343
353
|
convertSet: async (entity, key, value, meta) => {
|
|
344
354
|
if (key === "test_mode") {
|
|
345
355
|
if (value === utils.getFromLookupByValue(true, testModeLookup)) {
|
|
346
|
-
let
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
meta.publish({ test_mode_timeout: timeout });
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
timeout = utils.toNumber(currentTimeout);
|
|
355
|
-
}
|
|
356
|
+
let timeoutInSeconds;
|
|
357
|
+
const currentTimeout = meta.state.test_mode_timeout;
|
|
358
|
+
if (currentTimeout == null) {
|
|
359
|
+
timeoutInSeconds = defaultTimeout;
|
|
360
|
+
meta.publish({ test_mode_timeout: timeoutInSeconds });
|
|
356
361
|
}
|
|
357
362
|
else {
|
|
358
|
-
|
|
363
|
+
timeoutInSeconds = utils.toNumber(currentTimeout);
|
|
359
364
|
}
|
|
360
|
-
await enableTestMode(entity,
|
|
365
|
+
await enableTestMode(entity, sensitivityLevelToUse, timeoutInSeconds);
|
|
361
366
|
}
|
|
362
367
|
else {
|
|
363
368
|
await disableTestMode(entity);
|
|
@@ -372,7 +377,7 @@ exports.boschGeneralSensorDeviceExtend = {
|
|
|
372
377
|
await entity.read("ssIasZone", ["zoneStatus"]);
|
|
373
378
|
}
|
|
374
379
|
if (key === "test_mode_timeout" && meta.state.test_mode_timeout == null) {
|
|
375
|
-
meta.publish({ test_mode_timeout:
|
|
380
|
+
meta.publish({ test_mode_timeout: defaultTimeout });
|
|
376
381
|
}
|
|
377
382
|
},
|
|
378
383
|
},
|
|
@@ -1825,6 +1830,7 @@ exports.boschBsenExtend = {
|
|
|
1825
1830
|
testModeDescription: "Activates the test mode. In this mode, the device blinks on every detected motion " +
|
|
1826
1831
|
"without any wait time in between to verify the installation. Please keep in mind " +
|
|
1827
1832
|
"that it can take up to 45 seconds for the test mode to be activated.",
|
|
1833
|
+
sensitivityLevelToUse: 0x80,
|
|
1828
1834
|
}),
|
|
1829
1835
|
illuminance: () => m.illuminance({ reporting: { min: "1_SECOND", max: 600, change: 3522 } }),
|
|
1830
1836
|
// The temperature sensor isn't used at all by Bosch on the BSEN-M.
|
|
@@ -2111,8 +2117,182 @@ exports.boschWaterAlarmExtend = {
|
|
|
2111
2117
|
testModeDescription: "Activates the test mode. In this mode, the device acts like it would when " +
|
|
2112
2118
|
"detecting any water to verify the installation. Please keep in mind " +
|
|
2113
2119
|
"that it can take up to 10 seconds for the test mode to be activated.",
|
|
2114
|
-
|
|
2120
|
+
sensitivityLevelToUse: 0x00,
|
|
2121
|
+
variableTimeoutSupported: true,
|
|
2122
|
+
defaultTimeout: 3,
|
|
2123
|
+
}),
|
|
2124
|
+
};
|
|
2125
|
+
//endregion
|
|
2126
|
+
//region Bosch BSD-2 (Smoke alarm II)
|
|
2127
|
+
exports.boschSmokeAlarmExtend = {
|
|
2128
|
+
/** In previous implementations, the user was able to change the
|
|
2129
|
+
* sensitivity level of the smoke detector. That is not supported
|
|
2130
|
+
* when using the Bosch Smart Home Controller II. As the previous
|
|
2131
|
+
* creator assumed that Bosch follows the ZCL specification for
|
|
2132
|
+
* the sensitivity level (which isn't the case), this may result
|
|
2133
|
+
* in an unintentionally lowered sensitivity level. Therefore,
|
|
2134
|
+
* we set the manufacturer's default value here once to reverse
|
|
2135
|
+
* any previous modifications for safety reasons, as we talk
|
|
2136
|
+
* about a device that should save lives... */
|
|
2137
|
+
enforceDefaultSensitivityLevel: () => {
|
|
2138
|
+
const onEvent = [
|
|
2139
|
+
async (event) => {
|
|
2140
|
+
if (event.type !== "start") {
|
|
2141
|
+
return;
|
|
2142
|
+
}
|
|
2143
|
+
const device = event.data.device;
|
|
2144
|
+
if (device.meta.enforceDefaultSensitivityLevelApplied !== true) {
|
|
2145
|
+
const endpoint = device.getEndpoint(1);
|
|
2146
|
+
await endpoint.write("ssIasZone", { currentZoneSensitivityLevel: 0x00 });
|
|
2147
|
+
device.meta.enforceDefaultSensitivityLevelApplied = true;
|
|
2148
|
+
}
|
|
2149
|
+
},
|
|
2150
|
+
];
|
|
2151
|
+
return {
|
|
2152
|
+
onEvent,
|
|
2153
|
+
isModernExtend: true,
|
|
2154
|
+
};
|
|
2155
|
+
},
|
|
2156
|
+
smokeAlarmAndButtonPushes: () => m.iasZoneAlarm({
|
|
2157
|
+
zoneType: "smoke",
|
|
2158
|
+
zoneAttributes: ["alarm_1"],
|
|
2159
|
+
manufacturerZoneAttributes: [
|
|
2160
|
+
{
|
|
2161
|
+
bit: 11,
|
|
2162
|
+
name: "smoke_alarm_silenced",
|
|
2163
|
+
valueOn: true,
|
|
2164
|
+
valueOff: false,
|
|
2165
|
+
description: "Indicates whether an smoke alarm was silenced on the device itself for 10 minutes. " +
|
|
2166
|
+
"Please keep in mind that the smoke detection is being disabled during that " +
|
|
2167
|
+
"time period as well.",
|
|
2168
|
+
entityCategory: "diagnostic",
|
|
2169
|
+
},
|
|
2170
|
+
{
|
|
2171
|
+
bit: 8,
|
|
2172
|
+
name: "button_pushed",
|
|
2173
|
+
valueOn: true,
|
|
2174
|
+
valueOff: false,
|
|
2175
|
+
description: "Indicates whether the button on the device is being pushed for at least " +
|
|
2176
|
+
"3 seconds (e.g., to trigger a test alarm or silence a smoke alarm)",
|
|
2177
|
+
entityCategory: "diagnostic",
|
|
2178
|
+
},
|
|
2179
|
+
],
|
|
2180
|
+
}),
|
|
2181
|
+
alarmControl: () => {
|
|
2182
|
+
const alarmModeLookup = {
|
|
2183
|
+
manual_smoke_alarm: 0x00,
|
|
2184
|
+
manual_burglar_alarm: 0x01,
|
|
2185
|
+
};
|
|
2186
|
+
const onOffLookup = {
|
|
2187
|
+
OFF: false,
|
|
2188
|
+
ON: true,
|
|
2189
|
+
};
|
|
2190
|
+
const defaultBroadcastAlarms = true;
|
|
2191
|
+
function setDefaultBroadcastAlarms(meta) {
|
|
2192
|
+
const newBroadcastStatus = utils.getFromLookupByValue(defaultBroadcastAlarms, onOffLookup);
|
|
2193
|
+
meta.publish({ broadcast_alarms: newBroadcastStatus });
|
|
2194
|
+
}
|
|
2195
|
+
async function sendAlarmControlMessage(endpoint, broadcastAlarm, alarmMode, timeoutInSeconds) {
|
|
2196
|
+
if (broadcastAlarm === true) {
|
|
2197
|
+
// Bosch sends broadcast messages two times with 4 seconds in between to
|
|
2198
|
+
// ensure all sleepy devices receive them. We mimic the same pattern here.
|
|
2199
|
+
for (let index = 0; index < 2; index++) {
|
|
2200
|
+
await endpoint.zclCommandBroadcast(255, zigbee_herdsman_1.ZSpec.BroadcastAddress.SLEEPY, "ssIasZone", "alarmControl", { alarmMode: alarmMode, alarmTimeout: timeoutInSeconds }, exports.manufacturerOptions);
|
|
2201
|
+
await (0, utils_1.sleep)(4000);
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2204
|
+
else {
|
|
2205
|
+
await endpoint.command("ssIasZone", "alarmControl", { alarmMode: alarmMode, alarmTimeout: timeoutInSeconds }, exports.manufacturerOptions);
|
|
2206
|
+
}
|
|
2207
|
+
}
|
|
2208
|
+
const exposes = [
|
|
2209
|
+
e
|
|
2210
|
+
.binary("manual_smoke_alarm", ea.ALL, utils.getFromLookupByValue(true, onOffLookup), utils.getFromLookupByValue(false, onOffLookup))
|
|
2211
|
+
.withDescription("Indicates whether the smoke alarm siren is being manually activated on the device"),
|
|
2212
|
+
e
|
|
2213
|
+
.binary("manual_burglar_alarm", ea.ALL, utils.getFromLookupByValue(true, onOffLookup), utils.getFromLookupByValue(false, onOffLookup))
|
|
2214
|
+
.withDescription("Indicates whether the burglar alarm siren is being manually activated on the device"),
|
|
2215
|
+
e
|
|
2216
|
+
.binary("broadcast_alarms", ea.ALL, utils.getFromLookupByValue(true, onOffLookup), utils.getFromLookupByValue(false, onOffLookup))
|
|
2217
|
+
.withLabel("Broadcast alarms")
|
|
2218
|
+
.withDescription("Broadcast manual alarm state changes to all BSD-2 devices on the network. Please keep in mind " +
|
|
2219
|
+
"that a detected smoke alarm is not being transmitted automatically to other devices. " +
|
|
2220
|
+
"To achieve that, you must set up an automation, e.g., in Home Assistant.")
|
|
2221
|
+
.withCategory("config"),
|
|
2222
|
+
];
|
|
2223
|
+
const fromZigbee = [
|
|
2224
|
+
{
|
|
2225
|
+
cluster: "ssIasZone",
|
|
2226
|
+
type: ["commandStatusChangeNotification", "attributeReport", "readResponse"],
|
|
2227
|
+
convert: (model, msg, publish, options, meta) => {
|
|
2228
|
+
const zoneStatus = "zonestatus" in msg.data ? msg.data.zonestatus : msg.data.zoneStatus;
|
|
2229
|
+
if (zoneStatus === undefined) {
|
|
2230
|
+
return;
|
|
2231
|
+
}
|
|
2232
|
+
const result = {};
|
|
2233
|
+
const smokeAlarmEnabled = (zoneStatus & (1 << 1)) > 0;
|
|
2234
|
+
result.manual_smoke_alarm = utils.getFromLookupByValue(smokeAlarmEnabled, onOffLookup);
|
|
2235
|
+
const burglarAlarmEnabled = (zoneStatus & (1 << 7)) > 0;
|
|
2236
|
+
result.manual_burglar_alarm = utils.getFromLookupByValue(burglarAlarmEnabled, onOffLookup);
|
|
2237
|
+
return result;
|
|
2238
|
+
},
|
|
2239
|
+
},
|
|
2240
|
+
];
|
|
2241
|
+
const toZigbee = [
|
|
2242
|
+
{
|
|
2243
|
+
key: ["manual_smoke_alarm", "manual_burglar_alarm", "broadcast_alarms"],
|
|
2244
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2245
|
+
if (key === "manual_smoke_alarm" || key === "manual_burglar_alarm") {
|
|
2246
|
+
let broadcastAlarm;
|
|
2247
|
+
try {
|
|
2248
|
+
broadcastAlarm = utils.getFromLookup(meta.state.broadcast_alarms, onOffLookup);
|
|
2249
|
+
}
|
|
2250
|
+
catch {
|
|
2251
|
+
setDefaultBroadcastAlarms(meta);
|
|
2252
|
+
broadcastAlarm = defaultBroadcastAlarms;
|
|
2253
|
+
}
|
|
2254
|
+
const alarmMode = utils.getFromLookup(key, alarmModeLookup);
|
|
2255
|
+
const enableAlarm = utils.getFromLookup(value, onOffLookup);
|
|
2256
|
+
const timeoutInSeconds = enableAlarm ? 0xf0 : 0;
|
|
2257
|
+
utils.assertEndpoint(entity);
|
|
2258
|
+
await sendAlarmControlMessage(entity, broadcastAlarm, alarmMode, timeoutInSeconds);
|
|
2259
|
+
clearTimeout(globalStore.getValue("boschSmokeAlarm", "alarmTimer"));
|
|
2260
|
+
if (enableAlarm) {
|
|
2261
|
+
const alarmTimer = setTimeout(async () => await sendAlarmControlMessage(entity, broadcastAlarm, alarmMode, timeoutInSeconds), (timeoutInSeconds - 60) * 1000);
|
|
2262
|
+
globalStore.putValue("boschSmokeAlarm", "alarmTimer", alarmTimer);
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
if (key === "broadcast_alarms") {
|
|
2266
|
+
return { state: { broadcast_alarms: value } };
|
|
2267
|
+
}
|
|
2268
|
+
},
|
|
2269
|
+
convertGet: async (entity, key, meta) => {
|
|
2270
|
+
if (key === "manual_smoke_alarm" || key === "manual_burglar_alarm") {
|
|
2271
|
+
await entity.read("ssIasZone", ["zoneStatus"]);
|
|
2272
|
+
}
|
|
2273
|
+
if (key === "broadcast_alarms" && meta.state[key] === undefined) {
|
|
2274
|
+
setDefaultBroadcastAlarms(meta);
|
|
2275
|
+
}
|
|
2276
|
+
},
|
|
2277
|
+
},
|
|
2278
|
+
];
|
|
2279
|
+
return {
|
|
2280
|
+
exposes,
|
|
2281
|
+
fromZigbee,
|
|
2282
|
+
toZigbee,
|
|
2283
|
+
isModernExtend: true,
|
|
2284
|
+
};
|
|
2285
|
+
},
|
|
2286
|
+
testMode: () => exports.boschGeneralSensorDeviceExtend.testMode({
|
|
2287
|
+
testModeDescription: "Check the function of the smoke alarm. Pay attention to the alarm sound " +
|
|
2288
|
+
"and the flashing of the alarm LED. Please keep in mind that it can take " +
|
|
2289
|
+
"up to 10 seconds for the test mode to be activated.",
|
|
2290
|
+
sensitivityLevelToUse: 0x00,
|
|
2291
|
+
variableTimeoutSupported: true,
|
|
2292
|
+
defaultTimeout: 5,
|
|
2293
|
+
zoneStatusBit: 10,
|
|
2115
2294
|
}),
|
|
2295
|
+
battery: () => exports.boschGeneralExtend.batteryWithPercentageAndLowStatus({ percentageReportingConfig: { min: "MIN", max: "MAX", change: 1 } }),
|
|
2116
2296
|
};
|
|
2117
2297
|
exports.boschSmartPlugExtend = {
|
|
2118
2298
|
smartPlugCluster: () => m.deviceAddCustomCluster("boschEnergyDevice", {
|