zigbee-herdsman-converters
Version:
Collection of device converters to be used with zigbee-herdsman
1,102 lines • 62.9 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.definitions = void 0;
const zigbee_herdsman_1 = require("zigbee-herdsman");
const fz = __importStar(require("../converters/fromZigbee"));
const tz = __importStar(require("../converters/toZigbee"));
const constants = __importStar(require("../lib/constants"));
const exposes = __importStar(require("../lib/exposes"));
const m = __importStar(require("../lib/modernExtend"));
const reporting = __importStar(require("../lib/reporting"));
const utils = __importStar(require("../lib/utils"));
const e = exposes.presets;
const ea = exposes.access;
const fzLocal = {
ctm_mbd_device_enabled: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data.onOff !== undefined) {
result.device_enabled = data.onOff ? "ON" : "OFF";
}
return result;
},
},
ctm_device_mode: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x2200] !== undefined) {
const deviceModeLookup = { 0: "astro_clock", 1: "timer", 2: "daily_timer", 3: "weekly_timer" };
result.device_mode = utils.getFromLookup(data[0x2200], deviceModeLookup);
}
return result;
},
},
ctm_device_enabled: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x2201] !== undefined) {
result.device_enabled = data[0x2201] ? "ON" : "OFF";
}
return result;
},
},
ctm_child_lock: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x2202] !== undefined) {
result.child_lock = data[0x2202] ? "locked" : "unlocked";
}
return result;
},
},
ctm_current_flag: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x5000] !== undefined) {
result.current_flag = data[0x5000];
}
return result;
},
},
ctm_relay_state: {
cluster: "genOnOff",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x5001] !== undefined) {
result.state = data[0x5001] ? "ON" : "OFF";
}
return result;
},
},
ctm_thermostat: {
cluster: "hvacThermostat",
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x0401] !== undefined) {
// Load
result.load = data[0x0401];
}
if (data.elkoLoad !== undefined) {
// Load
result.load = data.elkoLoad;
}
if (data[0x0402] !== undefined) {
// Display text
result.display_text = data[0x0402];
}
if (data.elkoDisplayText !== undefined) {
// Display text
result.display_text = data.elkoDisplayText;
}
if (data[0x0403] !== undefined) {
// Sensor
const sensorModeLookup = {
0: "air",
1: "floor",
2: "external",
3: "regulator",
4: "mv_air",
5: "mv_external",
6: "mv_regulator",
};
result.sensor = utils.getFromLookup(data[0x0403], sensorModeLookup);
}
if (data.elkoSensor !== undefined) {
// Sensor
const sensorModeLookup = {
0: "air",
1: "floor",
2: "external",
3: "regulator",
4: "mv_air",
5: "mv_external",
6: "mv_regulator",
};
result.sensor = utils.getFromLookup(data.elkoSensor, sensorModeLookup);
}
if (data[0x0405] !== undefined) {
// Regulator mode
result.regulator_mode = data[0x0405] ? "regulator" : "thermostat";
}
if (data.elkoRegulatorMode !== undefined) {
// Regulator mode
result.regulator_mode = data.elkoRegulatorMode ? "regulator" : "thermostat";
}
if (data[0x0406] !== undefined) {
// Power status
result.power_status = data[0x0406] ? "ON" : "OFF";
}
if (data.elkoPowerStatus !== undefined) {
// Power status
result.power_status = data.elkoPowerStatus ? "ON" : "OFF";
}
if (data[0x0408] !== undefined) {
// Mean power
result.mean_power = data[0x0408];
}
if (data.elkoMeanPower !== undefined) {
// Mean power
result.mean_power = data.elkoMeanPower;
}
if (data[0x0409] !== undefined) {
// Floor temp
result.floor_temp = utils.precisionRound(data[0x0409], 2) / 100;
}
if (data.elkoExternalTemp !== undefined) {
// External temp (floor)
result.floor_temp = utils.precisionRound(data.elkoExternalTemp, 2) / 100;
}
if (data[0x0411] !== undefined) {
// Night switching
result.night_switching = data[0x0411] ? "ON" : "OFF";
}
if (data.elkoNightSwitching !== undefined) {
// Night switching
result.night_switching = data.elkoNightSwitching ? "ON" : "OFF";
}
if (data[0x0412] !== undefined) {
// Frost guard
result.frost_guard = data[0x0412] ? "ON" : "OFF";
}
if (data.elkoFrostGuard !== undefined) {
// Frost guard
result.frost_guard = data.elkoFrostGuard ? "ON" : "OFF";
}
if (data[0x0413] !== undefined) {
// Child lock
result.child_lock = data[0x0413] ? "LOCK" : "UNLOCK";
}
if (data.elkoChildLock !== undefined) {
// Child lock
result.child_lock = data.elkoChildLock ? "LOCK" : "UNLOCK";
}
if (data[0x0414] !== undefined) {
// Max floor temp
result.max_floor_temp = data[0x0414];
}
if (data.elkoMaxFloorTemp !== undefined) {
// Max floor temp
result.max_floor_temp = data.elkoMaxFloorTemp;
}
if (data[0x0415] !== undefined) {
// Running_state
result.running_state = data[0x0415] ? "heat" : "idle";
}
if (data.elkoRelayState !== undefined) {
// Running_state
result.running_state = data.elkoRelayState ? "heat" : "idle";
}
if (data[0x0420] !== undefined) {
// Regulator setpoint
result.regulator_setpoint = data[0x0420];
}
if (data[0x0421] !== undefined) {
// Regulation mode
const regulationModeLookup = { 0: "thermostat", 1: "regulator", 2: "zzilent" };
result.regulation_mode = utils.getFromLookup(data[0x0421], regulationModeLookup);
}
if (data[0x0422] !== undefined) {
// Operation mode
const presetLookup = { 0: "off", 1: "away", 2: "sleep", 3: "home" };
const systemModeLookup = { 0: "off", 1: "off", 2: "off", 3: "heat" };
result.preset = utils.getFromLookup(data[0x0422], presetLookup);
result.system_mode = utils.getFromLookup(data[0x0422], systemModeLookup);
}
if (data[0x0423] !== undefined) {
// Maximum floor temp guard
result.max_floor_guard = data[0x0423] ? "ON" : "OFF";
}
if (data[0x0424] !== undefined) {
// Weekly timer enabled
result.weekly_timer = data[0x0424] ? "ON" : "OFF";
}
if (data[0x0425] !== undefined) {
// Frost guard setpoint
result.frost_guard_setpoint = data[0x0425];
}
if (data[0x0426] !== undefined) {
// External temperature
result.external_temp = utils.precisionRound(data[0x0426], 2) / 100;
}
if (data[0x0428] !== undefined) {
// External sensor source
result.exteral_sensor_source = data[0x0428];
}
if (data[0x0429] !== undefined) {
// Current air temperature
result.air_temp = utils.precisionRound(data[0x0429], 2) / 100;
}
if (data[0x0424] !== undefined) {
// Floor Sensor Error
result.floor_sensor_error = data[0x042b] ? "error" : "ok";
}
if (data[0x0424] !== undefined) {
// External Air Sensor Error
result.exteral_sensor_error = data[0x042c] ? "error" : "ok";
}
return result;
},
},
ctm_group_config: {
cluster: "65191", // 0xFEA7 ctmGroupConfig
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x0000] !== undefined) {
result.group_id = data[0x0000];
}
return result;
},
},
ctm_sove_guard: {
cluster: "65481", // 0xFFC9 ctmSoveGuard
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data[0x0001] !== undefined) {
// Alarm status
const alarmStatusLookup = {
0: "ok",
1: "tamper",
2: "high_temperatur",
3: "timer",
4: "battery_alarm",
5: "error",
255: "unknown",
};
result.alarm_status = utils.getFromLookup(data[0x0001], alarmStatusLookup);
}
if (data[0x0002] !== undefined) {
// Change battery
result.battery_low = !!data[0x0002];
}
if (data[0x0003] !== undefined) {
// Stove temperature
result.stove_temperature = data[0x0003];
}
if (data[0x0004] !== undefined) {
// Ambient temperature
result.ambient_temperature = data[0x0004];
}
if (data[0x0005] !== undefined) {
// Active
result.active = !!data[0x0005];
}
if (data[0x0006] !== undefined) {
// Runtime
result.runtime = data[0x0006];
}
if (data[0x0007] !== undefined) {
// Runtime timeout
result.runtime_timeout = data[0x0007];
}
if (data[0x0008] !== undefined) {
// Reset reason
const resetReasonLookup = {
0: "unknown",
1: "power_on",
2: "external",
3: "brown_out",
4: "watchdog",
5: "program_interface",
6: "software",
255: "unknown",
};
result.reset_reason = utils.getFromLookup(data[0x0008], resetReasonLookup);
}
if (data[0x0009] !== undefined) {
// Dip switch
result.dip_switch = data[0x0009];
}
if (data[0x000a] !== undefined) {
// Software version
result.sw_version = data[0x000a];
}
if (data[0x000b] !== undefined) {
// Hardware version
result.hw_version = data[0x000b];
}
if (data[0x000c] !== undefined) {
// Bootloader version
result.bootloader_version = data[0x000c];
}
if (data[0x000d] !== undefined) {
// Model
const modelLookup = { 0: "unknown", 1: "1_8", 2: "infinity", 3: "hybrid", 4: "tak", 255: "unknown" };
result.model = utils.getFromLookup(data[0x000d], modelLookup);
}
if (data[0x0010] !== undefined) {
// Relay address
result.relay_address = data[0x0010];
}
if (data[0x0100] !== undefined) {
// Relay current flag
const currentFlagLookup = { 0: "false", 1: "true", 255: "unknown" };
result.current_flag = utils.getFromLookup(data[0x0100], currentFlagLookup);
}
if (data[0x0101] !== undefined) {
// Relay current
result.relay_current = data[0x0101];
}
if (data[0x0102] !== undefined) {
// Relay status
const relayStatusLookup = { 0: "off", 1: "on", 2: "not_present", 255: "unknown" };
result.relay_status = utils.getFromLookup(data[0x0102], relayStatusLookup);
}
if (data[0x0103] !== undefined) {
// Relay external button
const relayStatusLookup = { 0: "not_clicked", 1: "clicked", 255: "unknown" };
result.external_button = utils.getFromLookup(data[0x0103], relayStatusLookup);
}
if (data[0x0104] !== undefined) {
// Relay alarm
const relayAlarmLookup = { 0: "ok", 1: "no_communication", 2: "over_current", 3: "over_temperature", 255: "unknown" };
result.relay_alarm = utils.getFromLookup(data[0x0104], relayAlarmLookup);
}
if (data[0x0105] !== undefined) {
// Alarm status (from relay)
const relayAlarmStatusLookup = {
0: "ok",
1: "tamper",
2: "high_temperatur",
3: "timer",
4: "battery_alarm",
5: "error",
255: "unknown",
};
result.relay_alarm_status = utils.getFromLookup(data[0x0105], relayAlarmStatusLookup);
}
return result;
},
},
ctm_water_leak_alarm: {
cluster: "ssIasZone",
type: ["commandStatusChangeNotification", "attributeReport"],
convert: (model, msg, publish, options, meta) => {
const zoneStatus = msg.data.zonestatus;
return {
active_water_leak: (zoneStatus & 1) > 0,
water_leak: (zoneStatus & (1 << 1)) > 0,
battery_low: (zoneStatus & (1 << 3)) > 0,
};
},
},
};
const tzLocal = {
ctm_mbd_device_enabled: {
key: ["device_enabled"],
convertSet: async (entity, key, value, meta) => {
utils.assertString(value, "device_enabled");
await entity.command("genOnOff", value.toLowerCase(), {}, utils.getOptions(meta.mapped, entity));
},
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", ["onOff"]);
},
},
ctm_mbd_brightness: {
key: ["brightness"],
convertSet: async (entity, key, value, meta) => {
await entity.command("genLevelCtrl", "moveToLevel", { level: value, transtime: 1 }, utils.getOptions(meta.mapped, entity));
},
convertGet: async (entity, key, meta) => {
await entity.read("genLevelCtrl", ["currentLevel"]);
},
},
ctm_device_mode: {
key: ["device_mode"],
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", [0x2200]);
},
},
ctm_device_enabled: {
key: ["device_enabled"],
convertSet: async (entity, key, value, meta) => {
await entity.write("genOnOff", { 8705: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
},
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", [0x2201]);
},
},
ctm_child_lock: {
key: ["child_lock"],
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", [0x2202]);
},
},
ctm_current_flag: {
key: ["current_flag"],
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", [0x5000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
},
ctm_relay_state: {
key: ["state"],
convertSet: async (entity, key, value, meta) => {
await entity.write("genOnOff", { 20481: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
convertGet: async (entity, key, meta) => {
await entity.read("genOnOff", [0x5001], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
},
ctm_thermostat: {
key: [
"load",
"display_text",
"sensor",
"regulator_mode",
"power_status",
"system_mode",
"night_switching",
"frost_guard",
"max_floor_temp",
"regulator_setpoint",
"regulation_mode",
"max_floor_guard",
"weekly_timer",
"exteral_sensor_source",
],
convertSet: async (entity, key, value, meta) => {
switch (key) {
case "load":
await entity.write("hvacThermostat", { 1025: { value: value, type: zigbee_herdsman_1.Zcl.DataType.UINT16 } });
break;
case "display_text":
await entity.write("hvacThermostat", { 1026: { value: value, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR } });
break;
case "sensor":
await entity.write("hvacThermostat", {
1027: {
value: utils.getFromLookup(value, {
air: 0,
floor: 1,
external: 2,
regulator: 3,
mv_air: 4,
mv_external: 5,
mv_regulator: 6,
}),
type: zigbee_herdsman_1.Zcl.DataType.ENUM8,
},
});
break;
case "regulator_mode":
await entity.write("hvacThermostat", {
1029: { value: utils.getFromLookup(value, { thermostat: 0, regulator: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
});
break;
case "power_status":
await entity.write("hvacThermostat", { 1030: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
break;
case "system_mode":
if (value === "off") {
await entity.write("hvacThermostat", { 1030: { value: 0, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
}
else if (value === "heat") {
await entity.write("hvacThermostat", { 1058: { value: 3, type: zigbee_herdsman_1.Zcl.DataType.UINT8 } });
}
break;
case "night_switching":
await entity.write("hvacThermostat", { 1041: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
break;
case "frost_guard":
await entity.write("hvacThermostat", { 1042: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
break;
case "max_floor_temp":
await entity.write("hvacThermostat", { 1044: { value: value, type: zigbee_herdsman_1.Zcl.DataType.UINT8 } });
break;
case "regulator_setpoint":
await entity.write("hvacThermostat", { 1056: { value: value, type: zigbee_herdsman_1.Zcl.DataType.UINT8 } });
break;
case "regulation_mode":
await entity.write("hvacThermostat", {
1057: {
value: utils.getFromLookup(value, { thermostat: 0, regulator: 1, zzilent: 2 }),
type: zigbee_herdsman_1.Zcl.DataType.UINT8,
},
});
break;
case "max_floor_guard":
await entity.write("hvacThermostat", { 1059: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
break;
case "weekly_timer":
await entity.write("hvacThermostat", { 1060: { value: utils.getFromLookup(value, { OFF: 0, ON: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
break;
case "exteral_sensor_source":
await entity.write("hvacThermostat", { 1064: { value: value, type: zigbee_herdsman_1.Zcl.DataType.UINT16 } });
break;
default: // Unknown key
throw new Error(`Unhandled key tzLocal.ctm_thermostat.convertSet ${key}`);
}
},
convertGet: async (entity, key, meta) => {
switch (key) {
case "load":
await entity.read("hvacThermostat", [0x0401]);
break;
case "display_text":
await entity.read("hvacThermostat", [0x0402]);
break;
case "sensor":
await entity.read("hvacThermostat", [0x0403]);
break;
case "regulator_mode":
await entity.read("hvacThermostat", [0x0405]);
break;
case "power_status":
await entity.read("hvacThermostat", [0x0406]);
break;
case "night_switching":
await entity.read("hvacThermostat", [0x0411]);
break;
case "frost_guard":
await entity.read("hvacThermostat", [0x0412]);
break;
case "max_floor_temp":
await entity.read("hvacThermostat", [0x0414]);
break;
case "regulator_setpoint":
await entity.read("hvacThermostat", [0x0420]);
break;
case "regulation_mode":
await entity.read("hvacThermostat", [0x0421]);
break;
case "system_mode":
await entity.read("hvacThermostat", [0x0422]);
break;
case "max_floor_guard":
await entity.read("hvacThermostat", [0x0423]);
break;
case "weekly_timer":
await entity.read("hvacThermostat", [0x0424]);
break;
case "exteral_sensor_source":
await entity.read("hvacThermostat", [0x0428]);
break;
default: // Unknown key
throw new Error(`Unhandled key tzLocal.ctm_thermostat.convertGet ${key}`);
}
},
},
ctm_thermostat_preset: {
key: ["preset"],
convertSet: async (entity, key, value, meta) => {
const presetLookup = { off: 0, away: 1, sleep: 2, home: 3 };
await entity.write("hvacThermostat", { 1058: { value: utils.getFromLookup(value, presetLookup), type: zigbee_herdsman_1.Zcl.DataType.UINT8 } });
},
},
ctm_thermostat_child_lock: {
key: ["child_lock"],
convertSet: async (entity, key, value, meta) => {
await entity.write("hvacThermostat", { 1043: { value: utils.getFromLookup(value, { UNLOCK: 0, LOCK: 1 }), type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN } });
},
},
ctm_thermostat_gets: {
key: [
"mean_power",
"floor_temp",
"running_state",
"frost_guard_setpoint",
"external_temp",
"air_temp",
"floor_sensor_error",
"exteral_sensor_error",
],
convertGet: async (entity, key, meta) => {
switch (key) {
case "mean_power":
await entity.read("hvacThermostat", [0x0408]);
break;
case "floor_temp":
await entity.read("hvacThermostat", [0x0409]);
break;
case "running_state":
await entity.read("hvacThermostat", [0x0415]);
break;
case "frost_guard_setpoint":
await entity.read("hvacThermostat", [0x0425]);
break;
case "external_temp":
await entity.read("hvacThermostat", [0x0426]);
break;
case "air_temp":
await entity.read("hvacThermostat", [0x0429]);
break;
case "floor_sensor_error":
await entity.read("hvacThermostat", [0x042b]);
break;
case "exteral_sensor_error":
await entity.read("hvacThermostat", [0x042c]);
break;
default: // Unknown key
throw new Error(`Unhandled key tzLocal.ctm_thermostat.convertGet ${key}`);
}
},
},
ctm_group_config: {
key: ["group_id"],
convertGet: async (entity, key, meta) => {
await entity.read(0xfea7, [0x0000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
},
ctm_sove_guard: {
key: [
"alarm_status",
"change_battery",
"stove_temperature",
"ambient_temperature",
"active",
"runtime",
"runtime_timeout",
"reset_reason",
"dip_switch",
"sw_version",
"hw_version",
"bootloader_version",
"model",
"relay_address",
"current_flag",
"relay_current",
"relay_status",
"external_button",
"relay_alarm",
"relay_alarm_status",
],
convertGet: async (entity, key, meta) => {
switch (key) {
case "alarm_status":
await entity.read(0xffc9, [0x0001], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "battery_low":
await entity.read(0xffc9, [0x0002], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "stove_temperature":
await entity.read(0xffc9, [0x0003], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "ambient_temperature":
await entity.read(0xffc9, [0x0004], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "active":
await entity.read(0xffc9, [0x0005], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "runtime":
await entity.read(0xffc9, [0x0006], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "runtime_timeout":
await entity.read(0xffc9, [0x0007], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "reset_reason":
await entity.read(0xffc9, [0x0008], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "dip_switch":
await entity.read(0xffc9, [0x0009], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "sw_version":
await entity.read(0xffc9, [0x000a], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "hw_version":
await entity.read(0xffc9, [0x000b], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "bootloader_version":
await entity.read(0xffc9, [0x000c], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "model":
await entity.read(0xffc9, [0x000d], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "relay_address":
await entity.read(0xffc9, [0x0010], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "current_flag":
await entity.read(0xffc9, [0x0100], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "relay_current":
await entity.read(0xffc9, [0x0101], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "relay_status":
await entity.read(0xffc9, [0x0102], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "external_button":
await entity.read(0xffc9, [0x0103], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "relay_alarm":
await entity.read(0xffc9, [0x0104], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
case "relay_alarm_status":
await entity.read(0xffc9, [0x0105], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
break;
default: // Unknown key
throw new Error(`Unhandled key tzLocal.ctm_sove_guard.convertGet ${key}`);
}
},
},
};
exports.definitions = [
{
zigbeeModel: ["mTouch Dim", "DimmerPille"],
model: "mTouch_Dim",
vendor: "CTM Lyng",
description: "mTouch Dim OP, touch dimmer",
fromZigbee: [fz.on_off, fz.brightness, fz.lighting_ballast_configuration],
toZigbee: [tz.on_off, tz.light_onoff_brightness, tz.light_brightness_move, tz.ballast_config],
meta: { disableDefaultResponse: true },
ota: true,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genLevelCtrl", "lightingBallastCfg"]);
await endpoint.read("genOnOff", ["onOff"]);
await reporting.onOff(endpoint);
await endpoint.read("genLevelCtrl", ["currentLevel"]);
await reporting.brightness(endpoint);
await endpoint.read("lightingBallastCfg", ["minLevel", "maxLevel", "powerOnLevel"]);
await endpoint.configureReporting("lightingBallastCfg", [
{
attribute: "minLevel",
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: null,
},
]);
await endpoint.configureReporting("lightingBallastCfg", [
{
attribute: "maxLevel",
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: null,
},
]);
await endpoint.configureReporting("lightingBallastCfg", [
{
attribute: "powerOnLevel",
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: null,
},
]);
},
exposes: [
e.light_brightness(),
e.numeric("ballast_minimum_level", ea.ALL).withValueMin(1).withValueMax(99).withDescription("Specifies the minimum brightness value"),
e.numeric("ballast_maximum_level", ea.ALL).withValueMin(1).withValueMax(99).withDescription("Specifies the maximum brightness value"),
e
.numeric("ballast_power_on_level", ea.ALL)
.withValueMin(1)
.withValueMax(99)
.withDescription('Specifies the initialisation light level. Can not be set lower than "ballast_minimum_level"'),
],
whiteLabel: [{ vendor: "CTM Lyng", model: "CTM_DimmerPille", description: "CTM Lyng DimmerPille", fingerprint: [{ modelID: "DimmerPille" }] }],
},
{
zigbeeModel: ["mTouch Bryter"],
model: "mTouch_Bryter",
vendor: "CTM Lyng",
description: "mTouch Bryter OP, 3 channel switch",
fromZigbee: [
fz.temperature,
fz.battery,
fz.command_recall,
fz.command_on,
fz.command_off,
fz.command_toggle,
fz.command_move,
fz.command_stop,
fzLocal.ctm_group_config,
],
toZigbee: [],
meta: { battery: { voltageToPercentage: { min: 2500, max: 3200 } } },
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "msTemperatureMeasurement"]);
await reporting.batteryVoltage(endpoint);
await endpoint.read("msTemperatureMeasurement", ["measuredValue"]);
await reporting.temperature(endpoint, { min: constants.repInterval.MINUTES_10, max: constants.repInterval.HOUR, change: 100 });
await endpoint.read(0xfea7, [0x0000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
exposes: [
e.battery(),
e.temperature(),
e.action(["recall_1", "recall_2", "recall_3", "on", "off", "toggle", "brightness_move_down", "brightness_move_up", "brightness_stop"]),
e
.numeric("group_id", ea.STATE)
.withDescription("The device sends commands with this group ID. Put dvices in this group to control them."),
],
},
{
zigbeeModel: ["mTouch One"],
model: "mTouch_One",
vendor: "CTM Lyng",
description: "mTouch One OP, touch thermostat",
fromZigbee: [fz.thermostat, fzLocal.ctm_thermostat],
toZigbee: [
tz.thermostat_occupied_heating_setpoint,
tz.thermostat_local_temperature,
tzLocal.ctm_thermostat,
tzLocal.ctm_thermostat_preset,
tzLocal.ctm_thermostat_child_lock,
tzLocal.ctm_thermostat_gets,
],
ota: true,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["hvacThermostat"]);
await endpoint.read("hvacThermostat", ["localTemp", "occupiedHeatingSetpoint"]);
await reporting.thermostatTemperature(endpoint);
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
await endpoint.read("hvacThermostat", [0x0401]);
await endpoint.read("hvacThermostat", [0x0402]);
// Regulator mode
await endpoint.read("hvacThermostat", [0x0405]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0405, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
minimumReportInterval: 1,
maximumReportInterval: constants.repInterval.MAX,
reportableChange: null,
},
]);
// Power consumption
await endpoint.read("hvacThermostat", [0x0408]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0408, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 5,
},
]);
// Floor temp sensor
await endpoint.read("hvacThermostat", [0x0409]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0409, type: zigbee_herdsman_1.Zcl.DataType.INT16 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 10,
},
]);
// Frost guard
await endpoint.read("hvacThermostat", [0x0412]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0412, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.MAX,
reportableChange: null,
},
]);
// Child lock active/inactive
await endpoint.read("hvacThermostat", [0x0413]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0413, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.MAX,
reportableChange: null,
},
]);
// Regulator setpoint
await endpoint.read("hvacThermostat", [0x0420]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0420, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
},
]);
// Operation mode
await endpoint.read("hvacThermostat", [0x0422]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0422, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
},
]);
// Air temp sensor
await endpoint.read("hvacThermostat", [0x0429]);
await endpoint.configureReporting("hvacThermostat", [
{
attribute: { ID: 0x0429, type: zigbee_herdsman_1.Zcl.DataType.INT16 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 10,
},
]);
},
exposes: [
e.child_lock(),
e
.climate()
.withSetpoint("occupied_heating_setpoint", 5, 40, 1)
.withLocalTemperature()
.withSystemMode(["off", "heat"])
.withPreset(["off", "away", "sleep", "home"])
.withRunningState(["idle", "heat"]),
e
.numeric("load", ea.ALL)
.withUnit("W")
.withDescription("Load in W when heating is on (between 0-3600 W). The thermostat uses the value as input to the mean_power calculation.")
.withValueMin(0)
.withValueMax(3600),
e.text("display_text", ea.ALL).withDescription("Displayed text on thermostat display (zone). Max 19 characters"),
e.binary("regulator_mode", ea.ALL, "regulator", "thermostat").withDescription("Device in regulator or thermostat mode."),
e.numeric("mean_power", ea.STATE_GET).withUnit("W").withDescription("Reports average power usage last 10 minutes"),
e.numeric("floor_temp", ea.STATE_GET).withUnit("°C").withDescription("Current temperature measured from the floor sensor"),
e
.binary("frost_guard", ea.ALL, "ON", "OFF")
.withDescription("When frost guard is ON, it is activated when the thermostat is switched OFF with the ON/OFF button." +
'At the same time, the display will fade and the text "Frostsikring x °C" appears in the display and remains until the ' +
"thermostat is switched on again."),
e
.numeric("regulator_setpoint", ea.ALL)
.withUnit("%")
.withDescription("Setpoint in %, use only when the thermostat is in regulator mode.")
.withValueMin(1)
.withValueMax(99),
e.numeric("air_temp", ea.STATE_GET).withUnit("°C").withDescription("Current temperature measured from the air sensor"),
],
},
{
zigbeeModel: ["mStikk Outlet", "mStikk 16A", "mStikk 25A", "Tavlerele 25A"],
model: "mStikk_Outlet",
vendor: "CTM Lyng",
description: "mStikk OP, wall socket",
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering],
toZigbee: [tz.on_off],
ota: true,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "haElectricalMeasurement", "seMetering"]);
await endpoint.read("haElectricalMeasurement", ["acVoltageMultiplier", "acVoltageDivisor"]);
await endpoint.read("haElectricalMeasurement", ["acCurrentMultiplier", "acCurrentDivisor"]);
await endpoint.read("haElectricalMeasurement", ["acPowerMultiplier", "acPowerDivisor"]);
await reporting.readMeteringMultiplierDivisor(endpoint);
await endpoint.read("genOnOff", ["onOff"]);
await reporting.onOff(endpoint);
await reporting.rmsVoltage(endpoint, { change: 100 });
await reporting.rmsCurrent(endpoint);
await reporting.activePower(endpoint);
await reporting.currentSummDelivered(endpoint);
},
exposes: [e.power(), e.current(), e.voltage(), e.switch(), e.energy()],
},
{
zigbeeModel: ["mKomfy Tak"],
model: "mKomfy_Tak",
vendor: "CTM Lyng",
description: "Temperature sensor",
extend: [m.battery(), m.temperature()],
},
{
zigbeeModel: ["mKomfy"],
model: "mKomfy_Sensor",
vendor: "CTM Lyng",
description: "mKomfy, stove guard",
fromZigbee: [fz.temperature, fz.battery, fzLocal.ctm_sove_guard],
toZigbee: [],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "msTemperatureMeasurement", 0xffc9]);
await reporting.batteryPercentageRemaining(endpoint);
// await endpoint.read('msTemperatureMeasurement', ['measuredValue']);
await reporting.temperature(endpoint, { min: constants.repInterval.MINUTES_10, max: constants.repInterval.HOUR, change: 100 });
// Alarm status
// await endpoint.read(0xFFC9, [0x0001], {manufacturerCode: Zcl.ManufacturerCode.DATEK_WIRELESS_AS});
await endpoint.configureReporting(0xffc9, [
{
attribute: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 0,
},
], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
// Change battery
// await endpoint.read(0xFFC9, [0x0002], {manufacturerCode: Zcl.ManufacturerCode.DATEK_WIRELESS_AS});
await endpoint.configureReporting(0xffc9, [
{
attribute: { ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.MAX,
reportableChange: 0,
},
], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
// Active
// await endpoint.read(0xFFC9, [0x0005], {manufacturerCode: Zcl.ManufacturerCode.DATEK_WIRELESS_AS});
await endpoint.configureReporting(0xffc9, [
{
attribute: { ID: 0x0005, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 0,
},
], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
},
exposes: [
e.battery(),
e.battery_low(),
e.temperature(),
e
.enum("alarm_status", ea.STATE, ["ok", "tamper", "high_temperatur", "timer", "battery_alarm", "error", "unknown"])
.withDescription("Alarm status."),
e.binary("active", ea.STATE, true, false).withDescription("Stove guard active/inactive (Stove in use)"),
],
},
{
zigbeeModel: ["mTouch Astro"],
model: "mTouch_Astro",
vendor: "CTM Lyng",
description: "mTouch Astro OP, ast