UNPKG

zigbee-herdsman-converters

Version:

Collection of device converters to be used with zigbee-herdsman

368 lines • 13.8 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 fz = __importStar(require("../converters/fromZigbee")); const tz = __importStar(require("../converters/toZigbee")); const exposes = __importStar(require("../lib/exposes")); const m = __importStar(require("../lib/modernExtend")); const reporting = __importStar(require("../lib/reporting")); const globalStore = __importStar(require("../lib/store")); const utils = __importStar(require("../lib/utils")); const e = exposes.presets; const glydeaStateKey = "glydea_position_state"; function getGlydeaState(endpoint) { return globalStore.getValue(endpoint, glydeaStateKey, { stopped: false, }); } function saveGlydeaState(endpoint, state) { globalStore.putValue(endpoint, glydeaStateKey, state); } function getGlydeaEndpoints(entity) { return utils.isEndpoint(entity) ? [entity] : entity.members; } function setGlydeaTarget(entity, target) { for (const endpoint of getGlydeaEndpoints(entity)) { const state = getGlydeaState(endpoint); state.target = target; state.stopped = false; saveGlydeaState(endpoint, state); } } function clearGlydeaTarget(entity) { for (const endpoint of getGlydeaEndpoints(entity)) { const state = getGlydeaState(endpoint); delete state.target; saveGlydeaState(endpoint, state); } } const fzLocal = { glydeaPosition: { ...fz.cover_position_tilt, convert: (model, msg, publish, options, meta) => { const converted = fz.cover_position_tilt.convert(model, msg, publish, options, meta); /* * An explicit read is authoritative. It is not part of the * faulty movement-stop reporting sequence. */ if (msg.type === "readResponse") { return converted; } const state = getGlydeaState(msg.endpoint); const coveringType = msg.data.windowCoveringType; if (coveringType !== undefined) { const moving = coveringType !== 0; if (moving) { /* * When a new movement starts after the preceding * operation stopped, and no new Z2M command replaced * the state, treat it as externally initiated. */ if (state.stopped) { delete state.target; } state.stopped = false; } else { state.stopped = true; } saveGlydeaState(msg.endpoint, state); } const rawPosition = msg.data.currentPositionLiftPercentage; /* * Only raw zero is affected by the Glydea bug. * All normal position reports pass through unchanged. */ if (rawPosition !== 0) { return converted; } /* * Without command context it is impossible to distinguish * a real raw-zero endpoint from the device's faulty raw-zero * report. Preserve standard Z2M behaviour in that case. */ if (state.target === undefined) { return converted; } const convertedPosition = converted?.position; /* * A zero after STOP is always spurious. * * For OPEN, CLOSE and exact-position commands, compare with * the expected position in exposed Z2M coordinates. * * convertedPosition was produced by the standard converter, * so options such as invert_cover have already been applied. */ const spurious = state.target === "stop" || convertedPosition !== state.target; delete state.target; saveGlydeaState(msg.endpoint, state); return spurious ? {} : converted; }, }, }; const tzLocal = { glydeaCoverState: { ...tz.cover_state, convertSet: async (entity, key, value, meta) => { utils.assertString(value, key); const normalized = value.toLowerCase(); let target; switch (normalized) { case "open": case "on": target = 100; break; case "close": case "off": target = 0; break; case "stop": target = "stop"; break; } if (target !== undefined) { setGlydeaTarget(entity, target); } const convertSet = tz.cover_state.convertSet; if (convertSet === undefined) { throw new Error("cover_state converter does not support convertSet"); } try { return await convertSet(entity, key, value, meta); } catch (error) { if (target !== undefined) { clearGlydeaTarget(entity); } throw error; } }, }, glydeaCoverPositionTilt: { ...tz.cover_position_tilt, convertSet: async (entity, key, value, meta) => { const tracksPosition = key === "position"; if (tracksPosition) { utils.assertNumber(value, key); setGlydeaTarget(entity, value); } const convertSet = tz.cover_position_tilt.convertSet; if (convertSet === undefined) { throw new Error("cover_position_tilt converter does not support convertSet"); } try { return await convertSet(entity, key, value, meta); } catch (error) { if (tracksPosition) { clearGlydeaTarget(entity); } throw error; } }, }, }; const glydeaWindowCovering = m.windowCovering({ controls: ["lift"], }); glydeaWindowCovering.fromZigbee = [fzLocal.glydeaPosition]; glydeaWindowCovering.toZigbee = [tzLocal.glydeaCoverState, tzLocal.glydeaCoverPositionTilt]; exports.definitions = [ { zigbeeModel: ["Tilt Only 50 WF TiltOnly"], model: "1245600", vendor: "Somfy", description: "Tilt only 50 WF (tilt only)", extend: [m.windowCovering({ controls: ["tilt"] }), m.battery()], }, { zigbeeModel: ["Sonesse 28 WF Li-Ion Roller", "Sonesse 28 WF Roller", "Sonesse 28 WF Li-Ion Zebra"], model: "1241755", vendor: "Somfy", description: "Sonesse 28 WF Li-Ion roller shades", extend: [m.battery(), m.windowCovering({ controls: ["lift"] })], }, { zigbeeModel: ["Sonesse 28 WF Zebra"], model: "1241754", vendor: "Somfy", description: "Sonesse 28 WF roller shades (external battery)", extend: [m.windowCovering({ controls: ["lift"] }), m.battery()], }, { zigbeeModel: ["Sonesse2 28 WF Roller"], model: "1003296", vendor: "Somfy", description: "Sonesse2 28 WF roller shades", extend: [m.battery(), m.windowCovering({ controls: ["lift"] })], }, { zigbeeModel: ["Sonesse2 28 WF Li-Ion Roller"], model: "1245943", vendor: "Somfy", description: "Sonesse2 28 WF Li-Ion roller shades", extend: [m.battery(), m.windowCovering({ controls: ["lift"] })], }, { zigbeeModel: ["Sonesse Ultra 30 WF Li-Ion Rolle", "Sonesse2 ULTRA 30 WF Li-ion Roll"], model: "SOMFY-1241752", vendor: "Somfy", description: "Blinds", extend: [m.windowCovering({ controls: ["lift"] }), m.battery()], }, { zigbeeModel: ["Roll Up 24 WF Li-ion Roller"], model: "1246037", vendor: "Somfy", description: "Blinds", extend: [m.windowCovering({ controls: ["lift"] }), m.battery()], }, { zigbeeModel: ["Sonesse 30 DC 24V Roller"], model: "1241970", vendor: "Somfy", description: "Sonesse 30 DC 24V roller shades", extend: [m.windowCovering({ controls: ["lift"] })], }, { zigbeeModel: ["Sonesse2 40 Zigbee Roller"], model: "1245920", vendor: "Somfy", description: "Sonesse2 40 Zigbee roller shades", extend: [m.windowCovering({ controls: ["lift"] })], }, { zigbeeModel: ["Ysia 5 HP Zigbee"], model: "1871154", vendor: "Somfy", description: "Ysia 5 channel blinds remote", extend: [ m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "232": 232 } }), m.battery(), m.commandsOnOff({ endpointNames: ["1", "2", "3", "4", "5"] }), m.commandsWindowCovering({ endpointNames: ["1", "2", "3", "4", "5"] }), ], }, { zigbeeModel: ["Ysia 1 Zigbee Europe", "Ysia 1 HP Zigbee"], model: "1871157", vendor: "Somfy", description: "Ysia 1 channel blinds remote", whiteLabel: [{ vendor: "Somfy", model: "5163664A" }], extend: [m.battery(), m.commandsOnOff(), m.commandsWindowCovering()], }, { zigbeeModel: ["1822647"], model: "1822647A", vendor: "Somfy", description: "Zigbee smart plug", fromZigbee: [fz.on_off, fz.metering], toZigbee: [tz.on_off], exposes: [e.switch(), e.power(), e.energy()], configure: async (device, coordinatorEndpoint) => { const ep = device.getEndpoint(12); await reporting.bind(ep, coordinatorEndpoint, ["genBasic", "genIdentify", "genOnOff", "seMetering"]); await reporting.onOff(ep, { min: 1, max: 3600, change: 0 }); await reporting.readMeteringMultiplierDivisor(ep); await reporting.instantaneousDemand(ep); await reporting.currentSummDelivered(ep); await reporting.currentSummReceived(ep); }, }, { zigbeeModel: ["1811680"], model: "1811680", vendor: "Somfy", description: "Zigbee opening sensor", extend: [m.identify(), m.iasZoneAlarm({ zoneType: "generic", zoneAttributes: ["alarm_1", "battery_low"] }), m.battery()], }, { zigbeeModel: ["1811681"], model: "1811681", vendor: "Somfy", description: "Zigbee motion sensor", extend: [m.identify(), m.iasZoneAlarm({ zoneType: "occupancy", zoneAttributes: ["alarm_1", "battery_low"] }), m.battery()], }, { zigbeeModel: ["Glydea Ultra Curtain"], model: "9028412A", vendor: "Somfy", description: "Glydea Curtain motor Zigbee module", extend: [glydeaWindowCovering], }, { zigbeeModel: ["Tilt & Lift 25 WF Roller"], model: "1245602", vendor: "Somfy", description: "Tilt and lift blinds motor", extend: [m.windowCovering({ controls: ["lift", "tilt"] }), m.battery(), m.identify()], }, { zigbeeModel: ["1871215B"], model: "1871215B", vendor: "Somfy", description: "Connected plug E type with power monitoring", extend: [m.onOff(), m.electricityMeter()], }, { zigbeeModel: ["Situo 1 Zigbee"], model: "1800194", vendor: "Somfy", description: "Situo 1 channel blinds remote", extend: [m.battery(), m.commandsOnOff(), m.commandsWindowCovering()], }, { zigbeeModel: ["Situo 4 Zigbee"], model: "1800195", vendor: "Somfy", description: "Situo 4 channel blinds remote", extend: [ m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4, "232": 232 } }), m.battery(), m.commandsOnOff({ endpointNames: ["1", "2", "3", "4"] }), m.commandsWindowCovering({ endpointNames: ["1", "2", "3", "4"] }), ], }, { zigbeeModel: ["Sonesse2 40 WF Li-ion Roller"], model: "1245993", vendor: "Somfy", description: "Sonesse 40 WireFree Zigbee Li-ion USB-C roller shade", extend: [m.windowCovering({ controls: ["lift"] }), m.battery()], }, ]; //# sourceMappingURL=somfy.js.map