"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 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 zigfredEndpoint = 5;
const buttonLookup = {
    0: "button_1",
    1: "button_2",
    2: "button_3",
    3: "button_4",
};
const actionLookup = {
    0: "release",
    1: "single",
    2: "double",
    3: "hold",
};
const siglisExtend = {
    addManuSpecificSiglisZigfredCluster: () => m.deviceAddCustomCluster("manuSpecificSiglisZigfred", {
        name: "manuSpecificSiglisZigfred",
        ID: 0xfc42,
        manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SIGLIS_AG,
        attributes: {
            buttonEvent: { name: "buttonEvent", ID: 0x0008, type: zigbee_herdsman_1.Zcl.DataType.UINT32, write: true, max: 0xffffffff },
        },
        commands: {
            siglisZigfredButtonEvent: {
                name: "siglisZigfredButtonEvent",
                ID: 0x02,
                parameters: [
                    { name: "button", type: zigbee_herdsman_1.Zcl.DataType.UINT8, max: 0xff },
                    { name: "type", type: zigbee_herdsman_1.Zcl.DataType.UINT8, max: 0xff },
                    { name: "duration", type: zigbee_herdsman_1.Zcl.DataType.UINT16, max: 0xffff },
                ],
            },
        },
        commandsResponse: {},
    }),
};
const zifgredFromZigbeeButtonEvent = {
    cluster: "manuSpecificSiglisZigfred",
    type: ["commandSiglisZigfredButtonEvent"],
    convert: (model, msg, publish, options, meta) => {
        const button = msg.data.button;
        const type = msg.data.type;
        const buttonName = utils.getFromLookup(button, buttonLookup);
        const typeName = utils.getFromLookup(type, actionLookup);
        if (buttonName && typeName) {
            const action = `${buttonName}_${typeName}`;
            return { action };
        }
    },
};
const coverAndLightToZigbee = {
    key: ["state", "brightness", "brightness_percent", "on_time", "position", "tilt"],
    options: [exposes.options.transition()],
    convertSet: async (entity, key, value, meta) => {
        utils.assertEndpoint(entity);
        const isCover = entity.ID === 0x0b || entity.ID === 0x0c;
        if (isCover) {
            if (key === "state") {
                return await tz.cover_state.convertSet(entity, key, value, meta);
            }
            if (key === "position" || key === "tilt") {
                return await tz.cover_position_tilt.convertSet(entity, key, value, meta);
            }
        }
        else {
            if (key === "state" || key === "brightness" || key === "brightness_percent" || key === "on_time") {
                return await tz.light_onoff_brightness.convertSet(entity, key, value, meta);
            }
        }
    },
    convertGet: async (entity, key, meta) => {
        utils.assertEndpoint(entity);
        if (key === "state" && (entity.ID === 0x0b || entity.ID === 0x0c)) {
            await tz.cover_position_tilt.convertGet(entity, "position", meta);
        }
        else if (key === "brightness") {
            await entity.read("genLevelCtrl", ["currentLevel"]);
        }
        else if (key === "state") {
            await tz.on_off.convertGet(entity, key, meta);
        }
    },
};
const buttonEventExposes = e.action([
    "button_1_single",
    "button_1_double",
    "button_1_hold",
    "button_1_release",
    "button_2_single",
    "button_2_double",
    "button_2_hold",
    "button_2_release",
    "button_3_single",
    "button_3_double",
    "button_3_hold",
    "button_3_release",
    "button_4_single",
    "button_4_double",
    "button_4_hold",
    "button_4_release",
]);
function checkOption(device, options, key) {
    if (options != null && options[key] != null) {
        if (options[key] === "true") {
            return true;
        }
        if (options[key] === "false") {
            return false;
        }
    }
    return checkMetaOption(device, key);
}
function checkMetaOption(device, key) {
    if (!utils.isDummyDevice(device)) {
        const enabled = device.meta[key];
        if (enabled === undefined) {
            return false;
        }
        return !!enabled;
    }
    return false;
}
function setMetaOption(device, key, enabled) {
    if (device != null && key != null) {
        device.meta[key] = enabled;
    }
}
exports.definitions = [
    {
        zigbeeModel: ["zigfred uno"],
        model: "ZFU-1D-CH",
        vendor: "Siglis",
        description: "zigfred uno smart in-wall switch",
        extend: [siglisExtend.addManuSpecificSiglisZigfredCluster()],
        options: [
            e.enum("front_surface_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Front Surface LED enabled"),
            e.enum("relay_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Relay enabled"),
            e.enum("dimmer_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer enabled"),
            e.enum("dimmer_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer dimmable"),
        ],
        exposes: (device, options) => {
            const expose = [];
            expose.push(buttonEventExposes);
            if (checkOption(device, options, "front_surface_enabled")) {
                expose.push(e.light_brightness_colorxy().withEndpoint("l1"));
            }
            if (checkOption(device, options, "relay_enabled")) {
                expose.push(e.switch().withEndpoint("l2"));
            }
            if (checkOption(device, options, "dimmer_enabled")) {
                if (checkOption(device, options, "dimmer_dimming_enabled")) {
                    expose.push(e.light_brightness().withEndpoint("l3"));
                }
                else {
                    expose.push(e.switch().withEndpoint("l3"));
                }
            }
            return expose;
        },
        fromZigbee: [zifgredFromZigbeeButtonEvent, fz.color_colortemp, fz.on_off, fz.brightness, fz.level_config, fz.power_on_behavior],
        toZigbee: [
            tz.light_onoff_brightness,
            tz.light_color,
            tz.ignore_transition,
            tz.ignore_rate,
            tz.light_brightness_move,
            tz.light_brightness_step,
            tz.level_config,
            tz.power_on_behavior,
            tz.light_hue_saturation_move,
            tz.light_hue_saturation_step,
            tz.light_color_options,
            tz.light_color_mode,
        ],
        meta: { multiEndpoint: true },
        endpoint: (device) => {
            return {
                l1: zigfredEndpoint,
                l2: 6,
                l3: 7,
            };
        },
        configure: async (device, coordinatorEndpoint) => {
            if (device != null) {
                const controlEp = device.getEndpoint(zigfredEndpoint);
                const relayEp = device.getEndpoint(6);
                const dimmerEp = device.getEndpoint(7);
                // Bind Control EP (LED)
                setMetaOption(device, "front_surface_enabled", (await controlEp.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "front_surface_enabled")) {
                    await reporting.bind(controlEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl", "manuSpecificSiglisZigfred"]);
                    await reporting.onOff(controlEp);
                    await reporting.brightness(controlEp);
                }
                // Bind Relay EP
                setMetaOption(device, "relay_enabled", (await relayEp.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "relay_enabled")) {
                    await reporting.bind(relayEp, coordinatorEndpoint, ["genOnOff"]);
                    await reporting.onOff(relayEp);
                }
                // Bind Dimmer EP
                setMetaOption(device, "dimmer_enabled", (await dimmerEp.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "dimmer_enabled")) {
                    await reporting.bind(dimmerEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
                    await reporting.onOff(dimmerEp);
                    await reporting.brightness(dimmerEp);
                }
                setMetaOption(device, "dimmer_dimming_enabled", true);
                device.save();
            }
        },
    },
    {
        zigbeeModel: ["zigfred plus"],
        model: "ZFP-1A-CH",
        vendor: "Siglis",
        description: "zigfred plus smart in-wall switch",
        extend: [siglisExtend.addManuSpecificSiglisZigfredCluster()],
        options: [
            e.enum("front_surface_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Front Surface LED enabled"),
            e.enum("dimmer_1_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 1 enabled"),
            e.enum("dimmer_1_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 1 dimmable"),
            e.enum("dimmer_2_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 2 enabled"),
            e.enum("dimmer_2_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 2 dimmable"),
            e.enum("dimmer_3_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 3 enabled"),
            e.enum("dimmer_3_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 3 dimmable"),
            e.enum("dimmer_4_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 4 enabled"),
            e.enum("dimmer_4_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 4 dimmable"),
            e.enum("cover_1_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 1 enabled"),
            e.enum("cover_1_tilt_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 1 tiltable"),
            e.enum("cover_2_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 2 enabled"),
            e.enum("cover_2_tilt_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 2 tiltable"),
        ],
        exposes: (device, options) => {
            const expose = [];
            expose.push(buttonEventExposes);
            if (checkOption(device, options, "front_surface_enabled")) {
                expose.push(e.light_brightness_colorxy().withEndpoint("l1"));
            }
            if (checkOption(device, options, "dimmer_1_enabled")) {
                if (checkOption(device, options, "dimmer_1_dimming_enabled")) {
                    expose.push(e.light_brightness().withEndpoint("l2"));
                }
                else {
                    expose.push(e.switch().withEndpoint("l2"));
                }
            }
            if (checkOption(device, options, "dimmer_2_enabled")) {
                if (checkOption(device, options, "dimmer_2_dimming_enabled")) {
                    expose.push(e.light_brightness().withEndpoint("l3"));
                }
                else {
                    expose.push(e.switch().withEndpoint("l3"));
                }
            }
            if (checkOption(device, options, "dimmer_3_enabled")) {
                if (checkOption(device, options, "dimmer_3_dimming_enabled")) {
                    expose.push(e.light_brightness().withEndpoint("l4"));
                }
                else {
                    expose.push(e.switch().withEndpoint("l4"));
                }
            }
            if (checkOption(device, options, "dimmer_4_enabled")) {
                if (checkOption(device, options, "dimmer_4_dimming_enabled")) {
                    expose.push(e.light_brightness().withEndpoint("l5"));
                }
                else {
                    expose.push(e.switch().withEndpoint("l5"));
                }
            }
            if (checkOption(device, options, "cover_1_enabled")) {
                if (checkOption(device, options, "cover_1_tilt_enabled")) {
                    expose.push(e
                        .cover()
                        .setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
                        .withPosition()
                        .withTilt()
                        .withEndpoint("l6"));
                }
                else {
                    expose.push(e
                        .cover()
                        .setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
                        .withPosition()
                        .withEndpoint("l6"));
                }
            }
            if (checkOption(device, options, "cover_2_enabled")) {
                if (checkOption(device, options, "cover_2_tilt_enabled")) {
                    expose.push(e
                        .cover()
                        .setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
                        .withPosition()
                        .withTilt()
                        .withEndpoint("l7"));
                }
                else {
                    expose.push(e
                        .cover()
                        .setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
                        .withPosition()
                        .withEndpoint("l7"));
                }
            }
            return expose;
        },
        fromZigbee: [
            zifgredFromZigbeeButtonEvent,
            fz.color_colortemp,
            fz.on_off,
            fz.brightness,
            fz.level_config,
            fz.power_on_behavior,
            fz.cover_position_tilt,
        ],
        toZigbee: [
            tz.light_color,
            tz.ignore_transition,
            tz.ignore_rate,
            tz.light_brightness_move,
            tz.light_brightness_step,
            tz.level_config,
            tz.power_on_behavior,
            tz.light_hue_saturation_move,
            tz.light_hue_saturation_step,
            tz.light_color_options,
            tz.light_color_mode,
            coverAndLightToZigbee,
        ],
        meta: { multiEndpoint: true },
        endpoint: (device) => {
            return {
                l1: zigfredEndpoint,
                l2: 7,
                l3: 8,
                l4: 9,
                l5: 10,
                l6: 11,
                l7: 12,
            };
        },
        configure: async (device, coordinatorEndpoint) => {
            if (device != null) {
                // Bind Control EP (LED)
                const controlEp = device.getEndpoint(zigfredEndpoint);
                setMetaOption(device, "front_surface_enabled", (await controlEp.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "front_surface_enabled")) {
                    await reporting.bind(controlEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl", "manuSpecificSiglisZigfred"]);
                    await reporting.onOff(controlEp);
                    await reporting.brightness(controlEp);
                }
                // Bind Dimmer 1 EP
                const dimmer1Ep = device.getEndpoint(7);
                setMetaOption(device, "dimmer_1_enabled", (await dimmer1Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "dimmer_1_enabled")) {
                    await reporting.bind(dimmer1Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
                    await reporting.onOff(dimmer1Ep);
                    await reporting.brightness(dimmer1Ep);
                }
                setMetaOption(device, "dimmer_1_dimming_enabled", true);
                // Bind Dimmer 2 EP
                const dimmer2Ep = device.getEndpoint(8);
                setMetaOption(device, "dimmer_2_enabled", (await dimmer2Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "dimmer_2_enabled")) {
                    await reporting.bind(dimmer2Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
                    await reporting.onOff(dimmer2Ep);
                    await reporting.brightness(dimmer2Ep);
                }
                setMetaOption(device, "dimmer_2_dimming_enabled", true);
                // Bind Dimmer 3 EP
                const dimmer3Ep = device.getEndpoint(9);
                setMetaOption(device, "dimmer_3_enabled", (await dimmer3Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "dimmer_3_enabled")) {
                    await reporting.bind(dimmer3Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
                    await reporting.onOff(dimmer3Ep);
                    await reporting.brightness(dimmer3Ep);
                }
                setMetaOption(device, "dimmer_3_dimming_enabled", true);
                // Bind Dimmer 4 EP
                const dimmer4Ep = device.getEndpoint(10);
                setMetaOption(device, "dimmer_4_enabled", (await dimmer4Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "dimmer_4_enabled")) {
                    await reporting.bind(dimmer4Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
                    await reporting.onOff(dimmer4Ep);
                    await reporting.brightness(dimmer4Ep);
                }
                setMetaOption(device, "dimmer_4_dimming_enabled", true);
                // Bind Cover 1 EP
                const cover1Ep = device.getEndpoint(11);
                setMetaOption(device, "cover_1_enabled", (await cover1Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "cover_1_enabled")) {
                    await reporting.bind(cover1Ep, coordinatorEndpoint, ["closuresWindowCovering"]);
                    await reporting.currentPositionLiftPercentage(cover1Ep);
                    setMetaOption(device, "cover_1_tilt_enabled", (await cover1Ep.read("closuresWindowCovering", ["windowCoveringType"])).windowCoveringType === 0x08);
                    if (checkMetaOption(device, "cover_1_tilt_enabled")) {
                        await reporting.currentPositionTiltPercentage(cover1Ep);
                    }
                }
                else {
                    setMetaOption(device, "cover_1_tilt_enabled", false);
                }
                // Bind Cover 2 EP
                const cover2Ep = device.getEndpoint(12);
                setMetaOption(device, "cover_2_enabled", (await cover2Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled === 1);
                if (checkMetaOption(device, "cover_2_enabled")) {
                    await reporting.bind(cover2Ep, coordinatorEndpoint, ["closuresWindowCovering"]);
                    await reporting.currentPositionLiftPercentage(cover2Ep);
                    setMetaOption(device, "cover_2_tilt_enabled", (await cover2Ep.read("closuresWindowCovering", ["windowCoveringType"])).windowCoveringType === 0x08);
                    if (checkMetaOption(device, "cover_2_tilt_enabled")) {
                        await reporting.currentPositionTiltPercentage(cover2Ep);
                    }
                }
                else {
                    setMetaOption(device, "cover_2_tilt_enabled", false);
                }
                device.save();
            }
        },
    },
];
//# sourceMappingURL=siglis.js.map