iobroker.javascript
Version:
Rules Engine for ioBroker
2 lines • 1.14 MB
JavaScript
/*! For license information please see 393.600ae25b.chunk.js.LICENSE.txt */
(self.webpackChunkjs=self.webpackChunkjs||[]).push([[393],{32451:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var a=Object.getOwnPropertyDescriptor(t,n);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,a)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return a(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const s=i(n(53482)),c=n(71936),l=o(n(76409)),u=o(n(88631)),d=n(65298),h=n(21839),f=i(n(73361)),p=i(n(50086)),m=i(n(95881)),_=i(n(70591)),g=i(n(653)),v=i(n(29102)),y=i(n(27637)),b=i(n(12539)),w=i(n(99795));class S extends _.default{constructor(e,t){var r,a;const o=e.Connection||(null===t||void 0===t?void 0:t.Connection)||c.Connection;if(!window.document.getElementById("generic-app-iobroker-component")){const e=window.document.createElement("style");e.setAttribute("id","generic-app-iobroker-component"),e.innerHTML='\nhtml {\n height: 100%;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* scrollbar */\n::-webkit-scrollbar-track {\n background-color: #ccc;\n border-radius: 5px;\n}\n\n::-webkit-scrollbar {\n width: 5px;\n height: 5px;\n background-color: #ccc;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: #575757;\n border-radius: 5px;\n}\n\n#root {\n height: 100%;\n}\n\n.App {\n height: 100%;\n}\n\n@keyframes glow {\n from {\n background-color: initial;\n }\n to {\n background-color: #58c458;\n }\n}\n',window.document.head.appendChild(e)}if(!S.isWeb()&&window.io&&"3000"===window.location.port)try{const e=new window.SocketClient;delete window.io,window.io=e}catch(v){}super(e),this.common=null,this.sentryStarted=!1,this.sentryInited=!1,this.resizeTimer=null,this.onSystemConfigChanged=(e,t)=>{var n,r;t&&"system.config"===e&&(this.socket.systemLang!==(null===t||void 0===t?void 0:t.common.language)&&(this.socket.systemLang=(null===t||void 0===t?void 0:t.common.language)||"en",b.default.setLanguage(this.socket.systemLang)),(null===(n=this._systemConfig)||void 0===n?void 0:n.expertMode)!==!!(null===(r=null===t||void 0===t?void 0:t.common)||void 0===r?void 0:r.expertMode)?(this._systemConfig=(null===t||void 0===t?void 0:t.common)||{},this.setState({expertMode:this.getExpertMode()})):this._systemConfig=(null===t||void 0===t?void 0:t.common)||{})},this.onReceiveMessage=e=>{if(null===e||void 0===e?void 0:e.data)if("updateTheme"===e.data){const e=g.default.getThemeName();g.default.setThemeName(g.default.getThemeName());const t=this.createTheme(e);this.setState({theme:t,themeName:this.getThemeName(t),themeType:this.getThemeType(t)},(()=>{this.props.onThemeChange&&this.props.onThemeChange(e),this.onThemeChanged&&this.onThemeChanged(e)}))}else"updateExpertMode"===e.data?this.onToggleExpertMode&&this.onToggleExpertMode(this.getExpertMode()):"chartReady"!==e.data&&console.debug('Received unknown message: "'.concat(JSON.stringify(e.data),'". May be it will be processed later'))},this.onResize=()=>{this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=setTimeout((()=>{this.resizeTimer=null,this.setState({width:S.getWidth()})}),200)},(0,f.default)();const i=(window.location.search||"").replace(/^\?/,"").replace(/#.*$/,""),s={};i.trim().split("&").filter((e=>e.trim())).forEach((e=>{const t=e.split("=");s[t[0]]=2!==t.length||t[1],"true"===s[t[0]]?s[t[0]]=!0:"false"===s[t[0]]&&(s[t[0]]=!1)})),this.instance=null!==(a=null!==(r=null===t||void 0===t?void 0:t.instance)&&void 0!==r?r:e.instance)&&void 0!==a?a:void 0!==s.instance?parseInt(s.instance,10)||0:parseInt(window.location.search.slice(1),10)||0;const d=window.location.pathname.split("/");this.adapterName=(null===t||void 0===t?void 0:t.adapterName)||e.adapterName||window.adapterName||d[d.length-2]||"iot",this.instanceId="system.adapter.".concat(this.adapterName,".").concat(this.instance),this.newReact=!0===s.newReact;const h=_.default.getLocation();h.tab=h.tab||(window._localStorage||window.localStorage).getItem("".concat(this.adapterName,"-adapter"))||"";const p=this.createTheme();this.state=Object.assign(Object.assign({},this.state||{}),{selectedTab:(window._localStorage||window.localStorage).getItem("".concat(this.adapterName,"-adapter"))||"",selectedTabNum:-1,native:{},errorText:"",changed:!1,connected:!1,loaded:!1,isConfigurationError:"",expertMode:!1,toast:"",theme:p,themeName:this.getThemeName(p),themeType:this.getThemeType(p),bottomButtons:!1!==(t&&t.bottomButtons)&&!1!==(null===e||void 0===e?void 0:e.bottomButtons),width:S.getWidth(),confirmClose:!1,_alert:!1,_alertType:"info",_alertMessage:""});const m={en:n(56603),de:n(3123),ru:n(57629),pt:n(324),nl:n(49646),fr:n(94176),it:n(67801),es:n(35148),pl:n(11356),uk:n(57412),"zh-cn":n(89156)};t&&t.translations?Object.keys(t.translations).forEach((e=>{t.translations&&(m[e]=Object.assign(m[e],t.translations[e]||{}))})):e.translations&&Object.keys(e.translations).forEach((t=>{e.translations&&(m[t]=Object.assign(m[t],e.translations[t]||{}))})),b.default.setTranslations(m),this.savedNative={},this.encryptedFields=e.encryptedFields||(null===t||void 0===t?void 0:t.encryptedFields)||[],this.sentryDSN=t&&t.sentryDSN||e.sentryDSN,window.socketUrl&&(window.socketUrl.startsWith(":")?window.socketUrl="".concat(window.location.protocol,"//").concat(window.location.hostname).concat(window.socketUrl):window.socketUrl.startsWith("http://")||window.socketUrl.startsWith("https://")||(window.socketUrl="".concat(window.location.protocol,"//").concat(window.socketUrl))),this.alertDialogRendered=!1,window.oldAlert=window.alert,window.alert=e=>{this.alertDialogRendered?e&&e.toString().toLowerCase().includes("error")?(console.error(e),this.showAlert(e.toString(),"error")):(console.log(e),this.showAlert(e.toString(),"info")):window.oldAlert(e)},this.socket=new o(Object.assign(Object.assign({},(null===e||void 0===e?void 0:e.socket)||(null===t||void 0===t?void 0:t.socket)),{name:this.adapterName,doNotLoadAllObjects:null===t||void 0===t?void 0:t.doNotLoadAllObjects,onProgress:e=>{e===c.PROGRESS.CONNECTING?this.setState({connected:!1}):(c.PROGRESS.READY,this.setState({connected:!0}))},onReady:()=>{b.default.setLanguage(this.socket.systemLang),this.socket.subscribeObject("system.config",this.onSystemConfigChanged).then((()=>this.getSystemConfig())).then((e=>(this._secret="undefined"!==typeof e&&e.native&&e.native.secret||"Zgfr56gFe87jJOM",this._systemConfig=(null===e||void 0===e?void 0:e.common)||{},this.socket.getObject(this.instanceId)))).then((async e=>{var t,n;let r;const a=e,o=!1!==(null===(t=await this.socket.getState("".concat(this.instanceId,".plugins.sentry.enabled")))||void 0===t?void 0:t.val)&&"none"!==(null===(n=this._systemConfig)||void 0===n?void 0:n.diag)&&(null===a||void 0===a?void 0:a.common)&&a.common.name&&a.common.version&&!a.common.disableDataReporting&&"localhost:3000"!==window.location.host;!this.sentryStarted&&this.sentryDSN&&o&&(this.sentryStarted=!0,l.init({dsn:this.sentryDSN,release:"iobroker.".concat(a.common.name,"@").concat(a.common.version),integrations:[new u.Dedupe]}),console.log("Sentry initialized")),!this.sentryInited&&o&&(this.sentryInited=!0,r=this.socket.getObject("system.meta.uuid").then((e=>{e&&e.native&&e.native.uuid&&l.configureScope((t=>t.setUser({id:e.native.uuid})))}))),r=r||Promise.resolve(),r.then((()=>{a?(this.common=null===a||void 0===a?void 0:a.common,this.onPrepareLoad(a.native,a.encryptedNative),this.savedNative=JSON.parse(JSON.stringify(a.native)),this.setState({native:a.native,loaded:!0,expertMode:this.getExpertMode()},(()=>this.onConnectionReady&&this.onConnectionReady()))):(console.warn("Cannot load instance settings"),this.setState({native:{},loaded:!0,expertMode:this.getExpertMode()},(()=>this.onConnectionReady&&this.onConnectionReady())))}))})).catch((e=>window.alert("Cannot settings: ".concat(e))))},onError:e=>{console.error(e),this.showError(e)}}))}static isWeb(){return void 0!==window.socketUrl}showAlert(e,t){"error"!==t&&"warning"!==t&&"info"!==t&&"success"!==t&&(t="info"),this.setState({_alert:!0,_alertType:t,_alertMessage:e})}renderAlertSnackbar(){return this.alertDialogRendered=!0,s.default.createElement(d.Snackbar,{style:"error"===this.state._alertType?{backgroundColor:"#f44336"}:"success"===this.state._alertType?{backgroundColor:"#4caf50"}:void 0,open:this.state._alert,autoHideDuration:6e3,onClose:(e,t)=>"clickaway"!==t&&this.setState({_alert:!1}),message:this.state._alertMessage})}componentDidMount(){window.addEventListener("resize",this.onResize,!0),window.addEventListener("message",this.onReceiveMessage,!1),super.componentDidMount()}componentWillUnmount(){window.removeEventListener("resize",this.onResize,!0),window.removeEventListener("message",this.onReceiveMessage,!1),super.componentWillUnmount()}static getWidth(){const e={xs:0,sm:600,md:960,lg:1280,xl:1920},t=window.innerWidth;return Object.keys(e).reverse().find((n=>t>=e[n]))||"xs"}createTheme(e){return(0,p.default)(g.default.getThemeName(e))}getThemeName(e){return e.name}getThemeType(e){return e.palette.mode}onThemeChanged(e){}onToggleExpertMode(e){}toggleTheme(e){const t=this.state.themeName;if((e=e||("dark"===t?"blue":"blue"===t?"colored":"colored"===t?"light":"dark"))!==t){g.default.setThemeName(e);const t=this.createTheme(e);this.setState({theme:t,themeName:this.getThemeName(t),themeType:this.getThemeType(t)},(()=>{this.props.onThemeChange&&this.props.onThemeChange(e||"light"),this.onThemeChanged&&this.onThemeChanged(e||"light")}))}}getSystemConfig(){return this.socket.getSystemConfig()}getExpertMode(){var e;return"true"===window.sessionStorage.getItem("App.expertMode")||!!(null===(e=this._systemConfig)||void 0===e?void 0:e.expertMode)}onConnectionReady(){}encrypt(e){let t="";if(this._secret)for(let n=0;n<e.length;n++)t+=String.fromCharCode(this._secret[n%this._secret.length].charCodeAt(0)^e.charCodeAt(n));return t}decrypt(e){let t="";if(this._secret)for(let n=0;n<e.length;n++)t+=String.fromCharCode(this._secret[n%this._secret.length].charCodeAt(0)^e.charCodeAt(n));return t}onHashChanged(){const e=_.default.getLocation();e.tab!==this.state.selectedTab&&this.selectTab(e.tab)}selectTab(e,t){(window._localStorage||window.localStorage).setItem("".concat(this.adapterName,"-adapter"),e),this.setState({selectedTab:e,selectedTabNum:t})}onPrepareSave(e){return this.encryptedFields&&this.encryptedFields.forEach((t=>{e[t]&&(e[t]=this.encrypt(e[t]))})),!0}onPrepareLoad(e,t){this.encryptedFields&&this.encryptedFields.forEach((t=>{e[t]&&(e[t]=this.decrypt(e[t]))})),t&&t.forEach((t=>{this.encryptedFields=this.encryptedFields||[],!this.encryptedFields.includes(t)&&this.encryptedFields.push(t),e[t]&&(e[t]=this.decrypt(e[t]))}))}async getExtendableInstances(){try{const e=await this.socket.getObjectViewSystem("instance","system.adapter.","system.adapter.\u9999");return Object.values(e).filter((e=>{var t;return!!(null===(t=null===e||void 0===e?void 0:e.common)||void 0===t?void 0:t.webExtendable)}))}catch(e){return[]}}async getIpAddresses(e){var t;const n=await this.socket.getHostByIp(e||(null===(t=this.common)||void 0===t?void 0:t.host)||""),r=n.find((e=>"0.0.0.0"===e.address));r&&(r.name="[IPv4] 0.0.0.0 - ".concat(b.default.t("ra_Listen on all IPs")));const a=n.find((e=>"::"===e.address));return a&&(a.name="[IPv4] :: - ".concat(b.default.t("ra_Listen on all IPs"))),n}onSave(e){let t;this.state.isConfigurationError?this.setState({errorText:this.state.isConfigurationError}):this.socket.getObject(this.instanceId).then((e=>{t=e||{};for(const n in this.state.native)Object.prototype.hasOwnProperty.call(this.state.native,n)&&(null===this.state.native[n]?t.native[n]=null:void 0!==this.state.native[n]?t.native[n]=JSON.parse(JSON.stringify(this.state.native[n])):delete t.native[n]);if(this.state.common)for(const n in this.state.common)null===this.state.common[n]?t.common[n]=null:void 0!==this.state.common[n]?t.common[n]=JSON.parse(JSON.stringify(this.state.common[n])):delete t.common[n];return!1!==this.onPrepareSave(t.native)?this.socket.setObject(this.instanceId,t):Promise.reject(new Error("Invalid configuration"))})).then((()=>{this.savedNative=t.native,globalThis.changed=!1;try{window.parent.postMessage("nochange","*")}catch(n){}this.setState({changed:!1}),e&&S.onClose()})).catch((e=>console.error("Cannot save configuration: ".concat(e))))}renderToast(){var e;return this.state.toast?s.default.createElement(d.Snackbar,{anchorOrigin:{vertical:"bottom",horizontal:"left"},open:!0,autoHideDuration:6e3,onClose:()=>this.setState({toast:""}),ContentProps:{"aria-describedby":"message-id"},message:s.default.createElement("span",{id:"message-id"},this.state.toast),action:[s.default.createElement(d.IconButton,{key:"close","aria-label":"Close",color:"inherit",className:null===(e=this.props.classes)||void 0===e?void 0:e.close,onClick:()=>this.setState({toast:""}),size:"large"},s.default.createElement(h.Close,null))]}):null}static onClose(){if("undefined"!==typeof window.parent&&window.parent)try{window.parent.$iframeDialog&&"function"===typeof window.parent.$iframeDialog.close?window.parent.$iframeDialog.close():window.parent.postMessage("close","*")}catch(e){window.parent.postMessage("close","*")}}renderError(){return this.state.errorText?s.default.createElement(w.default,{text:this.state.errorText,onClose:()=>this.setState({errorText:""})}):null}getIsChanged(e){e=e||this.state.native;const t=JSON.stringify(e)!==JSON.stringify(this.savedNative);return globalThis.changed=t,t}onLoadConfig(e){JSON.stringify(e)!==JSON.stringify(this.state.native)&&this.setState({native:e,changed:this.getIsChanged(e)})}setConfigurationError(e){this.state.isConfigurationError!==e&&this.setState({isConfigurationError:e})}renderSaveCloseButtons(){return this.state.confirmClose||this.state.bottomButtons?s.default.createElement(s.default.Fragment,null,this.state.bottomButtons?s.default.createElement(v.default,{theme:this.state.theme,newReact:this.newReact,noTextOnButtons:"xs"===this.state.width||"sm"===this.state.width||"md"===this.state.width,changed:this.state.changed,onSave:e=>this.onSave(e),onClose:()=>{this.state.changed?this.setState({confirmClose:!0}):S.onClose()}}):null,this.state.confirmClose?s.default.createElement(y.default,{title:b.default.t("ra_Please confirm"),text:b.default.t("ra_Some data are not stored. Discard?"),ok:b.default.t("ra_Discard"),cancel:b.default.t("ra_Cancel"),onClose:e=>this.setState({confirmClose:!1},(()=>e&&S.onClose()))}):null):null}_updateNativeValue(e,t,n){"object"!==typeof t&&(t=t.split("."));const r=t.shift()||"";if(!t.length)return n&&"object"===typeof n?JSON.stringify(e[r])!==JSON.stringify(n)&&(e[r]=n,!0):e[r]!==n&&(e[r]=n,!0);if(e[r]=e[r]||{},"object"!==typeof e[r])throw new Error("attribute ".concat(r," is no object, but ").concat(typeof e[r]));return this._updateNativeValue(e[r],t,n)}updateNativeValue(e,t,n){const r=JSON.parse(JSON.stringify(this.state.native));if(this._updateNativeValue(r,e,t)){const e=this.getIsChanged(r);if(e!==this.state.changed)try{window.parent.postMessage(e?"change":"nochange","*")}catch(a){}this.setState({native:r,changed:e},n)}}showError(e){this.setState({errorText:e})}showToast(e){this.setState({toast:e})}renderHelperDialogs(){return s.default.createElement(s.default.Fragment,null,this.renderError(),this.renderToast(),this.renderSaveCloseButtons(),this.renderAlertSnackbar())}render(){return this.state.loaded?s.default.createElement("div",{className:"App"},this.renderError(),this.renderToast(),this.renderSaveCloseButtons(),this.renderAlertSnackbar()):s.default.createElement(m.default,{themeType:this.state.themeType})}}t.default=S},24031:(e,t)=>{"use strict";var n,r;(function(e){e.unknown="unknown",e.airCondition="airCondition",e.blind="blind",e.blindButtons="blindButtons",e.button="button",e.buttonSensor="buttonSensor",e.camera="camera",e.chart="chart",e.cie="cie",e.ct="ct",e.dimmer="dimmer",e.door="door",e.fireAlarm="fireAlarm",e.floodAlarm="floodAlarm",e.gate="gate",e.hue="hue",e.humidity="humidity",e.image="image",e.info="info",e.instance="instance",e.light="light",e.location="location",e.lock="lock",e.media="media",e.motion="motion",e.rgb="rgb",e.rgbSingle="rgbSingle",e.rgbwSingle="rgbwSingle",e.slider="slider",e.socket="socket",e.temperature="temperature",e.thermostat="thermostat",e.vacuumCleaner="vacuumCleaner",e.volume="volume",e.volumeGroup="volumeGroup",e.warning="warning",e.weatherCurrent="weatherCurrent",e.weatherForecast="weatherForecast",e.window="window",e.windowTilt="windowTilt"})(n||(n={})),function(e){e.Number="number",e.String="string",e.Boolean="boolean",e.File="file"}(r||(r={}));const a={working:{role:/^indicator\.working$/,indicator:!0,notSingle:!0,name:"WORKING",required:!1,defaultRole:"indicator.working",defaultType:r.Boolean},unreach:{role:/^indicator(\.maintenance)?\.unreach$/,indicator:!0,type:r.Boolean,notSingle:!0,name:"UNREACH",required:!1,defaultRole:"indicator.maintenance.unreach"},lowbat:{role:/^indicator(\.maintenance)?\.lowbat$|^indicator(\.maintenance)?\.battery$/,indicator:!0,type:r.Boolean,notSingle:!0,name:"LOWBAT",required:!1,defaultRole:"indicator.maintenance.lowbat"},maintain:{role:/^indicator\.maintenance$/,indicator:!0,type:r.Boolean,notSingle:!0,name:"MAINTAIN",required:!1,defaultRole:"indicator.maintenance"},error:{role:/^indicator\.error$/,indicator:!0,notSingle:!0,name:"ERROR",required:!1,defaultRole:"indicator.error",defaultType:r.String},direction:{role:/^indicator\.direction$/,indicator:!0,notSingle:!0,name:"DIRECTION",required:!1,defaultRole:"indicator.direction"},reachable:{role:/^indicator\.reachable$/,indicator:!0,type:r.Boolean,notSingle:!0,name:"CONNECTED",required:!1,defaultRole:"indicator.reachable",inverted:!0}};class o{constructor(){this.enums=null,this.cache={}}static checkEnum(e,t){let n=!1;return e&&e.forEach((e=>{const r=e.lastIndexOf(".");-1!==r&&(e=e.substring(r+1));for(const a in t)if(t.hasOwnProperty(a)&&t[a].find((t=>t.test(e))))return n=!0,!1})),n}static roleOrEnum(e,t,n,r){return!!(n&&e.common.role&&n.includes(e.common.role))||o.checkEnum(t,r)}static roleOrEnumLight(e,t){return o.roleOrEnum(e,t,o.lightRoles,o.lightWords)}static roleOrEnumBlind(e,t){return o.roleOrEnum(e,t,o.blindRoles,o.blindWords)}static roleOrEnumGate(e,t){return o.roleOrEnum(e,t,o.gateRoles,o.gateWords)}static roleOrEnumWindow(e,t){return o.roleOrEnum(e,t,o.windowRoles,o.blindWords)}static roleOrEnumDoor(e,t){return o.roleOrEnum(e,t,o.doorsRoles,o.doorsWords)}static getEnums(){return{door:{roles:o.doorsRoles,words:o.doorsWords},window:{roles:o.windowRoles,words:o.blindWords},blind:{roles:o.blindRoles,words:o.blindWords},gate:{roles:o.gateRoles,words:o.gateWords},light:{roles:o.lightRoles,words:o.lightWords}}}static getAllStatesInChannel(e,t){const n=[],r=new RegExp("^".concat(t.replace(/([$^.)([\]{}])/g,"\\$1"),"\\.[^.]+$"));return e.forEach((e=>r.test(e)&&n.push(e))),n}static getAllStatesInDevice(e,t){const n=[],r=new RegExp("^".concat(t.replace(/([$^.)([\]{}])/g,"\\$1"),"\\.[^.]+\\.[^.]+$"));return e.forEach((e=>r.test(e)&&n.push(e))),n}static getFunctionEnums(e){const t=[],n=/^enum\.functions\./;for(const r in e)e.hasOwnProperty(r)&&n.test(r)&&e[r]&&"enum"===e[r].type&&e[r].common&&e[r].common.members&&e[r].common.members.length&&t.push(r);return t}static getParentId(e){const t=e.lastIndexOf(".");return-1!==t?e.substring(0,t):e}_applyPattern(e,t,n){var a;if(e[t]&&e[t].common){let i=null;if(n.role&&(i=n.role.test(e[t].common.role||""),i&&n.channelRole)){const r=o.getParentId(t),s=(null===(a=e[r])||void 0===a?void 0:a.common.role)||"";i=!(!s||"channel"!==e[r].type&&"device"!==e[r].type)&&n.channelRole.test(s)}if(!1===i)return!1;if(n.objectType&&e[t].type!==n.objectType)return!1;if(n.stateName&&!n.stateName.test(t))return!1;if(n.unit&&n.unit!==e[t].common.unit)return!1;if(n.ignoreRole){const r=e[t].common.role||"";if(r&&n.ignoreRole.test(r))return!1}if(!1===n.indicator&&(e[t].common.role||"").match(/^indicator(\.[.\w]+)?$/))return!1;if(n.state){const e=t.split(".").pop()||"";if(e&&!n.state.test(e))return!1}if(void 0!==n.write&&n.write!==(e[t].common.write||!1))return!1;if(n.min===r.Number&&typeof e[t].common.min!==r.Number)return!1;if(n.max===r.Number&&typeof e[t].common.max!==r.Number)return!1;if(void 0!==n.read&&n.read!==(void 0===e[t].common.read||e[t].common.read))return!1;if(n.type)if(typeof n.type===r.String){if(n.type!==e[t].common.type)return!1}else{let r=!0;for(let a=0;a<n.type.length;a++)if(n.type[a]===e[t].common.type){r=!1;break}if(r)return!1}if(n.enums&&"function"===typeof n.enums){const r=this._getEnumsForId(e,t);if(!n.enums(e[t],r||[]))return!1}return!0}return!1}_getEnumsForId(e,t){this.enums=this.enums||o.getFunctionEnums(e);const n=[];if(this.enums.forEach((r=>{e[r].common.members.includes(t)&&n.push(r)})),!n.length&&e[t]&&"state"===e[t].type){let r=o.getParentId(t);!e[r]||"channel"!==e[r].type&&"device"!==e[r].type||this.enums.forEach((t=>{e[t].common.members.includes(r)&&n.push(t)}))}return n.length?n:null}static copyState(e,t){return(t=t||JSON.parse(JSON.stringify(e)))&&(t.original=e.original||e,"enums"in e&&e.enums&&(t.enums=e.enums),"role"in e&&e.role&&(t.role=e.role),"channelRole"in e&&e.channelRole&&(t.channelRole=e.channelRole)),t}_testOneState(e){const t=e.objects,n=e.pattern,r=e.state,a=e.channelStates,i=e.usedIds,s=e.usedInCurrentDevice,c=e.ignoreIndicators;let l=e.result,u=!1;return a.forEach((d=>{if("COVER"!==r.name||!(null===l||void 0===l?void 0:l.states.find((e=>e.id&&"COVER"===e.name)))){if(r.indicator&&c){const e=d.split(".").pop()||"";if(e&&c.includes(e))return void console.log("".concat(d," ignored"))}if((r.indicator||!s.includes(d)&&(r.notSingle||!i.includes(d)))&&this._applyPattern(t,d,r)&&(r.indicator||s.push(d),l||(l=JSON.parse(JSON.stringify(o.patterns[n])),e.result=l,null===l||void 0===l||l.states.forEach(((e,t)=>o.copyState(o.patterns[n].states[t],e)))),l)){if(!l.states.find((e=>e.id===d))){let e=!1;for(let t=0;t<l.states.length;t++)if(l.states[t].name===r.name){l.states[t].id=d,e=!0;break}e||console.error("Cannot find state for ".concat(d))}u=!0,r.multiple&&a.length>1&&a.forEach((e=>{if(e!==d&&(r.indicator||!s.includes(e)&&(r.notSingle||!i.includes(e)))&&this._applyPattern(t,e,r)&&(r.indicator||s.push(e),l))if(Array.isArray(r)){const t=o.copyState(r[0]);t.id=e,l.states.push(t)}else{const t=o.copyState(r);t.id=e,l.states.push(t)}}))}}})),u}static getChannelStates(e,t,n){switch(e[t].type){case"chart":case"state":return[t];case"device":const e=o.getAllStatesInDevice(n,t);return e.length?e:o.getAllStatesInChannel(n,t);default:return o.getAllStatesInChannel(n,t)}}static patternIsAllowed(e,t,n){if(!e)return!1;if(Array.isArray(e.type)){for(let r=0;r<e.type.length;r++){if(t&&!t.includes(e.type[r]))return!1;if(n&&n.includes(e.type[r]))return!1}return!0}return!(t&&!t.includes(e.type))&&(!n||!n.includes(e.type))}static allRequiredStatesFound(e){if(!e.result)return!1;const t=e.result.states;for(let n=0;n<t.length;n++)if(t[n].required&&!t[n].id)return!1;return!0}static cleanState(e,t){var n,r;const a=(null===(r=null===(n=t[e.id])||void 0===n?void 0:n.common)||void 0===r?void 0:r.role)||"";if(e.name.includes("%d")&&e.role&&e.id&&a){const t=e.role.exec(a);t&&(e.name=e.name.replace("%d",t[1]))}e.role&&delete e.role,e.enums&&delete e.enums,e.original&&delete e.original}_detectNext(e){const t=e.objects,r=e.id,a=e._keysOptional||[];let i=e._usedIdsOptional||[];const s=e.ignoreIndicators;if(i||(i=[],e._usedIdsOptional=i),!t[r]||!t[r].common)return null;const c={objects:t,channelStates:o.getChannelStates(t,r,a||[]),usedIds:i,ignoreIndicators:s||[],result:null,pattern:n.unknown,usedInCurrentDevice:[],state:{}};for(const n in o.patterns){if(!o.patternIsAllowed(o.patterns[n],e.allowedTypes,e.excludedTypes))continue;if(c.result=null,c.pattern=n,c.usedInCurrentDevice=[],o.patterns[n].states.forEach((e=>{let t=!1;if(c.state=e,this._testOneState(c)&&(t=!0),e.required&&!t)return c.result=null,!1})),!o.allRequiredStatesFound(c))continue;let s;if(c.usedInCurrentDevice.forEach((e=>i.push(e))),"device"!==t[r].type){let e=o.getParentId(r);!t[e]||"channel"!==t[e].type&&"device"!==t[e].type||(s=o.getAllStatesInDevice(a,e),null===s||void 0===s||s.forEach((e=>{var n;null===(n=c.result)||void 0===n||n.states.forEach(((n,r)=>{n.id||!n.indicator&&!n.searchInParent||n.noDeviceDetection||this._applyPattern(t,e,n.original)&&c.result&&(c.result.states[r].id=e)}))})))}if(c.result){const e=c.result;e&&e.states.forEach((e=>o.cleanState(e,c.objects)))}return c.result}return null}detect(e){const t=e.objects,n=e.id;let r=e._keysOptional,a=e._usedIdsOptional;if(void 0!==this.cache[n])return this.cache[n];r||(r=Object.keys(t),r.sort(),e._keysOptional=r),a&&(a=[],e._usedIdsOptional=a);const o=[];let i;for(;i=this._detectNext(e);)o.push(i);return this.cache[n]=o.length?o:null,this.cache[n]}static getPatterns(){const e={};return Object.keys(o.patterns).forEach((t=>{const n=JSON.parse(JSON.stringify(o.patterns[t]));n.states.forEach(((e,r)=>{let a=o.patterns[t].states[r];a.role&&(n.states[r].role=a.role.toString()),a.enums&&(n.states[r].enums=!0,n.states[r].enum=!0)})),e[t]=n})),e}}o.patterns={chart:{states:[{objectType:"chart",name:"CHART"}],type:n.chart},mediaPlayer:{states:[{role:/^media.state(\..*)?$/,indicator:!1,type:[r.Boolean,r.Number],name:"STATE",required:!0,defaultRole:"media.state"},{role:/^button.play(\..*)?$|^action.play(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"PLAY",required:!1,noSubscribe:!0,defaultRole:"button.play"},{role:/^button.pause(\..*)?$|^action.pause(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"PAUSE",required:!1,noSubscribe:!0,defaultRole:"button.pause"},{role:/^button.stop(\..*)?$|^action.stop(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop"},{role:/^button.next(\..*)?$|^action.next(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"NEXT",required:!1,noSubscribe:!0,defaultRole:"button.next"},{role:/^button.prev(\..*)?$|^action.prev(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"PREV",required:!1,noSubscribe:!0,defaultRole:"button.prev"},{role:/^media.mode.shuffle(\..*)?$/,indicator:!1,write:!0,type:r.Boolean,name:"SHUFFLE",required:!1,noSubscribe:!0,defaultRole:"media.mode.shuffle"},{role:/^media.mode.repeat(\..*)?$/,indicator:!1,write:!0,type:r.Number,name:"REPEAT",required:!1,noSubscribe:!0,defaultRole:"media.mode.repeat"},{role:/^media.artist(\..*)?$/,indicator:!1,write:!1,type:r.String,name:"ARTIST",required:!1,defaultRole:"media.artist"},{role:/^media.album(\..*)?$/,indicator:!1,write:!1,type:r.String,name:"ALBUM",required:!1,defaultRole:"media.album"},{role:/^media.title(\..*)?$/,indicator:!1,write:!1,type:r.String,name:"TITLE",required:!1,defaultRole:"media.title"},{role:/^media.cover$|^media.cover.big$/,indicator:!1,write:!1,type:r.String,name:"COVER",required:!1,notSingle:!0,defaultRole:"media.cover"},{role:/^media.cover(\..*)$/,indicator:!1,write:!1,type:r.String,name:"COVER",required:!1,notSingle:!0},{role:/^media.duration(\..*)?$/,indicator:!1,write:!1,type:r.Number,name:"DURATION",required:!1,noSubscribe:!0,defaultRole:"media.duration",defaultUnit:"sec"},{role:/^media.elapsed(\..*)?$/,indicator:!1,type:r.Number,name:"ELAPSED",required:!1,noSubscribe:!0,defaultRole:"media.elapsed",defaultUnit:"sec"},{role:/^media.seek(\..*)?$/,indicator:!1,write:!0,type:r.Number,name:"SEEK",required:!1,noSubscribe:!0,defaultRole:"media.seek"},{role:/^media.track(\..*)?$/,indicator:!1,type:r.String,name:"TRACK",required:!1,noSubscribe:!0,defaultRole:"media.track"},{role:/^media.episode(\..*)?$/,indicator:!1,type:r.String,name:"EPISODE",required:!1,noSubscribe:!0,defaultRole:"media.episode"},{role:/^media.season(\..*)?$/,indicator:!1,type:r.String,name:"SEASON",required:!1,noSubscribe:!0,defaultRole:"media.season"},{role:/^level.volume?$/,indicator:!1,type:r.Number,min:r.Number,max:r.Number,write:!0,name:"VOLUME",required:!1,notSingle:!0,noSubscribe:!0,defaultRole:"level.volume"},{role:/^value.volume?$/,indicator:!1,type:r.Number,min:r.Number,max:r.Number,write:!1,name:"VOLUME_ACTUAL",required:!1,notSingle:!0,noSubscribe:!0,defaultRole:"value.volume"},{role:/^media.mute?$/,indicator:!1,type:r.Boolean,write:!0,name:"MUTE",required:!1,notSingle:!0,noSubscribe:!0,defaultRole:"media.mute"},{stateName:/\.paused$|\.playerState$/,indicator:!1,name:"IGNORE",required:!1,multiple:!0,noSubscribe:!0},a.reachable,a.lowbat,a.maintain,a.error],type:n.media},weatherForecast:{states:[{role:/^weather.icon$|^weather.icon.forecast.0$/,indicator:!1,type:r.String,name:"ICON",required:!0,defaultRole:"weather.icon.forecast.0"},{role:/^value.temperature.min.forecast.0$/,indicator:!1,type:r.Number,name:"TEMP_MIN",required:!0,defaultRole:"value.temperature.min.forecast.0"},{role:/^value.temperature.max.forecast.0$/,indicator:!1,type:r.Number,name:"TEMP_MAX",required:!0,defaultRole:"value.temperature.max.forecast.0"},{role:/^value.precipitation$|^value.precipitation.forecast.0$/,indicator:!1,type:r.Number,name:"PRECIPITATION_CHANCE",unit:"%",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^value.precipitation$|^value.precipitation.forecast.0$/,indicator:!1,type:r.Number,name:"PRECIPITATION",unit:"mm",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^date$|^date.forecast.0$/,indicator:!1,type:r.String,name:"DATE",required:!1,defaultRole:"date.forecast.0"},{role:/^dayofweek$|^dayofweek.forecast.0$/,indicator:!1,type:r.String,name:"DOW",required:!1,defaultRole:"dayofweek.forecast.0"},{role:/^weather.state$|^weather.state.forecast.0$/,indicator:!1,type:r.String,name:"STATE",required:!1,defaultRole:"weather.state.forecast.0"},{role:/^value.temperature$|^value.temperature.forecast.0$/,indicator:!1,type:r.Number,name:"TEMP",required:!1,defaultRole:"value.temperature.forecast.0"},{role:/^value.pressure$/,indicator:!1,type:r.Number,name:"PRESSURE",required:!1,defaultRole:"weather.icon.forecast.0"},{role:/^value.humidity$|value.humidity.forecast.0$/,indicator:!1,type:r.Number,name:"HUMIDITY",required:!1,defaultRole:"value.humidity.forecast.0"},{role:/^(?:date|time).sunrise(?:.forecast\.0)?$/,indicator:!1,type:r.String,name:"TIME_SUNRISE",required:!1,defaultRole:"date.sunrise"},{role:/^(?:date|time).sunset(?:.forecast\.0)?$/,indicator:!1,type:r.String,name:"TIME_SUNSET",required:!1,defaultRole:"date.sunset"},{role:/^value.temperature.windchill$|^value.temperature.windchill.forecast.0$/,indicator:!1,type:r.Number,name:"WIND_CHILL",required:!1,defaultRole:"value.temperature.windchill.forecast.0"},{role:/^value.temperature.feelslike$|^value.temperature.feelslike.forecast.0$/,indicator:!1,type:r.Number,name:"FEELS_LIKE",required:!1,defaultRole:"value.temperature.feelslike.forecast.0"},{role:/^value.speed.wind$|^value.speed.wind.forecast.0$/,indicator:!1,type:r.Number,name:"WIND_SPEED",required:!1,defaultRole:"value.speed.wind.forecast.0"},{role:/^value.direction.wind$|^value.direction.wind.forecast.0$/,indicator:!1,type:r.Number,name:"WIND_DIRECTION",required:!1,defaultRole:"value.direction.wind.forecast.0"},{role:/^weather.direction.wind$|^weather.direction.wind.forecast.0$/,indicator:!1,type:r.String,name:"WIND_DIRECTION_STR",required:!1,defaultRole:"weather.direction.wind.forecast.0"},{role:/^weather.icon.wind$|^weather.icon.wind.forecast.0$/,indicator:!1,type:r.String,name:"WIND_ICON",required:!1,defaultRole:"weather.icon.wind.forecast.0"},{role:/^weather.chart.url$/,indicator:!1,type:r.String,name:"HISTORY_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url"},{role:/^weather.chart.url.forecast$/,indicator:!1,type:r.String,name:"FORECAST_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url.forecast"},{role:/^location$/,indicator:!1,type:r.String,name:"LOCATION",required:!1,defaultRole:"location"},{role:/^weather.icon.forecast.(\d)$/,indicator:!1,type:r.String,name:"ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0,notSingle:!0},{role:/^value.temperature.min.forecast.(\d)$/,indicator:!1,type:r.Number,name:"TEMP_MIN%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.temperature.max.forecast.(\d)$/,indicator:!1,type:r.Number,name:"TEMP_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^date.forecast.(\d)$/,indicator:!1,type:r.String,name:"DATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^dayofweek.forecast.(\d)$/,indicator:!1,type:r.String,name:"DOW%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather.state.forecast.(\d)$/,indicator:!1,type:r.String,name:"STATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.temperature.forecast.(\d)$/,indicator:!1,type:r.Number,name:"TEMP%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.humidity.forecast.(\d)$/,indicator:!1,type:r.Number,name:"HUMIDITY%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.humidity.max.forecast.(\d)$/,indicator:!1,type:r.Number,name:"HUMIDITY_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.precipitation.forecast.(\d)$/,indicator:!1,type:r.Number,unit:"%",name:"PRECIPITATION_CHANCE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.precipitation.forecast.(\d)$/,indicator:!1,type:r.Number,unit:"mm",name:"PRECIPITATION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.speed.wind.forecast.(\d)$/,indicator:!1,type:r.Number,name:"WIND_SPEED%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value.direction.wind.forecast.(\d)$/,indicator:!1,type:r.Number,name:"WIND_DIRECTION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather.direction.wind.forecast.(\d)$/,indicator:!1,type:r.String,name:"WIND_DIRECTION_STR%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather.icon.wind.forecast.(\d)$/,indicator:!1,type:r.String,name:"WIND_ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0}],type:n.weatherForecast},rgb:{states:[{role:/^level\.color\.red$/,indicator:!1,type:r.Number,write:!0,name:"RED",required:!0,defaultRole:"level.color.red"},{role:/^level\.color\.green$/,indicator:!1,type:r.Number,write:!0,name:"GREEN",required:!0,defaultRole:"level.color.green"},{role:/^level\.color\.blue$/,indicator:!1,type:r.Number,write:!0,name:"BLUE",required:!0,defaultRole:"level.color.blue"},{role:/^level\.color\.white$/,indicator:!1,type:r.Number,write:!0,name:"WHITE",required:!1,defaultRole:"level.color.white"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^switch\.light$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^switch$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.rgb},rgbwSingle:{states:[{role:/^level\.color\.rgbw$/,indicator:!1,type:r.String,write:!0,name:"RGBW",required:!0,defaultRole:"level.color.rgbw"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^switch\.light$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^switch$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.rgbwSingle},rgbSingle:{states:[{role:/^level\.color\.rgb$/,indicator:!1,type:r.String,write:!0,name:"RGB",required:!0,defaultRole:"level.color.rgb"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^switch\.light$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^switch$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.rgbSingle},cie:{states:[{role:/^level\.color\.cie$/,indicator:!1,type:r.String,write:!0,name:"CIE",required:!0,defaultRole:"level.color.cie"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^switch(\.light)?$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.cie},hue:{states:[{role:/^level\.color\.hue$/,indicator:!1,type:r.Number,write:!0,name:"HUE",required:!0,defaultRole:"level.color.hue",defaultUnit:"\xb0"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,searchInParent:!0,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^switch\.light$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^switch$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.hue},ct:{states:[{role:/^level\.color\.temperature$/,indicator:!1,type:r.Number,write:!0,name:"TEMPERATURE",required:!0,defaultRole:"level.color.temperature",defaultUnit:"\xb0K"},{role:/^level\.dimmer$/,indicator:!1,type:r.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:r.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.saturation$/,indicator:!1,type:r.Number,write:!0,name:"SATURATION",required:!1},{role:/^switch\.light$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^switch$/,indicator:!1,type:r.Boolean,write:!0,name:"ON",required:!1},{role:/^(state|switch|sensor)\.light|switch$/,indicator:!1,type:r.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light"},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.ct},warning:{states:[{role:/^value\.warning$/,indicator:!1,name:"LEVEL",required:!0,defaultRole:"value.warning"},{role:/^weather\.title\.short$/,indicator:!1,type:r.String,name:"TITLE",required:!1,defaultRole:"weather.title.short"},{role:/^weather\.title$/,indicator:!1,type:r.String,name:"INFO",required:!1,defaultRole:"weather.title"},{role:/^date\.start$/,indicator:!1,type:r.String,name:"START",required:!1,defaultRole:"date.start"},{role:/^date\.end$/,indicator:!1,type:r.String,name:"END",required:!1,defaultRole:"date.end"},{role:/^date$/,indicator:!1,type:r.String,name:"START",required:!1},{role:/^weather\.chart\.url/,indicator:!1,type:r.String,name:"ICON",required:!1,defaultRole:"weather.chart.url"},{role:/^weather\.state$/,indicator:!1,type:r.String,name:"DESC",required:!1,noSubscribe:!0,defaultRole:"weather.state"}],type:n.warning},airCondition:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:r.Number,name:"SET",required:!0,defaultRole:"level.temperature",defaultUnit:"\xb0C"},{role:/airconditioner$/,indicator:!1,write:!0,type:r.Number,searchInParent:!0,name:"MODE",required:!0,defaultRole:"level.mode.airconditioner",defaultStates:{0:"OFF",1:"AUTO",2:"COOL",3:"HEAT",4:"ECO",5:"FAN_ONLY",6:"DRY"}},{role:/(speed|mode)\.fan$/,indicator:!1,write:!0,type:r.Number,name:"SPEED",required:!1,defaultRole:"level.mode.fan",defaultStates:{0:"AUTO",1:"HIGH",2:"LOW",3:"MEDIUM",4:"QUIET",5:"TURBO"}},{role:/^switch\.power$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},{role:/^switch$/,indicator:!1,write:!0,type:r.Boolean,searchInParent:!0,name:"POWER",required:!1},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xb0C"},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%"},{role:/^switch\.boost(\..*)?$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.boost"},{role:/swing$/,indicator:!1,write:!0,type:r.Number,searchInParent:!0,name:"SWING",required:!1,defaultRole:"level.mode.swing",defaultStates:{0:"AUTO",1:"HORIZONTAL",2:"STATIONARY",3:"VERTICAL"}},{role:/swing$/,indicator:!1,write:!0,type:r.Boolean,searchInParent:!0,name:"SWING",required:!1,defaultRole:"switch.mode.swing"},a.unreach,a.maintain,a.error],type:n.airCondition},thermostat:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:r.Number,name:"SET",required:!0,defaultRole:"level.temperature",defaultUnit:"\xb0C"},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xb0C"},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%"},{role:/^switch(\.mode)?\.boost(\..*)?$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.mode.boost"},{role:/^switch\.power$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},{role:/^switch(\.mode)?\.party$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"PARTY",required:!1,defaultRole:"switch.mode.party"},{role:/^switch$/,indicator:!1,write:!0,type:r.Boolean,searchInParent:!0,name:"POWER",required:!1},{role:/^level(\.mode)?\.thermostat$/,indicator:!1,write:!0,type:r.Number,searchInParent:!0,name:"MODE",required:!1,defaultRole:"level.mode.thermostat",defaultStates:{0:"AUTO",1:"MANUAL"}},a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.thermostat},vacuumCleaner:{states:[{role:/^switch\.power$/,indicator:!1,write:!0,type:[r.Boolean,r.Number],searchInParent:!0,name:"POWER",required:!0,defaultRole:"switch.power"},{role:/mode\.cleanup$/,indicator:!1,write:!0,type:r.Number,searchInParent:!0,name:"MODE",required:!0,defaultRole:"level.mode.cleanup",defaultStates:{0:"AUTO",1:"NORMAL",2:"QUIET",3:"ECO",4:"EXPRESS"}},{role:/vacuum\.map\.base64$/,indicator:!1,write:!1,type:r.String,searchInParent:!0,name:"MAP_BASE64",required:!1,defaultRole:"vacuum.map.base64"},{role:/vacuum\.map\.url$/,indicator:!1,write:!1,type:r.String,searchInParent:!0,name:"MAP_URL",required:!1},{role:/mode\.work$/,indicator:!1,write:!0,type:r.Number,searchInParent:!0,name:"WORK_MODE",required:!1,defaultRole:"level.mode.work",defaultStates:{0:"AUTO",1:"FAST",2:"MEDIUM",3:"SLOW",4:"TURBO"}},{role:/^value\.water$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,unit:"%",name:"WATER",required:!1,defaultRole:"value.water",defaultUnit:"%"},{role:/^value\.waste$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,unit:"%",name:"WASTE",required:!1,defaultRole:"value.waste",defaultUnit:"%"},{role:/^value\.battery$/,indicator:!1,write:!1,type:r.Number,searchInParent:!0,unit:"%",name:"BATTERY",required:!1,defaultRole:"value.battery",defaultUnit:"%"},{role:/^value\.state$/,indicator:!1,write:!1,type:[r.Number,r.String],searchInParent:!0,name:"STATE",required:!1,defaultRole:"value.state"},{role:/^switch\.pause$/,indicator:!1,write:!0,type:r.Boolean,searchInParent:!0,name:"PAUSE",required:!1,defaultRole:"switch.pause"},{role:/^indicator(\.maintenance)?\.waste$|^indicator(\.alarm)?\.waste/,indicator:!0,type:r.Boolean,searchInParent:!0,name:"WASTE_ALARM",required:!1,defaultRole:"indicator.maintenance.waste"},{role:/^indicator(\.maintenance)?\.water$|^indicator(\.alarm)?\.water/,indicator:!0,type:r.Boolean,searchInParent:!0,name:"WATER_ALARM",required:!1,defaultRole:"indicator.maintenance.water"},{role:/^value(\.usage)?\.filter/,indicator:!0,type:r.Number,searchInParent:!0,name:"FILTER",required:!1,defaultRole:"value.usage.filter",defaultUnit:"%"},{role:/^value(\.usage)?\.brush/,indicator:!0,type:r.Number,searchInParent:!0,name:"BRUSH",required:!1,defaultRole:"value.usage.brush",defaultUnit:"%"},{role:/^value(\.usage)?\.sensors/,indicator:!0,type:r.Number,searchInParent:!0,name:"SENSORS",required:!1,defaultRole:"value.usage.sensors",defaultUnit:"%"},{role:/^value(\.usage)?\.brush\.side/,indicator:!0,type:r.Number,searchInParent:!0,name:"SIDE_BRUSH",required:!1,defaultRole:"value.usage.brush.side",defaultUnit:"%"},a.unreach,a.lowbat,a.maintain,a.error],type:n.vacuumCleaner},blinds:{states:[{role:/^level(\.blind)?$/,indicator:!1,type:r.Number,write:!0,enums:o.roleOrEnumBlind,name:"SET",required:!0,defaultRole:"level.blind",defaultUnit:"%"},{role:/^value(\.blind)?$/,indicator:!1,type:r.Number,enums:o.roleOrEnumBlind,name:"ACTUAL",required:!1,defaultRole:"value.blind",defaultUnit:"%"},{role:/^button\.stop(\.blind)?$|^action\.stop$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^button\.open(\.blind)?$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^button\.close(\.blind)?$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level(\.open)?\.tilt$/,indicator:!1,type:r.Number,write:!0,enums:o.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value(\.open)?\.tilt$/,indicator:!1,type:r.Number,enums:o.roleOrEnumBlind,name:"TILT_ACTUAL",required:!1,defaultRole:"value.tilt"},{role:/^button\.stop\.tilt$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"TILT_STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.tilt"},{role:/^button\.open\.tilt$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"TILT_OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.tilt"},{role:/^button\.close\.tilt$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"TILT_CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.tilt"},a.direction,a.working,a.unreach,a.lowbat,a.maintain,a.error],type:n.blind},blindButtons:{states:[{role:/^button\.stop(\.blind)?$|^action\.stop$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"STOP",required:!0,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^button\.open(\.blind)?$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"OPEN",required:!0,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^button\.close(\.blind)?$/,indicator:!1,type:r.Boolean,write:!0,enums:o.roleOrEnumBlind,name:"CLOSE",required:!0,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level\.tilt$/,indicator:!1,type:r.Number,write:!0,enums:o.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value\.tilt$/,indicator:!1,type:r.Number,enums:o.ro