zigbee-herdsman-converters 25.2.0 → 25.4.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 +37 -0
- package/dist/converters/fromZigbee.d.ts.map +1 -1
- package/dist/converters/fromZigbee.js +5 -3
- package/dist/converters/fromZigbee.js.map +1 -1
- package/dist/converters/toZigbee.d.ts.map +1 -1
- package/dist/converters/toZigbee.js +137 -150
- package/dist/converters/toZigbee.js.map +1 -1
- package/dist/devices/amina.d.ts.map +1 -1
- package/dist/devices/amina.js +7 -37
- package/dist/devices/amina.js.map +1 -1
- package/dist/devices/aurora_lighting.d.ts.map +1 -1
- package/dist/devices/aurora_lighting.js +1 -0
- package/dist/devices/aurora_lighting.js.map +1 -1
- package/dist/devices/bacchus.d.ts.map +1 -1
- package/dist/devices/bacchus.js +6 -2
- package/dist/devices/bacchus.js.map +1 -1
- package/dist/devices/bitron.js +1 -1
- package/dist/devices/bitron.js.map +1 -1
- package/dist/devices/bosch.d.ts.map +1 -1
- package/dist/devices/bosch.js +38 -25
- package/dist/devices/bosch.js.map +1 -1
- package/dist/devices/centralite.js.map +1 -1
- package/dist/devices/ctm.js.map +1 -1
- package/dist/devices/custom_devices_diy.d.ts.map +1 -1
- package/dist/devices/custom_devices_diy.js +2 -3
- package/dist/devices/custom_devices_diy.js.map +1 -1
- package/dist/devices/danfoss.d.ts.map +1 -1
- package/dist/devices/danfoss.js +2 -9
- package/dist/devices/danfoss.js.map +1 -1
- package/dist/devices/dawon_dns.js.map +1 -1
- package/dist/devices/develco.d.ts.map +1 -1
- package/dist/devices/develco.js.map +1 -1
- package/dist/devices/diyruz.js.map +1 -1
- package/dist/devices/ewelink.d.ts.map +1 -1
- package/dist/devices/ewelink.js +1 -5
- package/dist/devices/ewelink.js.map +1 -1
- package/dist/devices/gmmts.d.ts.map +1 -1
- package/dist/devices/gmmts.js +15 -5
- package/dist/devices/gmmts.js.map +1 -1
- package/dist/devices/heiman.d.ts.map +1 -1
- package/dist/devices/heiman.js +5 -1
- package/dist/devices/heiman.js.map +1 -1
- package/dist/devices/hive.d.ts.map +1 -1
- package/dist/devices/hive.js +48 -0
- package/dist/devices/hive.js.map +1 -1
- package/dist/devices/ikea.js +1 -1
- package/dist/devices/ikea.js.map +1 -1
- package/dist/devices/imhotepcreation.js.map +1 -1
- package/dist/devices/immax.js.map +1 -1
- package/dist/devices/index.d.ts.map +1 -1
- package/dist/devices/index.js +2 -0
- package/dist/devices/index.js.map +1 -1
- package/dist/devices/inovelli.d.ts.map +1 -1
- package/dist/devices/inovelli.js +6 -7
- package/dist/devices/inovelli.js.map +1 -1
- package/dist/devices/keen_home.js.map +1 -1
- package/dist/devices/kmpcil.js.map +1 -1
- package/dist/devices/legrand.d.ts.map +1 -1
- package/dist/devices/legrand.js +2 -0
- package/dist/devices/legrand.js.map +1 -1
- package/dist/devices/lincukoo.d.ts.map +1 -1
- package/dist/devices/lincukoo.js +77 -1
- package/dist/devices/lincukoo.js.map +1 -1
- package/dist/devices/livolo.d.ts.map +1 -1
- package/dist/devices/livolo.js.map +1 -1
- package/dist/devices/lixee.d.ts.map +1 -1
- package/dist/devices/lixee.js +9 -4
- package/dist/devices/lixee.js.map +1 -1
- package/dist/devices/lytko.d.ts.map +1 -1
- package/dist/devices/lytko.js +12 -10
- package/dist/devices/lytko.js.map +1 -1
- package/dist/devices/moes.js.map +1 -1
- package/dist/devices/niko.d.ts.map +1 -1
- package/dist/devices/niko.js +23 -7
- package/dist/devices/niko.js.map +1 -1
- package/dist/devices/nodon.js.map +1 -1
- package/dist/devices/onokom.d.ts +3 -0
- package/dist/devices/onokom.d.ts.map +1 -0
- package/dist/devices/onokom.js +2127 -0
- package/dist/devices/onokom.js.map +1 -0
- package/dist/devices/orvibo.d.ts.map +1 -1
- package/dist/devices/orvibo.js +9 -3
- package/dist/devices/orvibo.js.map +1 -1
- package/dist/devices/owon.d.ts.map +1 -1
- package/dist/devices/owon.js +2 -3
- package/dist/devices/owon.js.map +1 -1
- package/dist/devices/perenio.d.ts.map +1 -1
- package/dist/devices/perenio.js +1 -1
- package/dist/devices/perenio.js.map +1 -1
- package/dist/devices/pushok.js.map +1 -1
- package/dist/devices/qa.js.map +1 -1
- package/dist/devices/salus_controls.d.ts.map +1 -1
- package/dist/devices/salus_controls.js.map +1 -1
- package/dist/devices/sber.d.ts.map +1 -1
- package/dist/devices/sber.js +12 -8
- package/dist/devices/sber.js.map +1 -1
- package/dist/devices/schneider_electric.d.ts.map +1 -1
- package/dist/devices/schneider_electric.js +14 -6
- package/dist/devices/schneider_electric.js.map +1 -1
- package/dist/devices/sengled.d.ts.map +1 -1
- package/dist/devices/sengled.js.map +1 -1
- package/dist/devices/shinasystem.js +4 -4
- package/dist/devices/shinasystem.js.map +1 -1
- package/dist/devices/siglis.js +10 -10
- package/dist/devices/siglis.js.map +1 -1
- package/dist/devices/simpla_home.d.ts +1 -5
- package/dist/devices/simpla_home.d.ts.map +1 -1
- package/dist/devices/simpla_home.js +24 -41
- package/dist/devices/simpla_home.js.map +1 -1
- package/dist/devices/sinope.js.map +1 -1
- package/dist/devices/slacky_diy.d.ts.map +1 -1
- package/dist/devices/slacky_diy.js +21 -19
- package/dist/devices/slacky_diy.js.map +1 -1
- package/dist/devices/smartthings.js.map +1 -1
- package/dist/devices/sonoff.d.ts +29 -0
- package/dist/devices/sonoff.d.ts.map +1 -1
- package/dist/devices/sonoff.js +16 -15
- package/dist/devices/sonoff.js.map +1 -1
- package/dist/devices/sunricher.d.ts +15 -0
- package/dist/devices/sunricher.d.ts.map +1 -1
- package/dist/devices/sunricher.js +3 -3
- package/dist/devices/sunricher.js.map +1 -1
- package/dist/devices/tubeszb.js.map +1 -1
- package/dist/devices/tuya.d.ts.map +1 -1
- package/dist/devices/tuya.js +80 -16
- package/dist/devices/tuya.js.map +1 -1
- package/dist/devices/ubisys.d.ts.map +1 -1
- package/dist/devices/ubisys.js +4 -7
- package/dist/devices/ubisys.js.map +1 -1
- package/dist/devices/wirenboard.d.ts.map +1 -1
- package/dist/devices/wirenboard.js +5 -3
- package/dist/devices/wirenboard.js.map +1 -1
- package/dist/devices/woox.js +1 -1
- package/dist/devices/woox.js.map +1 -1
- package/dist/devices/xyzroe.d.ts.map +1 -1
- package/dist/devices/xyzroe.js +3 -5
- package/dist/devices/xyzroe.js.map +1 -1
- package/dist/devices/yandex.d.ts.map +1 -1
- package/dist/devices/yandex.js +18 -6
- package/dist/devices/yandex.js.map +1 -1
- package/dist/devices/yokis.d.ts.map +1 -1
- package/dist/devices/yokis.js +4 -6
- package/dist/devices/yokis.js.map +1 -1
- package/dist/devices/zemismart.d.ts.map +1 -1
- package/dist/devices/zemismart.js +2 -1
- package/dist/devices/zemismart.js.map +1 -1
- package/dist/lib/color.js +7 -7
- package/dist/lib/color.js.map +1 -1
- package/dist/lib/develco.d.ts +24 -5
- package/dist/lib/develco.d.ts.map +1 -1
- package/dist/lib/develco.js +2 -2
- package/dist/lib/develco.js.map +1 -1
- package/dist/lib/ewelink.d.ts +4 -4
- package/dist/lib/ewelink.d.ts.map +1 -1
- package/dist/lib/ewelink.js.map +1 -1
- package/dist/lib/exposes.d.ts.map +1 -1
- package/dist/lib/exposes.js +27 -9
- package/dist/lib/exposes.js.map +1 -1
- package/dist/lib/generateDefinition.js.map +1 -1
- package/dist/lib/ikea.d.ts +30 -1
- package/dist/lib/ikea.d.ts.map +1 -1
- package/dist/lib/ikea.js +9 -4
- package/dist/lib/ikea.js.map +1 -1
- package/dist/lib/kelvinToXy.js +1 -1
- package/dist/lib/kelvinToXy.js.map +1 -1
- package/dist/lib/legacy.d.ts +33 -1
- package/dist/lib/legacy.d.ts.map +1 -1
- package/dist/lib/legacy.js +78 -88
- package/dist/lib/legacy.js.map +1 -1
- package/dist/lib/legrand.d.ts.map +1 -1
- package/dist/lib/legrand.js +5 -6
- package/dist/lib/legrand.js.map +1 -1
- package/dist/lib/light.d.ts +2 -1
- package/dist/lib/light.d.ts.map +1 -1
- package/dist/lib/light.js.map +1 -1
- package/dist/lib/lumi.d.ts +33 -33
- package/dist/lib/lumi.d.ts.map +1 -1
- package/dist/lib/lumi.js +17 -18
- package/dist/lib/lumi.js.map +1 -1
- package/dist/lib/modernExtend.d.ts +42 -58
- package/dist/lib/modernExtend.d.ts.map +1 -1
- package/dist/lib/modernExtend.js +90 -23
- package/dist/lib/modernExtend.js.map +1 -1
- package/dist/lib/namron.d.ts +25 -25
- package/dist/lib/namron.d.ts.map +1 -1
- package/dist/lib/namron.js +7 -8
- package/dist/lib/namron.js.map +1 -1
- package/dist/lib/nodon.d.ts.map +1 -1
- package/dist/lib/nodon.js.map +1 -1
- package/dist/lib/philips.d.ts.map +1 -1
- package/dist/lib/philips.js +9 -10
- package/dist/lib/philips.js.map +1 -1
- package/dist/lib/reporting.d.ts +4 -7
- package/dist/lib/reporting.d.ts.map +1 -1
- package/dist/lib/reporting.js.map +1 -1
- package/dist/lib/sunricher.d.ts.map +1 -1
- package/dist/lib/sunricher.js +8 -6
- package/dist/lib/sunricher.js.map +1 -1
- package/dist/lib/tuya.d.ts +4 -4
- package/dist/lib/tuya.d.ts.map +1 -1
- package/dist/lib/tuya.js +50 -48
- package/dist/lib/tuya.js.map +1 -1
- package/dist/lib/types.d.ts +2 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/ubisys.d.ts +88 -8
- package/dist/lib/ubisys.d.ts.map +1 -1
- package/dist/lib/ubisys.js +0 -3
- package/dist/lib/ubisys.js.map +1 -1
- package/dist/lib/utils.d.ts +10 -8
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +14 -7
- package/dist/lib/utils.js.map +1 -1
- package/dist/models-index.json +1 -1
- package/package.json +4 -4
|
@@ -76,7 +76,8 @@ exports.on_off = {
|
|
|
76
76
|
throw Error("The off_wait_time value must be a number!");
|
|
77
77
|
}
|
|
78
78
|
const payload = meta.converterOptions
|
|
79
|
-
?
|
|
79
|
+
? // TODO: better typing? currently used in a single place??
|
|
80
|
+
meta.converterOptions
|
|
80
81
|
: { ctrlbits: 0, ontime: Math.round(onTime * 10), offwaittime: Math.round(offWaitTime * 10) };
|
|
81
82
|
await entity.command("genOnOff", "onWithTimedOff", payload, utils.getOptions(meta.mapped, entity));
|
|
82
83
|
}
|
|
@@ -97,11 +98,9 @@ exports.light_color = {
|
|
|
97
98
|
key: ["color"],
|
|
98
99
|
options: [exposes.options.color_sync(), exposes.options.transition()],
|
|
99
100
|
convertSet: async (entity, key, value, meta) => {
|
|
100
|
-
// biome-ignore lint/suspicious/noImplicitAnyLet: ignored using `--suppress`
|
|
101
|
-
let command;
|
|
102
101
|
const newColor = libColor.Color.fromConverterArg(value);
|
|
103
102
|
const newState = {};
|
|
104
|
-
const
|
|
103
|
+
const transtime = utils.getTransition(entity, key, meta).time;
|
|
105
104
|
const supportsHueAndSaturation = utils.getMetaValue(entity, meta.mapped, "supportsHueAndSaturation", "allEqual", true);
|
|
106
105
|
const supportsEnhancedHue = utils.getMetaValue(entity, meta.mapped, "supportsEnhancedHue", "allEqual", true);
|
|
107
106
|
if (newColor.isHSV() && !supportsHueAndSaturation) {
|
|
@@ -121,57 +120,48 @@ exports.light_color = {
|
|
|
121
120
|
}
|
|
122
121
|
newState.color_mode = constants.colorModeLookup[1];
|
|
123
122
|
newState.color = xy.toObject();
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
command
|
|
123
|
+
const colorx = utils.mapNumberRange(xy.x, 0, 1, 0, 65535);
|
|
124
|
+
const colory = utils.mapNumberRange(xy.y, 0, 1, 0, 65535);
|
|
125
|
+
await entity.command("lightingColorCtrl", "moveToColor", { transtime, colorx, colory }, utils.getOptions(meta.mapped, entity));
|
|
127
126
|
}
|
|
128
127
|
else if (newColor.isHSV()) {
|
|
129
128
|
const hsv = newColor.hsv;
|
|
130
129
|
const hsvCorrected = hsv.colorCorrected(meta);
|
|
131
130
|
newState.color_mode = constants.colorModeLookup[0];
|
|
132
131
|
newState.color = hsv.toObject(false);
|
|
133
|
-
if (hsv.
|
|
134
|
-
|
|
135
|
-
zclData.enhancehue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 65535);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
zclData.hue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 254);
|
|
139
|
-
}
|
|
140
|
-
// @ts-expect-error ignore
|
|
141
|
-
zclData.direction = value.direction || 0;
|
|
142
|
-
}
|
|
143
|
-
if (hsv.saturation != null) {
|
|
144
|
-
zclData.saturation = utils.mapNumberRange(hsvCorrected.saturation, 0, 100, 0, 254);
|
|
145
|
-
}
|
|
146
|
-
if (hsv.value !== null) {
|
|
147
|
-
// fallthrough to genLevelCtrl
|
|
148
|
-
// @ts-expect-error ignore
|
|
149
|
-
value.brightness = utils.mapNumberRange(hsvCorrected.value, 0, 100, 0, 254);
|
|
132
|
+
if (hsv.value !== null && utils.isObject(value)) {
|
|
133
|
+
await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: utils.mapNumberRange(hsvCorrected.value, 0, 100, 0, 254), transtime }, utils.getOptions(meta.mapped, entity));
|
|
150
134
|
}
|
|
151
135
|
if (hsv.hue !== null && hsv.saturation !== null) {
|
|
136
|
+
const saturation = utils.mapNumberRange(hsvCorrected.saturation, 0, 100, 0, 254);
|
|
152
137
|
if (supportsEnhancedHue) {
|
|
153
|
-
|
|
138
|
+
const enhancehue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 65535);
|
|
139
|
+
await entity.command("lightingColorCtrl", "enhancedMoveToHueAndSaturation", { transtime, enhancehue, saturation }, utils.getOptions(meta.mapped, entity));
|
|
154
140
|
}
|
|
155
141
|
else {
|
|
156
|
-
|
|
142
|
+
const hue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 254);
|
|
143
|
+
await entity.command("lightingColorCtrl", "moveToHueAndSaturation", { transtime, hue, saturation }, utils.getOptions(meta.mapped, entity));
|
|
157
144
|
}
|
|
158
145
|
}
|
|
159
146
|
else if (hsv.hue !== null) {
|
|
147
|
+
const direction = value.direction || 0;
|
|
160
148
|
if (supportsEnhancedHue) {
|
|
161
|
-
|
|
149
|
+
const enhancehue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 65535);
|
|
150
|
+
await entity.command("lightingColorCtrl", "enhancedMoveToHue", { transtime, enhancehue, direction }, utils.getOptions(meta.mapped, entity));
|
|
162
151
|
}
|
|
163
152
|
else {
|
|
164
|
-
|
|
153
|
+
const hue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 254);
|
|
154
|
+
await entity.command("lightingColorCtrl", "moveToHue", { transtime, hue, direction }, utils.getOptions(meta.mapped, entity));
|
|
165
155
|
}
|
|
166
156
|
}
|
|
167
157
|
else if (hsv.saturation !== null) {
|
|
168
|
-
|
|
158
|
+
const saturation = utils.mapNumberRange(hsvCorrected.saturation, 0, 100, 0, 254);
|
|
159
|
+
await entity.command("lightingColorCtrl", "moveToSaturation", { transtime, saturation }, utils.getOptions(meta.mapped, entity));
|
|
169
160
|
}
|
|
170
161
|
}
|
|
171
|
-
|
|
172
|
-
|
|
162
|
+
else {
|
|
163
|
+
throw new Error("Invalid color");
|
|
173
164
|
}
|
|
174
|
-
await entity.command("lightingColorCtrl", command, zclData, utils.getOptions(meta.mapped, entity));
|
|
175
165
|
return { state: libColor.syncColorState(newState, meta.state, entity, meta.options) };
|
|
176
166
|
},
|
|
177
167
|
convertGet: async (entity, key, meta) => {
|
|
@@ -513,7 +503,7 @@ exports.cover_via_brightness = {
|
|
|
513
503
|
: meta.options.invert_cover;
|
|
514
504
|
utils.assertNumber(value);
|
|
515
505
|
const position = invert ? 100 - value : value;
|
|
516
|
-
await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: utils.mapNumberRange(Number(position), 0, 100, 0, 255)
|
|
506
|
+
await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: utils.mapNumberRange(Number(position), 0, 100, 0, 255), transtime: 0 }, utils.getOptions(meta.mapped, entity));
|
|
517
507
|
return { state: { position: value } };
|
|
518
508
|
},
|
|
519
509
|
convertGet: async (entity, key, meta) => {
|
|
@@ -600,11 +590,15 @@ exports.squawk = {
|
|
|
600
590
|
exports.cover_state = {
|
|
601
591
|
key: ["state"],
|
|
602
592
|
convertSet: async (entity, key, value, meta) => {
|
|
603
|
-
const lookup = {
|
|
593
|
+
const lookup = {
|
|
594
|
+
open: "upOpen",
|
|
595
|
+
close: "downClose",
|
|
596
|
+
stop: "stop",
|
|
597
|
+
on: "upOpen",
|
|
598
|
+
off: "downClose",
|
|
599
|
+
};
|
|
604
600
|
utils.assertString(value, key);
|
|
605
|
-
|
|
606
|
-
value = value.toLowerCase();
|
|
607
|
-
await entity.command("closuresWindowCovering", utils.getFromLookup(value, lookup), {}, utils.getOptions(meta.mapped, entity));
|
|
601
|
+
await entity.command("closuresWindowCovering", utils.getFromLookup(value.toLowerCase(), lookup), {}, utils.getOptions(meta.mapped, entity));
|
|
608
602
|
},
|
|
609
603
|
};
|
|
610
604
|
exports.cover_position_tilt = {
|
|
@@ -787,7 +781,14 @@ exports.level_config = {
|
|
|
787
781
|
}
|
|
788
782
|
},
|
|
789
783
|
convertGet: async (entity, key, meta) => {
|
|
790
|
-
for (const attribute of [
|
|
784
|
+
for (const attribute of [
|
|
785
|
+
"onOffTransitionTime",
|
|
786
|
+
"onTransitionTime",
|
|
787
|
+
"offTransitionTime",
|
|
788
|
+
"startUpCurrentLevel",
|
|
789
|
+
"onLevel",
|
|
790
|
+
"options",
|
|
791
|
+
]) {
|
|
791
792
|
try {
|
|
792
793
|
await entity.read("genLevelCtrl", [attribute]);
|
|
793
794
|
}
|
|
@@ -823,24 +824,23 @@ exports.ballast_config = {
|
|
|
823
824
|
convertGet: async (entity, key, meta) => {
|
|
824
825
|
let result = {};
|
|
825
826
|
for (const attrName of [
|
|
826
|
-
"
|
|
827
|
-
"
|
|
828
|
-
"
|
|
829
|
-
"
|
|
830
|
-
"
|
|
831
|
-
"
|
|
832
|
-
"
|
|
833
|
-
"
|
|
834
|
-
"
|
|
835
|
-
"
|
|
836
|
-
"
|
|
837
|
-
"
|
|
838
|
-
"
|
|
839
|
-
"
|
|
827
|
+
"ballastStatus",
|
|
828
|
+
"minLevel",
|
|
829
|
+
"maxLevel",
|
|
830
|
+
"powerOnLevel",
|
|
831
|
+
"powerOnFadeTime",
|
|
832
|
+
"intrinsicBallastFactor",
|
|
833
|
+
"ballastFactorAdjustment",
|
|
834
|
+
"lampQuantity",
|
|
835
|
+
"lampType",
|
|
836
|
+
"lampManufacturer",
|
|
837
|
+
"lampRatedHours",
|
|
838
|
+
"lampBurnHours",
|
|
839
|
+
"lampAlarmMode",
|
|
840
|
+
"lampBurnHoursTripPoint",
|
|
840
841
|
]) {
|
|
841
842
|
try {
|
|
842
|
-
|
|
843
|
-
result = { ...result, ...(await entity.read("lightingBallastCfg", [utils.toCamelCase(attrName)])) };
|
|
843
|
+
result = { ...result, ...(await entity.read("lightingBallastCfg", [attrName])) };
|
|
844
844
|
}
|
|
845
845
|
catch {
|
|
846
846
|
// continue regardless of error
|
|
@@ -932,7 +932,8 @@ exports.light_colortemp_move = {
|
|
|
932
932
|
key: ["colortemp_move", "color_temp_move"],
|
|
933
933
|
convertSet: async (entity, key, value, meta) => {
|
|
934
934
|
// Initialize payload with default constraints
|
|
935
|
-
|
|
935
|
+
let minimum = 0;
|
|
936
|
+
let maximum = 600;
|
|
936
937
|
let rate;
|
|
937
938
|
let movemode;
|
|
938
939
|
// Handle different input formats
|
|
@@ -955,8 +956,8 @@ exports.light_colortemp_move = {
|
|
|
955
956
|
throw new Error(`${key}: invalid string value "${value}". Expected "stop", "release", "0", "up", "1", or "down"`);
|
|
956
957
|
}
|
|
957
958
|
// Use legacy constraints for string-based commands
|
|
958
|
-
|
|
959
|
-
|
|
959
|
+
minimum = 153;
|
|
960
|
+
maximum = 370;
|
|
960
961
|
}
|
|
961
962
|
else if (utils.isNumber(value)) {
|
|
962
963
|
// Simple number input
|
|
@@ -994,26 +995,23 @@ exports.light_colortemp_move = {
|
|
|
994
995
|
if (value.minimum != null) {
|
|
995
996
|
const minValue = Number(value.minimum);
|
|
996
997
|
utils.assertNumber(minValue, `${key}.minimum`);
|
|
997
|
-
|
|
998
|
+
minimum = minValue;
|
|
998
999
|
}
|
|
999
1000
|
if (value.maximum != null) {
|
|
1000
1001
|
const maxValue = Number(value.maximum);
|
|
1001
1002
|
utils.assertNumber(maxValue, `${key}.maximum`);
|
|
1002
|
-
|
|
1003
|
+
maximum = maxValue;
|
|
1003
1004
|
}
|
|
1004
1005
|
// Validate constraints
|
|
1005
|
-
if (
|
|
1006
|
-
throw new Error(`${key}: minimum (${
|
|
1006
|
+
if (minimum >= maximum) {
|
|
1007
|
+
throw new Error(`${key}: minimum (${minimum}) must be less than maximum (${maximum})`);
|
|
1007
1008
|
}
|
|
1008
1009
|
}
|
|
1009
1010
|
else {
|
|
1010
1011
|
throw new Error(`${key}: invalid value type. Expected number, string, or object with rate property`);
|
|
1011
1012
|
}
|
|
1012
|
-
// Set final payload values
|
|
1013
|
-
payload.rate = rate;
|
|
1014
|
-
payload.movemode = movemode;
|
|
1015
1013
|
// Send command
|
|
1016
|
-
await entity.command("lightingColorCtrl", "moveColorTemp",
|
|
1014
|
+
await entity.command("lightingColorCtrl", "moveColorTemp", { minimum, maximum, rate, movemode }, utils.getOptions(meta.mapped, entity));
|
|
1017
1015
|
// Read current color temperature if stopping
|
|
1018
1016
|
if (movemode === 0) {
|
|
1019
1017
|
const entityToRead = utils.getEntityOrFirstGroupMember(entity);
|
|
@@ -1078,17 +1076,18 @@ exports.light_hue_saturation_move = {
|
|
|
1078
1076
|
value = value === "stop" ? value : Number(value);
|
|
1079
1077
|
const command = key === "hue_move" ? "moveHue" : "moveSaturation";
|
|
1080
1078
|
const attribute = key === "hue_move" ? "currentHue" : "currentSaturation";
|
|
1081
|
-
|
|
1079
|
+
let rate = 0;
|
|
1080
|
+
let movemode = 0;
|
|
1082
1081
|
if (value === "stop" || value === 0) {
|
|
1083
|
-
|
|
1084
|
-
|
|
1082
|
+
rate = 1;
|
|
1083
|
+
movemode = 0;
|
|
1085
1084
|
}
|
|
1086
1085
|
else {
|
|
1087
1086
|
utils.assertNumber(value, key);
|
|
1088
|
-
|
|
1089
|
-
|
|
1087
|
+
rate = Math.abs(value);
|
|
1088
|
+
movemode = value > 0 ? 1 : 3;
|
|
1090
1089
|
}
|
|
1091
|
-
await entity.command("lightingColorCtrl", command,
|
|
1090
|
+
await entity.command("lightingColorCtrl", command, { rate, movemode }, utils.getOptions(meta.mapped, entity));
|
|
1092
1091
|
// We cannot determine the hue/saturation from the current state so we read it, because
|
|
1093
1092
|
// - Color mode could have been switched (x/y or colortemp)
|
|
1094
1093
|
if (value === "stop" || value === 0) {
|
|
@@ -1107,6 +1106,7 @@ exports.light_onoff_brightness = {
|
|
|
1107
1106
|
const { message } = meta;
|
|
1108
1107
|
const transition = utils.getTransition(entity, "brightness", meta);
|
|
1109
1108
|
const turnsOffAtBrightness1 = utils.getMetaValue(entity, meta.mapped, "turnsOffAtBrightness1", "allEqual", false);
|
|
1109
|
+
const moveToLevelWithOnOffDisable = utils.getMetaValue(entity, meta.mapped, "moveToLevelWithOnOffDisable", "allEqual", false);
|
|
1110
1110
|
let state = message.state !== undefined ? (typeof message.state === "string" ? message.state.toLowerCase() : null) : undefined;
|
|
1111
1111
|
let brightness;
|
|
1112
1112
|
if (message.brightness != null) {
|
|
@@ -1174,7 +1174,6 @@ exports.light_onoff_brightness = {
|
|
|
1174
1174
|
try {
|
|
1175
1175
|
const attributeRead = await entity.read("genLevelCtrl", ["onLevel"]);
|
|
1176
1176
|
if (attributeRead !== undefined) {
|
|
1177
|
-
// @ts-expect-error ignore
|
|
1178
1177
|
onLevel = attributeRead.onLevel;
|
|
1179
1178
|
}
|
|
1180
1179
|
}
|
|
@@ -1217,12 +1216,12 @@ exports.light_onoff_brightness = {
|
|
|
1217
1216
|
globalStore.putValue(entity, "brightness", brightness);
|
|
1218
1217
|
globalStore.clearValue(entity, "turnedOffWithTransition");
|
|
1219
1218
|
}
|
|
1220
|
-
await entity.command("genLevelCtrl", state === null ? "moveToLevel" : "moveToLevelWithOnOff", { level: Number(brightness), transtime: transition.time }, utils.getOptions(meta.mapped, entity));
|
|
1219
|
+
await entity.command("genLevelCtrl", state === null || moveToLevelWithOnOffDisable ? "moveToLevel" : "moveToLevelWithOnOff", { level: Number(brightness), transtime: transition.time }, utils.getOptions(meta.mapped, entity));
|
|
1221
1220
|
const result = { state: {} };
|
|
1222
1221
|
if (publishBrightness) {
|
|
1223
1222
|
result.state.brightness = Number(brightness);
|
|
1224
1223
|
}
|
|
1225
|
-
if (state !== null) {
|
|
1224
|
+
if (state !== null && !moveToLevelWithOnOffDisable) {
|
|
1226
1225
|
result.state.state = brightness === 0 ? "OFF" : "ON";
|
|
1227
1226
|
}
|
|
1228
1227
|
return result;
|
|
@@ -1254,7 +1253,7 @@ exports.light_colortemp_startup = {
|
|
|
1254
1253
|
// biome-ignore lint/style/noParameterAssign: ignored using `--suppress`
|
|
1255
1254
|
value = light.clampColorTemp(value, colorTempMin, colorTempMax);
|
|
1256
1255
|
}
|
|
1257
|
-
await entity.write("lightingColorCtrl", { startUpColorTemperature: value }, utils.getOptions(meta.mapped, entity));
|
|
1256
|
+
await entity.write("lightingColorCtrl", { startUpColorTemperature: value /* type failure? */ }, utils.getOptions(meta.mapped, entity));
|
|
1258
1257
|
return { state: { color_temp_startup: value } };
|
|
1259
1258
|
},
|
|
1260
1259
|
convertGet: async (entity, key, meta) => {
|
|
@@ -1368,29 +1367,28 @@ exports.thermostat_weekly_schedule = {
|
|
|
1368
1367
|
]}}
|
|
1369
1368
|
*/
|
|
1370
1369
|
utils.assertObject(value, key);
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
if (Array.isArray(
|
|
1370
|
+
let daysofweek = value.dayofweek;
|
|
1371
|
+
const transitions = value.transitions;
|
|
1372
|
+
let numoftrans = 0;
|
|
1373
|
+
const modes = [];
|
|
1374
|
+
if (Array.isArray(transitions)) {
|
|
1376
1375
|
// calculate numoftrans
|
|
1377
1376
|
if (typeof value.numoftrans !== "undefined") {
|
|
1378
1377
|
logger_1.logger.warning(`weekly_schedule: ignoring provided numoftrans value (${JSON.stringify(value.numoftrans)}), this is now calculated automatically`, NS);
|
|
1379
1378
|
}
|
|
1380
|
-
|
|
1379
|
+
numoftrans = transitions.length;
|
|
1381
1380
|
// mode is calculated below
|
|
1382
1381
|
if (typeof value.mode !== "undefined") {
|
|
1383
1382
|
logger_1.logger.warning(`weekly_schedule: ignoring provided mode value (${JSON.stringify(value.mode)}), this is now calculated automatically`, NS);
|
|
1384
1383
|
}
|
|
1385
|
-
payload.mode = [];
|
|
1386
1384
|
// transform transition payload values if needed
|
|
1387
|
-
for (const elem of
|
|
1388
|
-
// update
|
|
1389
|
-
if (elem.heatSetpoint != null && !
|
|
1390
|
-
|
|
1385
|
+
for (const elem of transitions) {
|
|
1386
|
+
// update mode if needed
|
|
1387
|
+
if (elem.heatSetpoint != null && !modes.includes("heat")) {
|
|
1388
|
+
modes.push("heat");
|
|
1391
1389
|
}
|
|
1392
|
-
if (elem.coolSetpoint != null && !
|
|
1393
|
-
|
|
1390
|
+
if (elem.coolSetpoint != null && !modes.includes("cool")) {
|
|
1391
|
+
modes.push("cool");
|
|
1394
1392
|
}
|
|
1395
1393
|
// transform setpoint values if numeric
|
|
1396
1394
|
if (typeof elem.heatSetpoint === "number") {
|
|
@@ -1402,8 +1400,8 @@ exports.thermostat_weekly_schedule = {
|
|
|
1402
1400
|
// accept 24h time notation (e.g. 19:30)
|
|
1403
1401
|
if (typeof elem.transitionTime === "string") {
|
|
1404
1402
|
const time = elem.transitionTime.split(":");
|
|
1405
|
-
const timeHour = Number.parseInt(time[0]) * 60;
|
|
1406
|
-
const timeMinute = Number.parseInt(time[1]);
|
|
1403
|
+
const timeHour = Number.parseInt(time[0], 10) * 60;
|
|
1404
|
+
const timeMinute = Number.parseInt(time[1], 10);
|
|
1407
1405
|
if (time.length !== 2 || Number.isNaN(timeHour) || Number.isNaN(timeMinute)) {
|
|
1408
1406
|
logger_1.logger.warning(`weekly_schedule: expected 24h time notation (e.g. 19:30) but got '${elem.transitionTime}'!`, NS);
|
|
1409
1407
|
}
|
|
@@ -1421,7 +1419,7 @@ exports.thermostat_weekly_schedule = {
|
|
|
1421
1419
|
if (Number.isNaN(elem.transitionTime.minute)) {
|
|
1422
1420
|
throw new Error(`weekly_schedule: expected time.minute to be a number, but got '${elem.transitionTime.minute}'!`);
|
|
1423
1421
|
}
|
|
1424
|
-
elem.transitionTime = Number.parseInt(elem.transitionTime.hour) * 60 + Number.parseInt(elem.transitionTime.minute);
|
|
1422
|
+
elem.transitionTime = Number.parseInt(elem.transitionTime.hour, 10) * 60 + Number.parseInt(elem.transitionTime.minute, 10);
|
|
1425
1423
|
}
|
|
1426
1424
|
}
|
|
1427
1425
|
}
|
|
@@ -1431,18 +1429,17 @@ exports.thermostat_weekly_schedule = {
|
|
|
1431
1429
|
}
|
|
1432
1430
|
// map array of desired modes to bitmask
|
|
1433
1431
|
let mode = 0;
|
|
1434
|
-
for (
|
|
1432
|
+
for (const m of modes) {
|
|
1435
1433
|
// lookup mode bit
|
|
1436
|
-
|
|
1437
|
-
mode |= 1 << m;
|
|
1434
|
+
mode |= 1 << utils.getKey(constants.thermostatScheduleMode, m, 0, Number);
|
|
1438
1435
|
}
|
|
1439
|
-
payload.mode = mode;
|
|
1440
1436
|
// map array of days to desired dayofweek bitmask
|
|
1441
|
-
if (typeof
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1437
|
+
if (typeof daysofweek === "string") {
|
|
1438
|
+
daysofweek = [daysofweek];
|
|
1439
|
+
}
|
|
1440
|
+
let dayofweek = 0;
|
|
1441
|
+
if (Array.isArray(daysofweek)) {
|
|
1442
|
+
for (let d of daysofweek) {
|
|
1446
1443
|
if (typeof d === "object") {
|
|
1447
1444
|
if (d.day == null) {
|
|
1448
1445
|
throw new Error(`weekly_schedule: expected dayofweek to be string or {"day": "str"}, but got '${JSON.stringify(d)}'!`);
|
|
@@ -1453,9 +1450,8 @@ exports.thermostat_weekly_schedule = {
|
|
|
1453
1450
|
d = utils.getKey(constants.thermostatDayOfWeek, d.toLowerCase(), d, Number);
|
|
1454
1451
|
dayofweek |= 1 << d;
|
|
1455
1452
|
}
|
|
1456
|
-
payload.dayofweek = dayofweek;
|
|
1457
1453
|
}
|
|
1458
|
-
await entity.command("hvacThermostat", "setWeeklySchedule",
|
|
1454
|
+
await entity.command("hvacThermostat", "setWeeklySchedule", { dayofweek, numoftrans, transitions, mode }, utils.getOptions(meta.mapped, entity));
|
|
1459
1455
|
},
|
|
1460
1456
|
convertGet: async (entity, key, meta) => {
|
|
1461
1457
|
const payload = {
|
|
@@ -1551,8 +1547,7 @@ exports.thermostat_keypad_lockout = {
|
|
|
1551
1547
|
exports.thermostat_temperature_setpoint_hold = {
|
|
1552
1548
|
key: ["temperature_setpoint_hold"],
|
|
1553
1549
|
convertSet: async (entity, key, value, meta) => {
|
|
1554
|
-
|
|
1555
|
-
await entity.write("hvacThermostat", { tempSetpointHold });
|
|
1550
|
+
await entity.write("hvacThermostat", { tempSetpointHold: value });
|
|
1556
1551
|
},
|
|
1557
1552
|
convertGet: async (entity, key, meta) => {
|
|
1558
1553
|
await entity.read("hvacThermostat", ["tempSetpointHold"]);
|
|
@@ -1561,8 +1556,7 @@ exports.thermostat_temperature_setpoint_hold = {
|
|
|
1561
1556
|
exports.thermostat_temperature_setpoint_hold_duration = {
|
|
1562
1557
|
key: ["temperature_setpoint_hold_duration"],
|
|
1563
1558
|
convertSet: async (entity, key, value, meta) => {
|
|
1564
|
-
|
|
1565
|
-
await entity.write("hvacThermostat", { tempSetpointHoldDuration });
|
|
1559
|
+
await entity.write("hvacThermostat", { tempSetpointHoldDuration: value });
|
|
1566
1560
|
},
|
|
1567
1561
|
convertGet: async (entity, key, meta) => {
|
|
1568
1562
|
await entity.read("hvacThermostat", ["tempSetpointHoldDuration"]);
|
|
@@ -1584,7 +1578,7 @@ exports.fan_speed = {
|
|
|
1584
1578
|
key: ["speed"],
|
|
1585
1579
|
convertSet: async (entity, key, value, meta) => {
|
|
1586
1580
|
utils.assertNumber(value);
|
|
1587
|
-
await entity.command("genLevelCtrl", "moveToLevel", { level: value
|
|
1581
|
+
await entity.command("genLevelCtrl", "moveToLevel", { level: value, transtime: 0 }, utils.getOptions(meta.mapped, entity));
|
|
1588
1582
|
return { state: { speed: value } };
|
|
1589
1583
|
},
|
|
1590
1584
|
convertGet: async (entity, key, meta) => {
|
|
@@ -1980,7 +1974,7 @@ exports.humidity = {
|
|
|
1980
1974
|
exports.elko_power_status = {
|
|
1981
1975
|
key: ["system_mode"],
|
|
1982
1976
|
convertSet: async (entity, key, value, meta) => {
|
|
1983
|
-
await entity.write("hvacThermostat", { elkoPowerStatus: value === "heat" });
|
|
1977
|
+
await entity.write("hvacThermostat", { elkoPowerStatus: value === "heat" ? 1 : 0 });
|
|
1984
1978
|
return { state: { system_mode: value } };
|
|
1985
1979
|
},
|
|
1986
1980
|
convertGet: async (entity, key, meta) => {
|
|
@@ -2183,7 +2177,9 @@ exports.livolo_cover_state = {
|
|
|
2183
2177
|
default:
|
|
2184
2178
|
throw new Error(`Value '${value}' is not a valid cover position (must be one of 'OPEN' or 'CLOSE')`);
|
|
2185
2179
|
}
|
|
2186
|
-
await entity.writeStructured("genPowerCfg",
|
|
2180
|
+
await entity.writeStructured("genPowerCfg",
|
|
2181
|
+
// @ts-expect-error workaround write custom payload
|
|
2182
|
+
[payload], options);
|
|
2187
2183
|
return {
|
|
2188
2184
|
state: {
|
|
2189
2185
|
moving: true,
|
|
@@ -2244,14 +2240,18 @@ exports.livolo_cover_options = {
|
|
|
2244
2240
|
(must be one of 'FORWARD' or 'REVERSE')`);
|
|
2245
2241
|
}
|
|
2246
2242
|
const payload = { 4865: { value: [direction, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] } };
|
|
2247
|
-
await entity.write("genPowerCfg",
|
|
2243
|
+
await entity.write("genPowerCfg",
|
|
2244
|
+
// @ts-expect-error workaround write custom payload
|
|
2245
|
+
payload, options);
|
|
2248
2246
|
}
|
|
2249
2247
|
if (value.motor_speed != null) {
|
|
2250
2248
|
if (value.motor_speed < 20 || value.motor_speed > 40) {
|
|
2251
2249
|
throw new Error("livolo_cover_options: Motor speed is out of range (20-40)");
|
|
2252
2250
|
}
|
|
2253
2251
|
const payload = { 4609: { value: [value.motor_speed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] } };
|
|
2254
|
-
await entity.write("genPowerCfg",
|
|
2252
|
+
await entity.write("genPowerCfg",
|
|
2253
|
+
// @ts-expect-error workaround write custom payload
|
|
2254
|
+
payload, options);
|
|
2255
2255
|
}
|
|
2256
2256
|
},
|
|
2257
2257
|
};
|
|
@@ -2548,8 +2548,7 @@ exports.danfoss_adaptation_settings = {
|
|
|
2548
2548
|
exports.danfoss_adaptation_control = {
|
|
2549
2549
|
key: ["adaptation_run_control"],
|
|
2550
2550
|
convertSet: async (entity, key, value, meta) => {
|
|
2551
|
-
|
|
2552
|
-
await entity.write("hvacThermostat", payload, manufacturerOptions.danfoss);
|
|
2551
|
+
await entity.write("hvacThermostat", { danfossAdaptionRunControl: utils.getKey(constants.danfossAdaptionRunControl, value, value, Number) }, manufacturerOptions.danfoss);
|
|
2553
2552
|
return { state: { adaptation_run_control: value } };
|
|
2554
2553
|
},
|
|
2555
2554
|
convertGet: async (entity, key, meta) => {
|
|
@@ -2559,8 +2558,7 @@ exports.danfoss_adaptation_control = {
|
|
|
2559
2558
|
exports.danfoss_regulation_setpoint_offset = {
|
|
2560
2559
|
key: ["regulation_setpoint_offset"],
|
|
2561
2560
|
convertSet: async (entity, key, value, meta) => {
|
|
2562
|
-
|
|
2563
|
-
await entity.write("hvacThermostat", payload, manufacturerOptions.danfoss);
|
|
2561
|
+
await entity.write("hvacThermostat", { danfossRegulationSetpointOffset: value }, manufacturerOptions.danfoss);
|
|
2564
2562
|
return { state: { regulation_setpoint_offset: value } };
|
|
2565
2563
|
},
|
|
2566
2564
|
convertGet: async (entity, key, meta) => {
|
|
@@ -2636,7 +2634,7 @@ exports.danfoss_system_status_code = {
|
|
|
2636
2634
|
exports.danfoss_heat_supply_request = {
|
|
2637
2635
|
key: ["heat_supply_request"],
|
|
2638
2636
|
convertGet: async (entity, key, meta) => {
|
|
2639
|
-
await entity.read("haDiagnostic", ["
|
|
2637
|
+
await entity.read("haDiagnostic", ["danfossHeatSupplyRequest"], manufacturerOptions.danfoss);
|
|
2640
2638
|
},
|
|
2641
2639
|
};
|
|
2642
2640
|
exports.danfoss_system_status_water = {
|
|
@@ -2982,15 +2980,13 @@ exports.tuya_led_controller = {
|
|
|
2982
2980
|
return { state: { state: value.toUpperCase() } };
|
|
2983
2981
|
}
|
|
2984
2982
|
if (key === "color") {
|
|
2985
|
-
const hue = {};
|
|
2986
|
-
const saturation = {};
|
|
2987
2983
|
utils.assertObject(value);
|
|
2988
|
-
hue
|
|
2989
|
-
saturation
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
await entity.command("lightingColorCtrl", "moveToHue", hue, utils.getOptions(meta.mapped, entity));
|
|
2993
|
-
await entity.command("lightingColorCtrl", "moveToSaturation", saturation, utils.getOptions(meta.mapped, entity));
|
|
2984
|
+
const hue = utils.mapNumberRange(value.h, 0, 360, 0, 254);
|
|
2985
|
+
const saturation = utils.mapNumberRange(value.s, 0, 100, 0, 254);
|
|
2986
|
+
const transtime = 0;
|
|
2987
|
+
const direction = 0;
|
|
2988
|
+
await entity.command("lightingColorCtrl", "moveToHue", { hue, transtime, direction }, utils.getOptions(meta.mapped, entity));
|
|
2989
|
+
await entity.command("lightingColorCtrl", "moveToSaturation", { saturation, transtime }, utils.getOptions(meta.mapped, entity));
|
|
2994
2990
|
}
|
|
2995
2991
|
},
|
|
2996
2992
|
convertGet: async (entity, key, meta) => {
|
|
@@ -3244,14 +3240,14 @@ exports.ptvo_switch_uart = {
|
|
|
3244
3240
|
exports.ptvo_switch_analog_input = {
|
|
3245
3241
|
key: ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9", "l10", "l11", "l12", "l13", "l14", "l15", "l16"],
|
|
3246
3242
|
convertGet: async (entity, key, meta) => {
|
|
3247
|
-
const epId = Number.parseInt(key.substr(1, 2));
|
|
3243
|
+
const epId = Number.parseInt(key.substr(1, 2), 10);
|
|
3248
3244
|
if (utils.hasEndpoints(meta.device, [epId])) {
|
|
3249
3245
|
const endpoint = meta.device.getEndpoint(epId);
|
|
3250
3246
|
await endpoint.read("genAnalogInput", ["presentValue", "description"]);
|
|
3251
3247
|
}
|
|
3252
3248
|
},
|
|
3253
3249
|
convertSet: async (entity, key, value, meta) => {
|
|
3254
|
-
const epId = Number.parseInt(key.substr(1, 2));
|
|
3250
|
+
const epId = Number.parseInt(key.substr(1, 2), 10);
|
|
3255
3251
|
if (utils.hasEndpoints(meta.device, [epId])) {
|
|
3256
3252
|
const endpoint = meta.device.getEndpoint(epId);
|
|
3257
3253
|
let cluster = "genLevelCtrl";
|
|
@@ -3561,16 +3557,16 @@ exports.diyruz_zintercom_config = {
|
|
|
3561
3557
|
},
|
|
3562
3558
|
convertGet: async (entity, key, meta) => {
|
|
3563
3559
|
const payloads = {
|
|
3564
|
-
mode:
|
|
3565
|
-
sound:
|
|
3566
|
-
time_ring:
|
|
3567
|
-
time_talk:
|
|
3568
|
-
time_open:
|
|
3569
|
-
time_bell:
|
|
3570
|
-
time_report:
|
|
3560
|
+
mode: 0x0051,
|
|
3561
|
+
sound: 0x0052,
|
|
3562
|
+
time_ring: 0x0053,
|
|
3563
|
+
time_talk: 0x0054,
|
|
3564
|
+
time_open: 0x0055,
|
|
3565
|
+
time_bell: 0x0057,
|
|
3566
|
+
time_report: 0x0056,
|
|
3571
3567
|
};
|
|
3572
3568
|
const v = utils.getFromLookup(key, payloads);
|
|
3573
|
-
await entity.read(
|
|
3569
|
+
await entity.read("closuresDoorLock", [v]);
|
|
3574
3570
|
},
|
|
3575
3571
|
};
|
|
3576
3572
|
exports.power_source = {
|
|
@@ -3664,13 +3660,11 @@ exports.scene_store = {
|
|
|
3664
3660
|
utils.saveSceneState(member, sceneid, groupid, meta.membersState[member.getDevice().ieeeAddr], scenename);
|
|
3665
3661
|
}
|
|
3666
3662
|
}
|
|
3667
|
-
// @ts-expect-error ignore
|
|
3668
3663
|
}
|
|
3669
3664
|
else if (response.status === 0) {
|
|
3670
3665
|
utils.saveSceneState(entity, sceneid, groupid, meta.state, scenename);
|
|
3671
3666
|
}
|
|
3672
3667
|
else {
|
|
3673
|
-
// @ts-expect-error ignore
|
|
3674
3668
|
throw new Error(`Scene add not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
|
|
3675
3669
|
}
|
|
3676
3670
|
logger_1.logger.info("Successfully stored scene", NS);
|
|
@@ -3892,13 +3886,11 @@ exports.scene_remove = {
|
|
|
3892
3886
|
utils.deleteSceneState(member, sceneid, groupid);
|
|
3893
3887
|
}
|
|
3894
3888
|
}
|
|
3895
|
-
// @ts-expect-error ignore
|
|
3896
3889
|
}
|
|
3897
3890
|
else if (response.status === 0) {
|
|
3898
3891
|
utils.deleteSceneState(entity, sceneid, groupid);
|
|
3899
3892
|
}
|
|
3900
3893
|
else {
|
|
3901
|
-
// @ts-expect-error ignore
|
|
3902
3894
|
throw new Error(`Scene remove not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
|
|
3903
3895
|
}
|
|
3904
3896
|
logger_1.logger.info("Successfully removed scene", NS);
|
|
@@ -4109,7 +4101,7 @@ exports.viessmann_window_open_force = {
|
|
|
4109
4101
|
key: ["window_open_force"],
|
|
4110
4102
|
convertSet: async (entity, key, value, meta) => {
|
|
4111
4103
|
if (typeof value === "boolean") {
|
|
4112
|
-
await entity.write("hvacThermostat", { viessmannWindowOpenForce: value }, manufacturerOptions.viessmann);
|
|
4104
|
+
await entity.write("hvacThermostat", { viessmannWindowOpenForce: value ? 1 : 0 }, manufacturerOptions.viessmann);
|
|
4113
4105
|
return { state: { window_open_force: value } };
|
|
4114
4106
|
}
|
|
4115
4107
|
logger_1.logger.error("window_open_force must be a boolean!", NS);
|
|
@@ -4128,11 +4120,9 @@ exports.dawondns_only_off = {
|
|
|
4128
4120
|
key: ["state"],
|
|
4129
4121
|
convertSet: async (entity, key, value, meta) => {
|
|
4130
4122
|
utils.assertString(value, key);
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
utils.
|
|
4134
|
-
utils.validateValue(value, ["off"]);
|
|
4135
|
-
await entity.command("genOnOff", value, {}, utils.getOptions(meta.mapped, entity));
|
|
4123
|
+
const lowerValue = value.toLowerCase();
|
|
4124
|
+
utils.validateValue(lowerValue, ["off"]);
|
|
4125
|
+
await entity.command("genOnOff", lowerValue, {}, utils.getOptions(meta.mapped, entity));
|
|
4136
4126
|
},
|
|
4137
4127
|
convertGet: async (entity, key, meta) => {
|
|
4138
4128
|
await entity.read("genOnOff", ["onOff"]);
|
|
@@ -4220,8 +4210,7 @@ exports.schneider_dimmer_mode = {
|
|
|
4220
4210
|
exports.wiser_dimmer_mode = {
|
|
4221
4211
|
key: ["dimmer_mode"],
|
|
4222
4212
|
convertSet: async (entity, key, value, meta) => {
|
|
4223
|
-
|
|
4224
|
-
await entity.write("lightingBallastCfg", { wiserControlMode: controlMode }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
|
|
4213
|
+
await entity.write("lightingBallastCfg", { wiserControlMode: utils.getKey(constants.wiserDimmerControlMode, value, value, Number) }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
|
|
4225
4214
|
return { state: { dimmer_mode: value } };
|
|
4226
4215
|
},
|
|
4227
4216
|
convertGet: async (entity, key, meta) => {
|
|
@@ -4366,17 +4355,15 @@ exports.wiser_sed_thermostat_local_temperature_calibration = {
|
|
|
4366
4355
|
exports.wiser_sed_thermostat_keypad_lockout = {
|
|
4367
4356
|
key: ["keypad_lockout"],
|
|
4368
4357
|
convertSet: async (entity, key, value, meta) => {
|
|
4369
|
-
|
|
4370
|
-
await entity.write("hvacUserInterfaceCfg", { keypadLockout }, { srcEndpoint: 11, disableDefaultResponse: true });
|
|
4358
|
+
await entity.write("hvacUserInterfaceCfg", { keypadLockout: utils.getKey(constants.keypadLockoutMode, value, value, Number) }, { srcEndpoint: 11, disableDefaultResponse: true });
|
|
4371
4359
|
return { state: { keypad_lockout: value } };
|
|
4372
4360
|
},
|
|
4373
4361
|
};
|
|
4374
4362
|
exports.sihas_set_people = {
|
|
4375
4363
|
key: ["people"],
|
|
4376
4364
|
convertSet: async (entity, key, value, meta) => {
|
|
4377
|
-
const payload = { presentValue: value };
|
|
4378
4365
|
const endpoint = meta.device.endpoints.find((e) => e.supportsInputCluster("genAnalogInput"));
|
|
4379
|
-
await endpoint.write("genAnalogInput",
|
|
4366
|
+
await endpoint.write("genAnalogInput", { presentValue: value });
|
|
4380
4367
|
},
|
|
4381
4368
|
convertGet: async (entity, key, meta) => {
|
|
4382
4369
|
const endpoint = meta.device.endpoints.find((e) => e.supportsInputCluster("genAnalogInput"));
|