UNPKG

zigbee-herdsman-converters

Version:

Collection of device converters to be used with zigbee-herdsman

357 lines • 15.9 kB
"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 iconv = __importStar(require("iconv-lite")); const exposes = __importStar(require("../lib/exposes")); const logger_1 = require("../lib/logger"); const m = __importStar(require("../lib/modernExtend")); const reporting = __importStar(require("../lib/reporting")); const NS = "zhc:easyiot"; const ea = exposes.access; const e = exposes.presets; const fzLocal = { easyiot_ir_recv_command: { cluster: "tunneling", type: ["commandTransferDataResp"], convert: (model, msg, publish, options, meta) => { logger_1.logger.debug(`"easyiot_ir_recv_command" received (msg:${JSON.stringify(msg.data)})`, NS); const hexString = msg.data.data.toString("hex"); logger_1.logger.debug(`"easyiot_ir_recv_command" received command ${hexString}`, NS); return { last_received_command: hexString }; }, }, easyiot_tts_recv_status: { cluster: "tunneling", type: ["commandTransferDataResp"], convert: (model, msg, publish, options, meta) => { logger_1.logger.debug(`"easyiot_tts_recv_status" received (msg:${JSON.stringify(msg.data)})`, NS); const hexString = msg.data.data.toString("hex"); logger_1.logger.debug(`"easyiot_tts_recv_status" received status ${hexString}`, NS); return { last_received_status: hexString }; }, }, easyiot_sp1000_recv_status: { cluster: "tunneling", type: ["commandTransferDataResp"], convert: (model, msg, publish, options, meta) => { logger_1.logger.debug(`"easyiot_tts_recv_status" received (msg:${JSON.stringify(msg.data)})`, NS); const hexString = msg.data.data.toString("hex"); logger_1.logger.debug(`"easyiot_tts_recv_status" received status ${hexString}`, NS); if (msg.data.data[0] === 0x80 && msg.data.data[1] === 0) { const result = msg.data.data[4]; return { last_received_status: result }; } }, }, easyiot_action: { cluster: "genOnOff", type: ["commandOn", "commandOff", "commandToggle"], convert: (model, msg, publish, options, meta) => { const lookup = { commandToggle: "single", commandOn: "double", commandOff: "long" }; let buttonMapping = null; if (model.model === "ZB-WB01") { buttonMapping = { 1: "1" }; } else if (model.model === "ZB-WB02") { buttonMapping = { 1: "1", 2: "2" }; } else if (model.model === "ZB-WB03") { buttonMapping = { 1: "1", 2: "2", 3: "3" }; } else if (model.model === "ZB-WB08") { buttonMapping = { 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8" }; } const button = buttonMapping ? `${buttonMapping[msg.endpoint.ID]}_` : ""; return { action: `${button}${lookup[msg.type]}` }; }, }, }; const tzLocal = { easyiot_ir_send_command: { key: ["send_command"], convertSet: async (entity, key, value, meta) => { if (!value) { throw new Error("There is no IR code to send"); } logger_1.logger.debug(`Sending IR code: ${value}`, NS); await entity.command("tunneling", "transferData", { tunnelId: 0x0000, data: Buffer.from(value, "hex"), }, { disableDefaultResponse: true }); logger_1.logger.debug("Sending IR command success.", NS); }, }, easyiot_tts_send_command: { key: ["send_tts"], convertSet: async (entity, key, value, meta) => { if (!value) { throw new Error("There is no text to send"); } logger_1.logger.debug(`Sending IR code: ${value}`, NS); const frameHeader = Buffer.from([0xfd]); const gb2312Buffer = iconv.encode(value, "GB2312"); const dataLength = gb2312Buffer.length + 2; const dataLengthBuffer = Buffer.alloc(2); dataLengthBuffer.writeUInt16BE(dataLength, 0); const commandByte = Buffer.from([0x01, 0x01]); const protocolFrame = Buffer.concat([frameHeader, dataLengthBuffer, commandByte, gb2312Buffer]); await entity.command("tunneling", "transferData", { tunnelId: 0x0000, data: protocolFrame, }, { disableDefaultResponse: true }); logger_1.logger.debug("Sending IR command success.", NS); }, }, easyiot_sp1000_play_voice: { key: ["play_voice"], convertSet: async (entity, key, value, meta) => { if (!value) { throw new Error("There is no text to send"); } logger_1.logger.debug(`Sending IR code: ${value}`, NS); const frameCmd = Buffer.from([0x01, 0x00]); const dataLen = Buffer.from([0x02]); const dataType = Buffer.from([0x21]); const playId = Buffer.from([value & 0xff, (value >> 8) & 0xff]); const protocolFrame = Buffer.concat([frameCmd, dataLen, dataType, playId]); await entity.command("tunneling", "transferData", { tunnelId: 0x0001, data: protocolFrame, }, { disableDefaultResponse: true }); logger_1.logger.debug("Sending IR command success.", NS); }, }, easyiot_sp1000_set_volume: { key: ["set_volume"], convertSet: async (entity, key, value, meta) => { if (!value) { throw new Error("There is no text to send"); } logger_1.logger.debug(`Sending IR code: ${value}`, NS); const frameCmd = Buffer.from([0x02, 0x00]); const dataLen = Buffer.from([0x01]); const dataType = Buffer.from([0x20]); const volume = Buffer.from([value & 0xff]); const protocolFrame = Buffer.concat([frameCmd, dataLen, dataType, volume]); await entity.command("tunneling", "transferData", { tunnelId: 0x0001, data: protocolFrame, }, { disableDefaultResponse: true }); logger_1.logger.debug("Sending IR command success.", NS); }, }, }; exports.definitions = [ { fingerprint: [{ modelID: "ZB-IR01", manufacturerName: "easyiot" }], model: "ZB-IR01", vendor: "easyiot", description: "This is an infrared remote control equipped with a local code library," + "supporting devices such as air conditioners, televisions, projectors, and more.", fromZigbee: [fzLocal.easyiot_ir_recv_command], toZigbee: [tzLocal.easyiot_ir_send_command], exposes: [ e.text("last_received_command", ea.STATE).withDescription("Received infrared control command"), e.text("send_command", ea.SET).withDescription("Send infrared control command"), ], }, { fingerprint: [{ modelID: "ZB-TTS01", manufacturerName: "easyiot" }], model: "ZB-TTS01", vendor: "easyiot", description: "This is a Simplified Chinese (GB2312) TTS converter that can convert GB2312 encoded text to speech", fromZigbee: [fzLocal.easyiot_tts_recv_status], toZigbee: [tzLocal.easyiot_tts_send_command], exposes: [ e.text("last_received_status", ea.STATE).withDescription("status"), e.text("send_tts", ea.SET).withDescription("Please enter text"), ], }, { fingerprint: [{ modelID: "ZB-SP1000", manufacturerName: "easyiot" }], model: "ZB-SP1000", vendor: "easyiot", description: "ZB-SP1000 is an MP3 player that can support 1,000 voices.", fromZigbee: [fzLocal.easyiot_sp1000_recv_status], toZigbee: [tzLocal.easyiot_sp1000_play_voice, tzLocal.easyiot_sp1000_set_volume], exposes: [ e.numeric("play_voice", ea.SET).withDescription("Please enter ID(1-999)").withValueMin(1).withValueMax(999).withValueStep(1), e.numeric("set_volume", ea.SET).withDescription("Please enter volume(1-30)").withValueMin(1).withValueMax(30).withValueStep(1), e.text("last_received_status", ea.STATE).withDescription("status"), ], }, { fingerprint: [{ modelID: "ZB-RS485", manufacturerName: "easyiot" }], model: "ZB-RS485", vendor: "easyiot", description: "Zigbee to RS485 controller", fromZigbee: [fzLocal.easyiot_ir_recv_command], toZigbee: [tzLocal.easyiot_ir_send_command], exposes: [ e.text("last_received_command", ea.STATE).withDescription("Received data"), e.text("send_command", ea.SET).withDescription("Send data"), ], }, { zigbeeModel: ["ZB-PM01"], model: "ZB-PM01", vendor: "easyiot", description: "Smart circuit breaker with Metering", extend: [m.onOff({ powerOnBehavior: false }), m.electricityMeter()], }, { zigbeeModel: ["ZB-WC01"], model: "ZB-WC01", vendor: "easyiot", description: "Curtain motor", extend: [m.windowCovering({ controls: ["lift"], configureReporting: false })], }, { zigbeeModel: ["ZB-WB01"], model: "ZB-WB01", vendor: "easyiot", description: "1-button remote control", fromZigbee: [fzLocal.easyiot_action], toZigbee: [], exposes: [e.action(["1_single", "1_double", "1_long"]), e.battery()], configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1); await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genPowerCfg"]); await reporting.batteryPercentageRemaining(endpoint, { min: 30, max: 1800, change: 1 }); }, }, { zigbeeModel: ["ZB-WB02"], model: "ZB-WB02", vendor: "easyiot", description: "2-button remote control", fromZigbee: [fzLocal.easyiot_action], toZigbee: [], exposes: [e.action(["1_single", "1_double", "1_long", "2_single", "2_double", "2_long"]), e.battery()], configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1); await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genPowerCfg"]); await reporting.batteryPercentageRemaining(endpoint, { min: 30, max: 1800, change: 1 }); await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ["genOnOff"]); }, }, { zigbeeModel: ["ZB-WB03"], model: "ZB-WB03", vendor: "easyiot", description: "3-button remote control", fromZigbee: [fzLocal.easyiot_action], toZigbee: [], exposes: [e.action(["1_single", "1_double", "1_long", "2_single", "2_double", "2_long", "3_single", "3_double", "3_long"]), e.battery()], configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1); await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genPowerCfg"]); await reporting.batteryPercentageRemaining(endpoint, { min: 30, max: 1800, change: 1 }); await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ["genOnOff"]); }, }, { zigbeeModel: ["ZB-WB08"], model: "ZB-WB08", vendor: "easyiot", description: "8-button remote control", fromZigbee: [fzLocal.easyiot_action], toZigbee: [], exposes: [ e.action([ "1_single", "1_double", "1_long", "2_single", "2_double", "2_long", "3_single", "3_double", "3_long", "4_single", "4_double", "4_long", "5_single", "5_double", "5_long", "6_single", "6_double", "6_long", "7_single", "7_double", "7_long", "8_single", "8_double", "8_long", ]), e.battery(), ], configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1); await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genPowerCfg"]); await reporting.batteryPercentageRemaining(endpoint, { min: 30, max: 1800, change: 1 }); await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(4), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(5), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(6), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(7), coordinatorEndpoint, ["genOnOff"]); await reporting.bind(device.getEndpoint(8), coordinatorEndpoint, ["genOnOff"]); }, }, { fingerprint: [{ modelID: "ZB-PSW04", manufacturerName: "easyiot" }], model: "ZB-PSW04", vendor: "easyiot", description: "Zigbee 4-channel relay", extend: [ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3, l4: 4 } }), m.onOff({ endpointNames: ["l1", "l2", "l3", "l4"], configureReporting: false, powerOnBehavior: false }), ], }, { fingerprint: [{ modelID: "ZB-SW08", manufacturerName: "easyiot" }], model: "ZB-SW08", vendor: "easyiot", description: "Zigbee 8-channel relay", extend: [ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3, l4: 4, l5: 5, l6: 6, l7: 7, l8: 8 } }), m.onOff({ endpointNames: ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"], configureReporting: false, powerOnBehavior: false }), ], }, ]; //# sourceMappingURL=easyiot.js.map