/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/iobroker.hm-rega@5.1.0/main.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
"use strict";const utils=require("@iobroker/adapter-core"),words=require("./lib/enumNames"),crypto=require("./lib/crypto"),Rega=require("./lib/rega"),helper=require("./lib/utils"),fs=require("node:fs");let existingDevices=[];const LOWBAT_ALARM_IDS=["LOWBAT_ALARM","LOW_BAT_ALARM"],LOWBAT_ACTIVE_INDICATOR=1,adapterName=require("./package.json").name.split(".").pop();let afterReconnect=null;const FORBIDDEN_CHARS=/[\][*,;'"`<>\\?]/g;let HM_RPC_REGEX,adapter,rega,ccuReachable,ccuRegaUp,pollingInterval,pollingIntervalDC,pollingTrigger;function startAdapter(e){return e=e||{},Object.assign(e,{name:adapterName,stateChange:async(e,a)=>{if(!a||a.ack)a&&e===pollingTrigger&&(adapter.log.info("pollingTrigger"),adapter.config.syncVariables&&pollVariables());else if(e.match(/_ALARM$/))setTimeout(acknowledgeAlarm,100,e);else if(e===`${adapter.config.rfdAdapter}.updated`||e===`${adapter.config.virtualDevicesAdapter}.updated`||e===`${adapter.config.cuxdAdapter}.updated`||e===`${adapter.config.hmipAdapter}.updated`||e===`${adapter.config.hs485dAdapter}.updated`){if(a.val){setTimeout((()=>getDevices()),1e3);try{await adapter.setForeignStateAsync(e,!1,!0)}catch{}}}else if(e===`${adapter.config.rfdAdapter}.info.connection`||e===`${adapter.config.virtualDevicesAdapter}.info.connection`||e===`${adapter.config.cuxdAdapter}.info.connection`||e===`${adapter.config.hmipAdapter}.info.connection`||e===`${adapter.config.hs485dAdapter}.info.connection`)a.val?afterReconnect||(adapter.log.debug(`Connection of "${e}" detected. Read variables anew in 60 seconds`),afterReconnect=setTimeout((()=>{afterReconnect=null,adapter.config.syncVariables&&getVariables()}),6e4)):afterReconnect&&(adapter.log.debug(`Disconnection of "${e}" detected. Cancel read of variables`),clearTimeout(afterReconnect),afterReconnect=null);else{adapter.log.debug(`stateChange ${e} ${JSON.stringify(a)}`);const t=e.split(".");if("ProgramExecute"===t[3])a.val&&(adapter.log.debug(`ProgramExecute ${t[2]}`),states[e]={ack:!1},rega.script(`dom.GetObject(${t[2]}).ProgramExecute();`));else if("Active"===t[3])adapter.log.debug(`Active ${t[2]} ${a.val}`),states[e]={ack:!1},rega.script(`dom.GetObject(${t[2]}).Active(${JSON.stringify(a.val)})`);else{if("alarms"===t[2]&&(t[2]=40),"maintenance"===t[2]&&(t[2]=41),!states[e]&&e!==pollingTrigger)return void(e.match(/\.updated$/)||adapter.log.warn(`Got unexpected ID: ${e}`));adapter.log.debug(`Set state ${t[2]}: ${a.val}`),states[e]={ack:!1},rega.script(`dom.GetObject(${t[2]}).State(${JSON.stringify(a.val)})`)}}},unload:stop,message:e=>{adapter.log.debug(`[MSSG] Received: ${JSON.stringify(e)}`),ccuRegaUp?rega.script(e.message,(a=>{adapter.sendTo(e.from,e.command,{result:a,error:null},e.callback)})):adapter.sendTo(e.from,e.command,{result:null,error:"Not connected"},e.callback)},ready:async()=>{if(adapter.config.useHttps)try{const e=await adapter.getForeignObjectAsync("system.config");e&&e.native&&e.native.secret?(adapter.config.password=crypto.decrypt(e.native.secret,adapter.config.password),adapter.config.username=crypto.decrypt(e.native.secret,adapter.config.username)):(adapter.config.password=crypto.decrypt("Zgfr56gFe87jJOM",adapter.config.password),adapter.config.username=crypto.decrypt("Zgfr56gFe87jJOM",adapter.config.username))}catch(e){adapter.log.warn(`Could not decrypt credentials: ${e.message}`)}try{await adapter.setForeignObjectNotExistsAsync("hm-rega",{type:"meta",common:{name:"hm-rega",type:"meta.folder"},native:{}});const e=fs.readdirSync(`${__dirname}/regascripts/`);for(const a of e){const e=fs.readFileSync(`${__dirname}/regascripts/${a}`,"utf-8");let t;try{t=await adapter.readFileAsync("hm-rega",`regascripts/${a}`)}catch(e){adapter.log.debug(`[REGASCRIPTS] Script ${a} does not exist in file storage yet`)}t&&t.file===e?adapter.log.debug(`[REGASCRIPTS] Script ${a} is already up-to-date`):(await adapter.writeFileAsync("hm-rega",`regascripts/${a}`,e,{mimeType:"text/plain"}),adapter.log.info(`[REGASCRIPTS] Successfully updated ${a}`))}}catch(e){adapter.log.warn(`[REGASCRIPTS] Error updating scripts: ${e.message}`)}HM_RPC_REGEX=getRegex(),main()}}),adapter=new utils.Adapter(e),adapter}const checkInterval={};let units={};const states={},objects={};let existingStates=[];function _unescape(e){if("string"!=typeof e)return e;if(!e)return"";for(const a of helper.chars)e=e.replace(a.regex,a.replace);try{return decodeURI(e)}catch(a){return adapter.log.error(`Cannot decode :${e}`),e}}function checkInit(e){adapter.getForeignObject(`system.adapter.${e}`,((a,t)=>{if(t&&t.native&&t.native.checkInit&&t.native.checkInitTrigger){const a=parseInt(t.native.checkInitInterval,10);"BidCos-RF:50.PRESS_LONG"===t.native.checkInitTrigger&&(t.native.checkInitTrigger="BidCos-RF.BidCoS-RF:50.PRESS_LONG");const r=t.native.checkInitTrigger;checkInterval[e]||(checkInterval[e]=setInterval((()=>{rega&&(adapter.log.debug(`Set check init state ${r} to true`),rega.script(`dom.GetObject("${r}").State(1);`))}),500*a))}}))}function main(){adapter.config.reconnectionInterval=Math.round(adapter.config.reconnectionInterval)||30,adapter.config.pollingTrigger&&(adapter.config.pollingTrigger=adapter.config.pollingTrigger.replace(":",".").replace(FORBIDDEN_CHARS,"_"),pollingTrigger=adapter.config.pollingTrigger.match(/^BidCoS-RF/)?`${adapter.config.rfdAdapter}.${adapter.config.pollingTrigger}`:`${adapter.config.hs485dAdapter}.${adapter.config.pollingTrigger}`,adapter.log.info(`subscribe ${pollingTrigger}`),adapter.subscribeForeignStates(pollingTrigger)),adapter.subscribeStates("*"),adapter.config.rfdAdapter&&adapter.config.rfdEnabled&&(adapter.subscribeForeignStates(`${adapter.config.rfdAdapter}.updated`),adapter.subscribeForeignStates(`${adapter.config.rfdAdapter}.info.connection`),adapter.subscribeForeignStates(`${adapter.config.rfdAdapter}.*_ALARM`),checkInit(adapter.config.rfdAdapter)),adapter.config.cuxdAdapter&&adapter.config.cuxdEnabled&&(adapter.subscribeForeignStates(`${adapter.config.cuxdAdapter}.updated`),adapter.subscribeForeignStates(`${adapter.config.cuxdAdapter}.info.connection`),adapter.subscribeForeignStates(`${adapter.config.cuxdAdapter}.*_ALARM`),checkInit(adapter.config.rfdAdapter)),adapter.config.hmipAdapter&&adapter.config.hmipEnabled&&(adapter.subscribeForeignStates(`${adapter.config.hmipAdapter}.updated`),adapter.subscribeForeignStates(`${adapter.config.hmipAdapter}.info.connection`),adapter.subscribeForeignStates(`${adapter.config.hmipAdapter}.*_ALARM`),checkInit(adapter.config.rfdAdapter)),adapter.config.hs485dAdapter&&adapter.config.hs485dEnabled&&(adapter.subscribeForeignStates(`${adapter.config.hs485dAdapter}.updated`),adapter.subscribeForeignStates(`${adapter.config.hs485dAdapter}.info.connection`),adapter.subscribeForeignStates(`${adapter.config.hs485dAdapter}.*_ALARM`),checkInit(adapter.config.rfdAdapter)),adapter.config.virtualDevicesAdapter&&adapter.config.virtualDevicesEnabled&&(adapter.subscribeForeignStates(`${adapter.config.virtualDevicesAdapter}.updated`),adapter.subscribeForeignStates(`${adapter.config.virtualDevicesAdapter}.info.connection`),adapter.subscribeForeignStates(`${adapter.config.virtualDevicesAdapter}.*_ALARM`),checkInit(adapter.config.rfdAdapter)),!adapter.config.useHttps||adapter.config.homematicPort&&8181!==adapter.config.homematicPort||(adapter.config.homematicPort=48181),rega=new Rega({ccuIp:adapter.config.homematicAddress,webinterfacePort:adapter.config.webinterfacePort||(adapter.config.useHttps?443:80),port:adapter.config.homematicPort,reconnectionInterval:adapter.config.reconnectionInterval,logger:adapter.log,readFileAsync:adapter.readFileAsync,secure:adapter.config.useHttps,username:adapter.config.username,password:adapter.config.password,ready:async e=>{if("ReGaHSS down"===e){adapter.log.error(`ReGaHSS ${adapter.config.homematicAddress} down`),ccuReachable=!0,ccuRegaUp=!1;try{await adapter.setState("info.connection",!1,!0),await adapter.setState("info.ccuReachable",ccuReachable,!0),await adapter.setState("info.ccuRegaUp",ccuRegaUp,!0)}catch{}}else if("CCU unreachable"===e){adapter.log.error(`CCU ${adapter.config.homematicAddress} unreachable`),ccuReachable=!1,ccuRegaUp=!1;try{await adapter.setState("info.connection",!1,!0),await adapter.setState("info.ccuReachable",ccuReachable,!0),await adapter.setState("info.ccuRegaUp",ccuRegaUp,!0)}catch{}}else if(e){adapter.log.error(e),ccuReachable=!1,ccuRegaUp=!1;try{await adapter.setState("info.connection",!1,!0),await adapter.setState("info.ccuReachable",ccuReachable,!0),await adapter.setState("info.ccuRegaUp",ccuRegaUp,!0)}catch{}}else{adapter.log.info(`ReGaHSS ${adapter.config.homematicAddress} up`),ccuReachable=!0,ccuRegaUp=!0;try{await adapter.setState("info.connection",!0,!0),await adapter.setState("info.ccuReachable",ccuReachable,!0),await adapter.setState("info.ccuRegaUp",ccuRegaUp,!0)}catch{}await rega.checkTime(),adapter.config.syncVariables&&await getServiceMsgs(),await getDevices(),await getDatapoints(),adapter.config.syncDutyCycle&&await getDutyCycle(),adapter.config.syncVariables&&await getVariables(),adapter.config.syncPrograms&&await getPrograms(),adapter.config.syncRooms&&adapter.config.enumRooms&&await getRooms(),adapter.config.syncFunctions&&adapter.config.enumFunctions&&await getFunctions(),adapter.config.syncFavorites&&adapter.config.enumFavorites&&await getFavorites()}}})}async function pollVariables(){let e=await rega.runScriptFile(adapter.config.showInvSysVar?"pollingInv":"polling");if(e){try{e=JSON.parse(e.replace(/\n/gm,"").replace(/-inf|nan/g,null))}catch(a){return void adapter.log.error(`Cannot parse answer for polling: ${e}`)}for(let a of Object.keys(e)){let t=e[a][0];const r=new Date(e[a][1]).getTime();"string"==typeof t&&(t=_unescape(t)),a=_unescape(a).replace(FORBIDDEN_CHARS,"_"),"40"===a?a="alarms":"41"===a&&(a="maintenance");const n=`${adapter.namespace}.${a}`;if("maintenance"!==a||states[n]&&states[n].val===t||setTimeout(pollServiceMsgs,1e3),!objects[n])return adapter.log.info(`Variable received for not-known dp ${a}, requesting Variables`),void await getVariables();if(!states[n]||!states[n].ack||states[n].val!==t||states[n].ts&&states[n].ts!==r){states[n]={val:t,ack:!0,ts:r};try{await adapter.setForeignStateAsync(n,t,!0)}catch{}}}}}async function pollDutyCycle(){let e=await rega.runScriptFile("dutycycle"),a=await rega.runScriptFile("system");if(!e)return;try{a=JSON.parse(a)}catch(e){return void adapter.log.error(`Cannot parse system info: ${a}`)}const t=`CCU${"string"==typeof a.ccuVersion?a.ccuVersion.split(".")[0]:""}`;try{e=JSON.parse(convertDataToJSONArray(e))}catch(a){return void adapter.log.error(`Cannot parse answer for dutycycle: ${e}`)}let r;for(const n of e){if(r=_unescape(n.ADDRESS).replace(FORBIDDEN_CHARS,"_"),n.DUTY_CYCLE){const e=parseInt(n.DUTY_CYCLE);updateNewState(`${adapter.namespace}.${r}.0.DUTY_CYCLE`,-1===e?null:e),adapter.log.debug(`Dutycycle: ${adapter.namespace}.${r}.0.DUTY_CYCLE => ${e}`)}n.CONNECTED&&(updateNewState(`${adapter.namespace}.${r}.0.CONNECTED`,parseInt(n.CONNECTED)),adapter.log.debug(`Dutycycle: ${adapter.namespace}.${r}.0.CONNECTED => ${parseInt(n.CONNECTED)}`)),n.DEFAULT&&(updateNewState(`${adapter.namespace}.${r}.0.DEFAULT`,parseInt(n.DEFAULT)),adapter.log.debug(`Dutycycle: ${adapter.namespace}.${r}.0.DEFAULT => ${parseInt(n.DEFAULT)}`)),a.ccuVersion&&(updateNewState(`${adapter.namespace}.${r}.0.FIRMWARE_VERSION`,a.ccuVersion),adapter.log.debug(`Dutycycle: ${adapter.namespace}.${r}.0.FIRMWARE_VERSION => ${a.ccuVersion}`)),a.regaVersion&&(updateNewState(`${adapter.namespace}.${r}.0.regaVersion`,a.regaVersion),adapter.log.debug(`Rega Version: ${adapter.namespace}.${r}.0.regaVersion => ${a.regaVersion}`)),a.buildLabel&&(updateNewState(`${adapter.namespace}.${r}.0.buildLabel`,a.buildLabel),adapter.log.debug(`Build Label: ${adapter.namespace}.${r}.0.buildLabel => ${a.buildLabel}`)),a.countDevices&&(updateNewState(`${adapter.namespace}.${r}.0.countDevices`,a.countDevices),adapter.log.debug(`Count Devices: ${adapter.namespace}.${r}.0.countDevices => ${a.countDevices}`)),a.countChannels&&(updateNewState(`${adapter.namespace}.${r}.0.countChannels`,a.countChannels),adapter.log.debug(`Count Channels: ${adapter.namespace}.${r}.0.countChannels => ${a.countChannels}`)),a.countDatapoints&&(updateNewState(`${adapter.namespace}.${r}.0.countDatapoints`,a.countDatapoints),adapter.log.debug(`Count Datapoints: ${adapter.namespace}.${r}.0.countDatapoints => ${a.countDatapoints}`)),a.countPrograms&&(updateNewState(`${adapter.namespace}.${r}.0.countPrograms`,a.countPrograms),adapter.log.debug(`Count Programs: ${adapter.namespace}.${r}.0.countPrograms => ${a.countPrograms}`)),a.countSystemVars&&(updateNewState(`${adapter.namespace}.${r}.0.countSystemVariables`,a.countSystemVars),adapter.log.debug(`Count System variables: ${adapter.namespace}.${r}.0.countSystemVariables => ${a.countSystemVars}`));const e={_id:`${adapter.namespace}.${r}`,type:"device",common:{name:t},native:{ADDRESS:_unescape(n.ADDRESS),TYPE:t}},o=await adapter.getObjectAsync(e._id);o&&o.common&&e.common.name===o.common.name||adapter.extendForeignObject(e._id,e)}}async function pollPrograms(){let e=await rega.runScriptFile("programs");if(e){try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for programs: ${e}`)}for(const a of Object.keys(e)){const t=_unescape(a).replace(FORBIDDEN_CHARS,"_"),r=e[a].Active,n=`${adapter.namespace}.${t}.Active`;if(!objects[n])return adapter.log.info(`Program received for not-known dp ${t}, requesting programs`),void await getPrograms();if(!states[n]||!states[n].ack||states[n].val!==r){states[n]={val:r,ack:!0};try{await adapter.setForeignStateAsync(n,states[n])}catch{}}}}}async function pollServiceMsgs(){adapter.log.debug("polling service messages");let e=await rega.runScriptFile("alarms");if(!e)return;try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for alarms: ${e}`)}const a=[];for(const t of Object.keys(e)){let r,n=_unescape(e[t].Name);n.match(/^AL-/)&&(n=n.substring(3));try{r=existingDevices.find((e=>n.split(":")[0]===e.split(".")[2])).split(".")[1]}catch{adapter.log.debug(`No instance found for ${n}`);continue}if(n=`hm-rpc.${r}.${n.replace(":",".").replace(FORBIDDEN_CHARS,"_")}_ALARM`,!objects[n])return adapter.log.info(`Alarm DP received for not-known dp ${n}, requesting Service Messages`),void await getServiceMsgs();const o={val:e[t].AlState,ack:!0,lc:new Date(e[t].AlOccurrenceTime).getTime(),ts:new Date(e[t].LastTriggerTime).getTime()};if(LOWBAT_ALARM_IDS.some((e=>n.endsWith(`.${e}`)))&&1===o.val){const[e,t,r]=n.split(".");a.push(`${e}.${t}.${r}`)}if(!states[n]||!states[n].ack||states[n].val!==o.val||states[n].lc!==o.lc||states[n].ts!==o.ts){states[n]=o;try{await adapter.setForeignStateAsync(n,o)}catch{}}}return registerLowBatNotification(a)}function acknowledgeAlarm(e){adapter.log.debug(`[INFO] Acknowledge alarm ${e}`),states[e]={ack:!1},adapter.getForeignObject(e,((e,a)=>{a?.native&&(rega.script(`dom.GetObject(${a.native.DP}).AlReceipt();`),setTimeout(pollServiceMsgs,1e3))}))}async function getServiceMsgs(){try{const e=await adapter.getObjectViewAsync("system","device",{startkey:"hm-rpc.",endkey:"hm-rpc.香"});existingDevices=e.rows.map((e=>e.id))}catch(e){adapter.log.error(`Could not determine existing devices: ${e.message}`)}adapter.log.debug("create service messages");let e=await rega.runScriptFile("alarms");if(!e)return;try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for alarms: ${e}`)}const a=[];for(const t of Object.keys(e)){let r,n=_unescape(e[t].Name);n.match(/^AL-/)&&(n=n.substring(3));try{r=existingDevices.find((e=>n.split(":")[0]===e.split(".")[2])).split(".")[1]}catch{adapter.log.debug(`No instance found for ${n}`);continue}if(n=`hm-rpc.${r}.${n.replace(":",".").replace(FORBIDDEN_CHARS,"_")}_ALARM`,!objects[n]){objects[n]=!0;try{const e=await adapter.getForeignObjectAsync(n.substring(0,n.lastIndexOf("."))),a=e&&e.common&&e.common.name?`${e.common.name}.${n.split(".")[4]}`:n,r=await adapter.getForeignObjectAsync(n);r&&r.native&&r.native.DP===t&&r.common&&"number"===r.common.type||await adapter.setForeignObjectAsync(n,{type:"state",common:{name:a,type:"number",role:"indicator.alarm",read:!0,write:!0,def:0,states:{0:"NO ALARM",1:"ALARM",2:"ACKNOWLEDGED"}},native:{Name:a,TypeName:"ALARM",DP:t}})}catch(e){adapter.log.error(`Could not update object of "${n}": ${e.message}`)}}const o={val:e[t].AlState,ack:!0,lc:new Date(e[t].AlOccurrenceTime).getTime(),ts:new Date(e[t].LastTriggerTime).getTime()};if(LOWBAT_ALARM_IDS.some((e=>n.endsWith(`.${e}`)))&&1===o.val){const[e,t,r]=n.split(".");a.push(`${e}.${t}.${r}`)}if(!states[n]||!states[n].ack||states[n].val!==o.val||states[n].lc!==o.lc||states[n].ts!==o.ts){states[n]=o;try{await adapter.setForeignStateAsync(n,o)}catch(e){adapter.log.error(`Could not update state of "${n}": ${e.message}`)}}}return registerLowBatNotification(a)}async function registerLowBatNotification(e){const a=await Promise.all(e.map((async e=>{const a=await adapter.getForeignObjectAsync(e);return a?"string"==typeof a.common.name?a.common.name:a.common.name.en:e}))),t=JSON.stringify(a),r=await adapter.getStateAsync("info.lowbatDevices");await adapter.setState("info.lowbatDevices",t,!0);const n="string"==typeof r?.val?JSON.parse(r.val):[];a.some((e=>!n.includes(e)))&&await adapter.registerNotification("hm-rega","lowbat",a.join(", "))}async function getPrograms(){try{const e=await adapter.getObjectViewAsync("hm-rega","programs",{startkey:`hm-rega.${adapter.instance}.`,endkey:`hm-rega.${adapter.instance}.香`}),a=[];if(e){for(const t of e.rows){const e=t.value._id.split(".").pop();a.push(e)}adapter.log.info(`got ${e.rows.length} programs`)}else adapter.log.info("got 0 programs");let t=await rega.runScriptFile("programs");try{t=JSON.parse(t.replace(/\n/gm,""))}catch(e){return void adapter.log.error(`Cannot parse answer for programs: ${t}`)}let r,n=0;for(const e of Object.keys(t)){r=_unescape(e).replace(FORBIDDEN_CHARS,"_"),n+=1;let o=`${adapter.namespace}.${r}`;objects[o]||(objects[o]=!0,await adapter.setForeignObjectAsync(o,{type:"channel",common:{name:_unescape(t[e].Name),enabled:!0},native:{Name:_unescape(t[e].Name),TypeName:t[e].TypeName,PrgInfo:_unescape(t[e].DPInfo)}}));const c=t[e].Active;o=`${adapter.namespace}.${r}.ProgramExecute`,objects[o]||(objects[o]=!0,await adapter.extendForeignObjectAsync(o,{type:"state",common:{name:`${_unescape(t[e].Name)} execute`,type:"boolean",role:"action.execute",read:!0,write:!0},native:{}})),states[o]&&states[o].ack&&!1===states[o].val||(states[o]={val:!1,ack:!0},await adapter.setForeignStateAsync(o,states[o])),o=`${adapter.namespace}.${r}.Active`,objects[o]||(objects[o]=!0,await adapter.extendForeignObjectAsync(o,{type:"state",common:{name:`${_unescape(t[e].Name)} enabled`,type:"boolean",role:"state.enabled",read:!0,write:!0},native:{}})),states[o]&&states[o].ack&&states[o].val===c||(states[o]={val:c,ack:!0},await adapter.setForeignStateAsync(o,states[o])),a.includes(r)&&a.splice(a.indexOf(r),1)}adapter.log.info(`added/updated ${n} programs`);for(const e of a)await adapter.delObjectAsync(e,{recursive:!0});adapter.log.info(`deleted ${a.length} programs`)}catch(e){adapter.log.error(`Could not update programs: ${e.message}`)}}async function getFunctions(){let e=await rega.runScriptFile("functions");adapter.log.info(`update functions to ${adapter.config.enumFunctions}`);try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for functions: ${e}`)}for(const a of Object.keys(e)){const t=[],r=e[a].Channels;let n;for(const e of r){switch(e.Interface){case"BidCos-RF":if(!adapter.config.rfdEnabled)continue;n=`${adapter.config.rfdAdapter}.`;break;case"BidCos-Wired":if(!adapter.config.hs485dEnabled)continue;n=`${adapter.config.hs485dAdapter}.`;break;case"CUxD":if(!adapter.config.cuxdEnabled)continue;n=`${adapter.config.cuxdAdapter}.`;break;case"HmIP-RF":if(!adapter.config.hmipEnabled)continue;n=`${adapter.config.hmipAdapter}.`;break;case"VirtualDevices":if(!adapter.config.virtualDevicesEnabled)continue;n=`${adapter.config.virtualDevicesAdapter}.`;break;default:continue}n+=e.Address.replace(":",".").replace(FORBIDDEN_CHARS,"_"),t.push(n)}const o=_unescape(e[a].Name).replace(/\./g,"_"),c=_unescape(e[a].EnumInfo),s={_id:`${adapter.config.enumFunctions}.${words[o]?words[o].en.replace(FORBIDDEN_CHARS,"_").replace(/\s/g,"_"):o}`,desc:c,type:"enum",common:{name:words[o]||o,members:t},native:{Name:o,TypeName:"ENUM",EnumInfo:c}};let i;try{i=await adapter.getForeignObjectAsync(s._id)}catch(e){return void adapter.log.error(`Could not update enum ${s._id}: ${e.message}`)}let d=!1;if(i){s.common=s.common||{},s.common.members=s.common.members||[],i.common=i.common||{},i.common.members=i.common.members||[];for(const e of s.common.members)i.common.members.includes(e)||(d=!0,i.common.members.push(e),adapter.log.info(`${e} has been added to functions ${o}`));for(let e=i.common.members.length;e>=0;e--){const a=i.common.members[e];!s.common.members.includes(a)&&HM_RPC_REGEX.test(a)&&(d=!0,i.common.members.splice(e,1),adapter.log.info(`${a} has been removed from functions ${o}`))}}else i=s,d=!0;d&&await adapter.setForeignObjectAsync(s._id,i)}await adapter.setForeignObjectNotExistsAsync(adapter.config.enumFunctions,{type:"enum",common:{name:"Functions",members:[]},native:{}})}async function getRooms(){let e=await rega.runScriptFile("rooms");adapter.log.info(`update rooms to ${adapter.config.enumRooms}`);try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for rooms: ${e}`)}for(const a of Object.keys(e)){const t=[],r=e[a].Channels;let n;for(const e of r){switch(e.Interface){case"BidCos-RF":if(n=`${adapter.config.rfdAdapter}.`,!adapter.config.rfdAdapter)continue;break;case"BidCos-Wired":if(n=`${adapter.config.hs485dAdapter}.`,!adapter.config.hs485dAdapter)continue;break;case"CUxD":if(n=`${adapter.config.cuxdAdapter}.`,!adapter.config.cuxdAdapter)continue;break;case"HmIP-RF":if(n=`${adapter.config.hmipAdapter}.`,!adapter.config.hmipAdapter)continue;break;case"VirtualDevices":if(n=`${adapter.config.virtualDevicesAdapter}.`,!adapter.config.virtualDevicesEnabled)continue;break;default:continue}n+=_unescape(e.Address).replace(":",".").replace(FORBIDDEN_CHARS,"_"),t.push(n)}const o=_unescape(e[a].Name).replace(/\./g,"_"),c=_unescape(e[a].EnumInfo),s={_id:`${adapter.config.enumRooms}.${words[o]?words[o].en.replace(FORBIDDEN_CHARS,"_").replace(/\s/g,"_"):o}`,type:"enum",common:{name:words[o]||o,desc:c,members:t},native:{Name:o,TypeName:"ENUM",EnumInfo:c}};let i;try{i=await adapter.getForeignObjectAsync(s._id)}catch(e){return void adapter.log.error(`Could not update enum ${s._id}: ${e.message}`)}let d=!1;if(i){i.common=i.common||{},i.common.members=i.common.members||[];for(const e of s.common.members)i.common.members.includes(e)||(d=!0,i.common.members.push(e),adapter.log.info(`${e} has been added to room ${o}`));for(let e=i.common.members.length;e>=0;e--){const a=i.common.members[e];!s.common.members.includes(a)&&HM_RPC_REGEX.test(a)&&(d=!0,i.common.members.splice(e,1),adapter.log.info(`${a} has been removed from room ${o}`))}}else i=s,d=!0;d&&await adapter.setForeignObjectAsync(s._id,i)}await adapter.setForeignObjectNotExistsAsync(adapter.config.enumRooms,{type:"enum",common:{name:"Rooms",members:[]},native:{}})}async function getFavorites(){let e=await rega.runScriptFile("favorites");adapter.log.info(`update favorites to ${adapter.config.enumFavorites}`);try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for favorites: ${e}`)}await adapter.setForeignObjectNotExistsAsync(adapter.config.enumFavorites,{type:"enum",common:{name:"Favorites"},native:{}});for(const a of Object.keys(e)){const t=_unescape(a).replace(FORBIDDEN_CHARS,"_");if(""!==t){try{await adapter.setForeignObjectNotExistsAsync(`${adapter.config.enumFavorites}.${t}`,{type:"enum",common:{name:`${t} Favorites`},native:{}})}catch(e){adapter.log.error(`Could not synchronize favorites of user "${t}": ${e.message}`)}for(const r of Object.keys(e[a])){const n=e[a][r].Channels,o=[];for(const e of n)if("number"==typeof e)o.push(`${adapter.namespace}.${e}`);else{let a;switch(e.Interface){case"BidCos-RF":if(a=`${adapter.config.rfdAdapter}.`,!adapter.config.rfdAdapter)continue;break;case"BidCos-Wired":if(a=`${adapter.config.hs485dAdapter}.`,!adapter.config.hs485dAdapter)continue;break;case"CUxD":if(a=`${adapter.config.cuxdAdapter}.`,!adapter.config.cuxdAdapter)continue;break;case"HmIP-RF":if(a=`${adapter.config.hmipAdapter}.`,!adapter.config.hmipAdapter)continue;break;case"VirtualDevices":if(a=`${adapter.config.virtualDevicesAdapter}.`,!adapter.config.virtualDevicesEnabled)continue;break;default:continue}a+=_unescape(e.Address).replace(":",".").replace(FORBIDDEN_CHARS,"_"),o.push(a)}const c={_id:`${adapter.config.enumFavorites}.${t}.${_unescape(r)}`.replace(FORBIDDEN_CHARS,"_"),type:"enum",common:{name:_unescape(r),members:o},native:{user:t,id:e[a][r].id,TypeName:"FAVORITE"}};let s;try{s=await adapter.getForeignObjectAsync(c._id)}catch(e){return void adapter.log.error(`Could not update enum ${c._id}: ${e.message}`)}let i=!1;if(s){s.common=s.common||{},s.common.members=s.common.members||[];for(const e of c.common.members)s.common.members.includes(e)||(i=!0,s.common.members.push(e),adapter.log.info(`${e} has been added to favorites for "${t}" on list "${_unescape(r)}"`));for(let e=s.common.members.length;e>=0;e--){const a=s.common.members[e];!c.common.members.includes(a)&&HM_RPC_REGEX.test(a)&&(i=!0,s.common.members.splice(e,1),adapter.log.info(`${a} has been removed from favorites for "${t}" on list "${_unescape(r)}"`))}}else s=c,i=!0;i&&await adapter.setForeignObjectAsync(c._id,s)}}else adapter.log.debug("Skip favorites of empty user")}}async function getDatapoints(){adapter.log.info("request state values");let e=await rega.runScriptFile("datapoints");try{e=JSON.parse(e.replace(/\n/gm,""))}catch(a){return void adapter.log.error(`Cannot parse answer for datapoints: ${e}`)}for(const a of Object.keys(e)){const t=_unescape(a).replace(FORBIDDEN_CHARS,"_").split(".");if("PRESS_SHORT"===t[2]||"PRESS_LONG"===t[2])continue;let r;switch(t[0]){case"BidCos-RF":if(!adapter.config.rfdEnabled)continue;r=`${adapter.config.rfdAdapter}.`;break;case"BidCos-Wired":if(!adapter.config.hs485dEnabled)continue;r=`${adapter.config.hs485dAdapter}.`;break;case"CUxD":if(!adapter.config.cuxdEnabled)continue;r=`${adapter.config.cuxdAdapter}.`;break;case"HmIP-RF":if(!adapter.config.hmipEnabled)continue;r=`${adapter.config.hmipAdapter}.`;break;case"VirtualDevices":if(!adapter.config.virtualDevicesEnabled)continue;r=`${adapter.config.virtualDevicesAdapter}.`;break;default:continue}if(r+=`${t[1].replace(":",".").replace(FORBIDDEN_CHARS,"_")}.${t[2].replace(FORBIDDEN_CHARS,"_")}`,null===units){adapter.log.error(`Units is null at getDatapoints, (id: ${r}) please report this to developer with steps to reproduce`);continue}("100%"===units[r]||units[r]&&"100%"===units[r].UNIT)&&(e[a]=Math.round(100*parseFloat(e[a])*1e3)/1e3);const n={val:_unescape(e[a]),ack:!0};states[r]&&states[r].val===n.val&&states[r].ack||(states[r]=n,existingStates.includes(r)?await adapter.setForeignStateAsync(r,n):adapter.log.debug(`Do not set "${JSON.stringify(n)}" to "${r}", because non-existing in corresponding adapter`))}adapter.log.info("Updated all datapoints"),units=null,existingStates=[]}async function _getDevicesFromRega(e,a,t){let r=await rega.runScriptFile("devices");try{r=JSON.parse(r.replace(/\n/gm,""))}catch(e){return void adapter.log.error(`Cannot parse answer for devices: ${r}`)}const n=[];let o;for(const c of Object.keys(r)){switch(r[c].Interface){case"BidCos-RF":if(!adapter.config.rfdEnabled)continue;o=`${adapter.config.rfdAdapter}.`;break;case"BidCos-Wired":if(!adapter.config.hs485dEnabled)continue;o=`${adapter.config.hs485dAdapter}.`;break;case"CUxD":if(!adapter.config.cuxdEnabled)continue;o=`${adapter.config.cuxdAdapter}.`;break;case"HmIP-RF":if(!adapter.config.hmipEnabled)continue;o=`${adapter.config.hmipAdapter}.`;break;case"VirtualDevices":if(!adapter.config.virtualDevicesEnabled)continue;o=`${adapter.config.virtualDevicesAdapter}.`;break;default:continue}const s=_unescape(c);o+=s.replace(":",".").replace(FORBIDDEN_CHARS,"_");let i=_unescape(r[c].Name);if(c.includes(":")){if(i.endsWith(` ${s}`)){const a=o.split("."),t=a.pop(),r=a.join(".");e[r]&&(i=`${e[r]}:${t}`)}if(void 0===a[o]||a[o]!==i&&adapter.config.syncNames)n.push({_id:o,type:"channel",common:{name:i}});else if(!a[o]){let a=o.split(".");const t=a.pop();a=a.join("."),e[a]&&n.push({_id:o,type:"channel",common:{name:`${e[a]}.${t}`}})}if(t[o])for(const e of Object.keys(t[o])){const a=`${i}.${e}`;(!t[o][e]||t[o][e]!==a&&adapter.config.syncNames)&&n.push({_id:`${o}.${e}`,type:"state",common:{name:a}})}}else(void 0===e[o]||e[o]!==i&&adapter.config.syncNames)&&n.push({_id:o,type:"device",common:{name:i}})}for(const e of n)try{await adapter.extendForeignObjectAsync(e._id,e),adapter.log.info(`renamed ${e._id} to "${e.common.name}"`)}catch(a){adapter.log.warn(`Could not rename object ${e._id} to "${e.common.name}": ${a.message}`)}}async function getDevices(){const e=[],a={},t={},r={};async function n(e){try{const a=await adapter.getObjectViewAsync("system","device",{startkey:`${e}.`,endkey:`${e}.香`});if(a&&a.rows)for(const e of a.rows)e.value&&(t[e.id]=e.value.common.name)}catch(a){adapter.log.warn(`Could not add devices from instance ${e}: ${a.message}`)}try{const t=await adapter.getObjectViewAsync("system","channel",{startkey:`${e}.`,endkey:`${e}.香`});if(t&&t.rows)for(const e of t.rows)e.value&&(a[e.id]=e.value.common.name)}catch(a){adapter.log.warn(`Could not add channels from instance ${e}: ${a.message}`)}try{const a=await adapter.getObjectViewAsync("system","state",{startkey:`${e}.`,endkey:`${e}.香`});if(a&&a.rows){units=units||{};for(const e of a.rows){const a=e.id.split("."),t=a.pop(),n=a.join(".");if(existingStates.push(e.id),e.value&&e.value.native&&e.value.native.UNIT){const a=e.id;units[a]=_unescape(e.value.native.UNIT),"%"===units[a]&&"number"==typeof e.value.native.MIN&&(units[a]={UNIT:"%",MIN:parseFloat(e.value.native.MIN),MAX:parseFloat(e.value.native.MAX)},99===units[a].MAX&&(units[a].MAX=100))}r[n]=r[n]||[],r[n][t]=e.value.common.name}}}catch(a){adapter.log.warn(`Could not add states from instance ${e}: ${a.message}`)}}adapter.config.rfdEnabled&&e.push(n(adapter.config.rfdAdapter)),adapter.config.hs485dEnabled&&e.push(n(adapter.config.hs485dAdapter)),adapter.config.cuxdEnabled&&e.push(n(adapter.config.cuxdAdapter)),adapter.config.hmipEnabled&&e.push(n(adapter.config.hmipAdapter)),adapter.config.virtualDevicesEnabled&&e.push(n(adapter.config.virtualDevicesAdapter)),await Promise.all(e),await _getDevicesFromRega(t,a,r)}async function getVariables(){const e={2:"boolean",4:"number",16:"number",20:"string"},a=await adapter.getObjectViewAsync("hm-rega","variables",{startkey:`hm-rega.${adapter.instance}.`,endkey:`hm-rega.${adapter.instance}.香`}),t=[];if(a){for(const e of a.rows){const a=e.value._id.split(".").pop();t.push(a)}adapter.log.info(`got ${a.rows.length} variables`)}else adapter.log.info("got 0 variables");let r=await rega.runScriptFile(adapter.config.showInvSysVar?"variablesInv":"variables");try{r=JSON.parse(r.replace(/\n/gm,"").replace(/-inf|nan/g,null))}catch(e){return void adapter.log.error(`Cannot parse answer for variables: ${r}`)}let n,o=0;for(const a of Object.keys(r)){n=_unescape(a).replace(FORBIDDEN_CHARS,"_"),o+=1;const c="state",s={_id:`${adapter.namespace}.${n}`,type:"state",common:{name:_unescape(r[a].Name),type:e[r[a].ValueType],read:!0,write:!0,role:c},native:{Name:_unescape(r[a].Name),TypeName:_unescape(r[a].TypeName),DPInfo:_unescape(r[a].DPInfo),ValueMin:_unescape(r[a].ValueMin),ValueMax:_unescape(r[a].ValueMax),ValueUnit:_unescape(r[a].ValueUnit),ValueType:_unescape(r[a].ValueType),ValueSubType:_unescape(r[a].ValueSubType),ValueList:_unescape(r[a].ValueList)}};if((r[a].ValueMin||0===r[a].ValueMin)&&(s.common.min=s.native.ValueMin),(r[a].ValueMax||0===r[a].ValueMax)&&(s.common.max=s.native.ValueMax),r[a].ValueUnit&&(s.common.unit=s.native.ValueUnit),r[a].DPInfo&&(s.common.desc=s.native.DPInfo),r[a].ValueList){const e=_unescape(r[a].ValueList).split(";");s.common.states={};for(const a in e)s.common.states[a]=e[a];29===r[a].ValueSubType&&(s.common.min=0,s.common.max=e.length-1)}let i=r[a].Value;const d=r[a].Timestamp?new Date(r[a].Timestamp).getTime():(new Date).getTime();"string"==typeof i&&(i=_unescape(i)),"40"===n?(n="alarms",s.role=`indicator.${n}`,s._id=`${adapter.namespace}.${n}`):"41"===n&&(n="maintenance",s.role=`indicator.${n}`,s._id=`${adapter.namespace}.${n}`);const p=s._id;objects[p]||(objects[p]=!0,await adapter.extendForeignObjectAsync(p,s)),states[p]&&states[p].ack&&states[p].val===i&&states[p].ts===d||(states[p]={val:i,ack:!0,ts:d},await adapter.setForeignStateAsync(p,states[p])),t.includes(n)&&t.splice(t.indexOf(n),1)}adapter.log.info(`added/updated ${o} variables`);for(const e of t)await adapter.delObjectAsync(e);adapter.log.info(`deleted ${t.length} variables`),adapter.config.polling&&adapter.config.pollingInterval>0&&(pollingInterval||!adapter.config.syncVariables&&!adapter.config.syncPrograms||(pollingInterval=setInterval((()=>{adapter.config.syncVariables&&pollVariables(),adapter.config.syncPrograms&&pollPrograms()}),1e3*adapter.config.pollingInterval)))}async function getDutyCycle(){let e=await rega.runScriptFile("dutycycle"),a=await rega.runScriptFile("system");try{e=JSON.parse(convertDataToJSONArray(e))}catch(a){return void adapter.log.error(`Cannot parse answer for duty cycle: ${e}`)}let t,r=0;try{a=JSON.parse(a)}catch(e){adapter.log.error(`Cannot parse system info: ${a}`),a={}}const n=`CCU${"string"==typeof a.ccuVersion?a.ccuVersion.split(".")[0]:""}`;for(const o of e){t=_unescape(o.ADDRESS).replace(FORBIDDEN_CHARS,"_"),r+=1;const e={_id:`${adapter.namespace}.${t}`,type:"device",common:{name:n},native:{ADDRESS:_unescape(o.ADDRESS),TYPE:n}};if(objects[e._id]||(objects[e._id]=!0,adapter.extendForeignObject(e._id,e)),void 0!==o.DUTY_CYCLE){const e={_id:`${adapter.namespace}.${t}.0.DUTY_CYCLE`,type:"state",common:{name:`${adapter.namespace}.${t}.0.DUTY_CYCLE`,type:"number",read:!0,write:!1,role:"value",min:0,max:100,unit:"%",desc:"Dutycycle"},native:{ID:"DUTYCYCLE",TYPE:"INTEGER",MIN:0,MAX:100,UNIT:"%",DEFAULT:0,CONTROL:"NONE"}},a=parseInt(o.DUTY_CYCLE);await addNewStateOrObject(e,-1===a?null:a)}if(void 0!==o.CONNECTED){const e={_id:`${adapter.namespace}.${t}.0.CONNECTED`,type:"state",common:{name:`${adapter.namespace}.${t}.0.CONNECTED`,type:"number",read:!0,write:!1,role:"indicator.connected",desc:"connected"},native:{ID:"CONNECTED",TYPE:"BOOLEAN",DEFAULT:!1,CONTROL:"NONE"}};await addNewStateOrObject(e,parseInt(o.CONNECTED))}if(void 0!==o.DEFAULT){const e={_id:`${adapter.namespace}.${t}.0.DEFAULT`,type:"state",common:{name:`${adapter.namespace}.${t}.0.DEFAULT`,type:"number",read:!0,write:!1,role:"indicator",desc:"default"},native:{ID:"DEFAULT",TYPE:"BOOLEAN",DEFAULT:!1,CONTROL:"NONE"}};await addNewStateOrObject(e,parseInt(o.DEFAULT))}if(void 0!==a.ccuVersion){const e={_id:`${adapter.namespace}.${t}.0.FIRMWARE_VERSION`,type:"state",common:{name:`${adapter.namespace}.${t}.0.FIRMWARE_VERSION`,type:"string",read:!0,write:!1,role:"text",desc:"firmware_version"},native:{ID:"FIRMWARE_VERSION",TYPE:"STRING",DEFAULT:"",CONTROL:"NONE"}};await addNewStateOrObject(e,a.ccuVersion)}if(void 0!==a.regaVersion){const e={_id:`${adapter.namespace}.${t}.0.regaVersion`,type:"state",common:{name:`${adapter.namespace}.${t}.0.regaVersion`,type:"string",read:!0,write:!1,role:"text",desc:"Version of ReGaHss"},native:{}};await addNewStateOrObject(e,a.regaVersion)}if(void 0!==a.countDevices){const e={_id:`${adapter.namespace}.${t}.0.countDevices`,type:"state",common:{name:`${adapter.namespace}.${t}.0.countDevices`,type:"number",read:!0,write:!1,role:"indicator.count",desc:"Total number of devices"},native:{}};await addNewStateOrObject(e,a.countDevices)}if(void 0!==a.buildLabel){const e={_id:`${adapter.namespace}.${t}.0.buildLabel`,type:"state",common:{name:`${adapter.namespace}.${t}.0.buildLabel`,type:"string",read:!0,write:!1,role:"text",desc:"Build Label of ReGaHss"},native:{}};await addNewStateOrObject(e,a.buildLabel)}if(void 0!==a.countChannels){const e={_id:`${adapter.namespace}.${t}.0.countChannels`,type:"state",common:{name:`${adapter.namespace}.${t}.0.countChannels`,type:"number",read:!0,write:!1,role:"indicator.count",desc:"Total number of channels"},native:{}};await addNewStateOrObject(e,a.countChannels)}if(void 0!==a.countDatapoints){const e={_id:`${adapter.namespace}.${t}.0.countDatapoints`,type:"state",common:{name:`${adapter.namespace}.${t}.0.countDatapoints`,type:"number",read:!0,write:!1,role:"indicator.count",desc:"Total number of data points"},native:{}};await addNewStateOrObject(e,a.countDatapoints)}if(void 0!==a.countSystemVars){const e={_id:`${adapter.namespace}.${t}.0.countSystemVariables`,type:"state",common:{name:`${adapter.namespace}.${t}.0.countSystemVariables`,type:"number",read:!0,write:!1,role:"indicator.count",desc:"Total number of system variables"},native:{}};await addNewStateOrObject(e,a.countSystemVars)}if(void 0!==a.countPrograms){const e={_id:`${adapter.namespace}.${t}.0.countPrograms`,type:"state",common:{name:`${adapter.namespace}.${t}.0.countPrograms`,type:"number",read:!0,write:!1,role:"indicator.count",desc:"Total number of programs"},native:{}};await addNewStateOrObject(e,a.countPrograms)}}adapter.log.info(`added/updated ${r} objects`),adapter.config.syncDutyCycle&&adapter.config.pollingIntervalDC>0&&(pollingIntervalDC||(pollingIntervalDC=setInterval((()=>{adapter.config.syncDutyCycle&&pollDutyCycle()}),1e3*adapter.config.pollingIntervalDC)))}async function addNewStateOrObject(e,a){objects[e._id]||(objects[e._id]=!0,await adapter.extendForeignObjectAsync(e._id,e)),"string"==typeof a&&(a=_unescape(a)),states[e._id]&&states[e._id].ack&&states[e._id].val===a||(states[e._id]={val:a,ack:!0},await adapter.setForeignStateAsync(e._id,states[e._id]))}async function updateNewState(e,a){"string"==typeof a&&(a=_unescape(a)),states[e]&&states[e].ack&&states[e].val===a||(states[e]={val:a,ack:!0},await adapter.setForeignStateAsync(e,a,!0))}function convertDataToJSONArray(e){e=(e=(e=(e=e.replace(/\r/gm,"")).replace(/\n/gm,"")).replace(/{/g,"")).replace(/}/g,"");const a=[];return e.split("ADDRESS").forEach((e=>{if(null!==e&&""!==e&&void 0!==e){const t={};let r=e.split("CONNECTED");t.ADDRESS=r[0].trim(),r=r[1].split("DEFAULT"),t.CONNECTED=r[0].trim(),r=r[1].split("DESCRIPTION"),t.DEFAULT=r[0].trim(),r=r[1].split("DUTY_CYCLE"),t.DESCRIPTION=r[0].trim(),r=r[1].split("FIRMWARE_VERSION"),t.DUTY_CYCLE=r[0].trim(),r=r[1].split("TYPE"),t.FIRMWARE_VERSION=r[0].trim(),t.TYPE=r[1].trim(),a.push(t)}})),JSON.stringify(a)}let stopCount=0;async function stop(e){try{await adapter.setStateAsync("info.connection",!1,!0),await adapter.setStateAsync("info.ccuReachable",!1,!0),await adapter.setStateAsync("info.ccuRegaUp",!1,!0)}catch{}stopCount||(clearInterval(pollingInterval),clearInterval(pollingIntervalDC));for(const e of Object.keys(checkInterval))clearInterval(checkInterval[e]);rega&&rega.pendingRequests>0&&stopCount<5?(stopCount||adapter.log.info("waiting for pending request"),setTimeout(stop,500,e)):e(),stopCount++}function getRegex(){const e=[];if(adapter.config.rfdEnabled&&adapter.config.rfdAdapter){const a=adapter.config.rfdAdapter.split(".")[1];e.push(`(${a})`)}if(adapter.config.hs485dEnabled&&adapter.config.hs485dAdapter){const a=adapter.config.hs485dAdapter.split(".")[1];e.push(`(${a})`)}if(adapter.config.cuxdEnabled&&adapter.config.cuxdAdapter){const a=adapter.config.cuxdAdapter.split(".")[1];e.push(`(${a})`)}if(adapter.config.hmipEnabled&&adapter.config.hmipAdapter){const a=adapter.config.hmipAdapter.split(".")[1];e.push(`(${a})`)}if(adapter.config.virtualDevicesEnabled&&adapter.config.virtualDevicesAdapter){const a=adapter.config.virtualDevicesAdapter.split(".")[1];e.push(`(${a})`)}return new RegExp(`^hm-rpc\\.(${e.join("|")})\\..+$`)}module===require.main?startAdapter():module.exports=startAdapter;
//# sourceMappingURL=/sm/23e58b7ae75deee19019fac4e20e7279f295b61aebfb87b11880fd38fbc57b25.map