{"version":3,"sources":["jsdelivr-header.js","/npm/risco-mqtt-home-assistant@1.1.0/index.js"],"names":[],"mappings":"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","file":"/npm/risco-mqtt-home-assistant@1.1.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/risco-mqtt-home-assistant@1.1.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const mqtt = require('mqtt')\r\nconst nodeRiscoClient = require('node-risco-client')\r\n\r\nconst ALARM_TOPIC = \"riscopanel/alarm\"\r\nconst ALARM_TOPIC_REGEX = /^riscopanel\\/alarm\\/([0-9])*\\/set$/m\r\nconst RISCO_NODE_ID = 'risco-alarm-panel'\r\n\r\nmodule.exports = (config) => {\r\n    let {\r\n        username,\r\n        password,\r\n        pin,\r\n        \"language-id\": languageId,\r\n        \"mqtt-url\": mqttURL,\r\n        \"mqtt-username\": mqttUsername,\r\n        \"mqtt-password\": mqttPassword,\r\n        \"home-assistant-discovery-prefix\": HASSIO_DISCOVERY_PREFIX_TOPIC = 'homeassistant',\r\n        \"interval-polling\": INTERVAL_POLLING = 5000\r\n    } = config\r\n\r\n    if (!username) throw new Error('username options is required')\r\n    if (!password) throw new Error('password options is required')\r\n    if (!pin) throw new Error('pin options is required')\r\n    if (!languageId) throw new Error('languageId options is required')\r\n    if (!mqttURL) throw new Error('mqttURL options is required')\r\n\r\n    const riscoClient = nodeRiscoClient({ username, password, pin, languageId })\r\n    const mqttClient = mqtt.connect(mqttURL, { username: mqttUsername, password: mqttPassword })\r\n\r\n    const alarmPayload = { 1: 'disarmed', 2: 'armed_home', 3: 'armed_away' }\r\n    const sensorPayload = { 0: 'idle', 1: 'triggered' }\r\n\r\n    const disarm = async partitionId => {\r\n        await riscoClient.disarm();\r\n        mqttClient.publish(`${ALARM_TOPIC}/${partitionId}/status`, 'disarmed')\r\n        return Promise.resolve('disarmed')\r\n    }\r\n\r\n    const partiallyArm = async partitionId => {\r\n        await riscoClient.partiallyArm();\r\n        mqttClient.publish(`${ALARM_TOPIC}/${partitionId}/status`, 'armed_home')\r\n        return Promise.resolve('armed_home')\r\n    }\r\n\r\n    const arm = async partitionId => {\r\n        await riscoClient.arm();\r\n        mqttClient.publish(`${ALARM_TOPIC}/${partitionId}/status`, 'armed_away')\r\n        return Promise.resolve('armed_home')\r\n    }\r\n\r\n    const alarmAction = { 'DISARM': disarm, 'ARM_HOME': partiallyArm, 'ARM_NIGHT': partiallyArm, 'ARM_AWAY': arm }\r\n\r\n    const changeAlarmStatus = async (code, partitionId) => {\r\n        return alarmAction[code].call(this, partitionId)\r\n    }\r\n\r\n    const subscribeAlarmStateChange = (partitions) => {\r\n        for (const partition of partitions) {\r\n            console.log(`subscribe on ${ALARM_TOPIC}/${partition.id}/set topic`)\r\n            mqttClient.subscribe(`${ALARM_TOPIC}/${partition.id}/set`)\r\n        }\r\n        setInterval(retrieveAlarmStatus, INTERVAL_POLLING);\r\n    }\r\n\r\n    const publishAlarmStateChange = (partitions) => {\r\n        for (const partition of partitions) {\r\n            let state = partition.armedState\r\n            mqttClient.publish(`${ALARM_TOPIC}/${partition.id}/status`, alarmPayload[state])\r\n            console.log(`published alarm status ${alarmPayload[state]} on partition ${partition.id}`)\r\n        }\r\n    }\r\n\r\n    const publishSensorsStateChange = (zones) => {\r\n        for (const zone of zones) {\r\n            const partitionId = zone.part - 1\r\n            mqttClient.publish(`${ALARM_TOPIC}/${partitionId}/sensor/${zone.zoneID}`, JSON.stringify(zone))\r\n            mqttClient.publish(`${ALARM_TOPIC}/${partitionId}/sensor/${zone.zoneID}/status`, sensorPayload[zone.status])\r\n        }\r\n    }\r\n\r\n    const autoDiscovery = (partitions, zones) => {\r\n        for (const partition of partitions) {\r\n            const payload = {\r\n                'name': `risco-alarm-panel-${partition.id}`,\r\n                'state_topic': `${ALARM_TOPIC}/${partition.id}/status`,\r\n                'command_topic': `${ALARM_TOPIC}/${partition.id}/set`\r\n            }\r\n            mqttClient.publish(`${HASSIO_DISCOVERY_PREFIX_TOPIC}/alarm_control_panel/${RISCO_NODE_ID}/${partition.id}/config`, JSON.stringify(payload))\r\n            console.log(`published alarm_control_panel for homeassistant autodiscovery on partition ${partition.id}`)\r\n        }\r\n\r\n        for (const zone of zones) {\r\n            const partitionId = zone.part - 1\r\n            const nodeId = zone.zoneName.replace(' ', '-')\r\n            const payload = {\r\n                'name': `${zone.zoneName}`,\r\n                'payload_on': 'triggered',\r\n                'payload_off': 'idle',\r\n                'state_topic': `${ALARM_TOPIC}/${partitionId}/sensor/${zone.zoneID}/status`,\r\n                'json_attributes_topic': `${ALARM_TOPIC}/${partitionId}/sensor/${zone.zoneID}`\r\n            }            \r\n            mqttClient.publish(`${HASSIO_DISCOVERY_PREFIX_TOPIC}/binary_sensor/${nodeId}/${zone.zoneID}/config`, JSON.stringify(payload))\r\n        }\r\n        console.log(`published ${zones.length} binary_sensor for homeassistant autodiscovery`)\r\n    }\r\n\r\n    const retrieveAlarmStatus = () => {\r\n        Promise.all([riscoClient.getPartitions(), riscoClient.getZones()]).then(([partitions, zones]) => {\r\n            publishAlarmStateChange(partitions)\r\n            publishSensorsStateChange(zones)\r\n        }).catch(err => {\r\n            console.log(`error during retrieve status fo partitions and zones`)\r\n            console.log(err)\r\n        })\r\n    }\r\n\r\n    mqttClient.on('connect', () => {\r\n        console.log(`connected on mqtt server: ${mqttURL}`)\r\n        Promise.all([riscoClient.getPartitions(), riscoClient.getZones()]).then(([partitions, zones]) => {\r\n            subscribeAlarmStateChange(partitions)\r\n            autoDiscovery(partitions, zones)\r\n        }).catch(err => {\r\n            console.log(`error during get partitions and zones on connect`)\r\n            console.log(err)\r\n            process.exit(1)\r\n        })\r\n    })\r\n\r\n    mqttClient.on('message', (topic, message) => {\r\n        let m;\r\n        if ((m = ALARM_TOPIC_REGEX.exec(topic)) !== null) {\r\n            m.filter((match, groupIndex) => groupIndex !== 0).forEach((partitionId) => {\r\n                const command = message.toString()\r\n                console.log(`received change state command ${command} on topic ${topic} in partition ${partitionId}`)\r\n                changeAlarmStatus(command, partitionId).then(result => {\r\n                    console.log(`changed state to ${result} on partiton ${partitionId}`)\r\n                }).catch(err => {\r\n                    console.log(`error during state change command ${command} on topic ${topic} in partition ${partitionId}`)\r\n                    console.log(err)\r\n                })\r\n            });\r\n        }\r\n    })\r\n}"]}