iobroker.lovelace
Version:
With this adapter you can build visualization for ioBroker with Home Assistant Lovelace UI
1 lines • 12.6 kB
JavaScript
export const __rspack_esm_id=50235;export const __rspack_esm_ids=[50235];export const __webpack_modules__={58548(t,i,e){e.d(i,{A:()=>s});const a=t=>{const i=parseFloat(t);if(isNaN(i))throw new Error(`${t} is not a number`);return i};function s(t){if(!t)return null;try{if(t.endsWith("%"))return{w:100,h:a(t.slice(0,-1))};const i=t.replace(":","x").split("x");return 0===i.length?null:1===i.length?{w:a(i[0]),h:1}:{w:a(i[0]),h:a(i[1])}}catch(t){}return null}},39168(t,i,e){var a=e(62826),s=e(5124),o=e(22441),n=e(89784),r=e(58548);class c extends s.WF{willUpdate(t){(t.has("aspect_ratio")||null===this._ratio)&&(this._ratio=this.aspectRatio?(0,r.A)(this.aspectRatio):null,(null===this._ratio||this._ratio.w<=0||this._ratio.h<=0)&&(this._ratio=(0,r.A)("16:9")))}render(){return this.aspectRatio?s.qy` <div class="ratio" style="${(0,n.W)({paddingBottom:`${(100*this._ratio.h/this._ratio.w).toFixed(2)}%`})}"> <slot></slot> </div> `:s.qy`<slot></slot>`}constructor(...t){super(...t),this._ratio=null}}c.styles=s.AH`.ratio ::slotted(*){position:absolute;top:0;left:0;width:100%;height:100%}`,(0,a.Cg)([(0,o.MZ)({type:String,attribute:"aspect-ratio"})],c.prototype,"aspectRatio",void 0),c=(0,a.Cg)([(0,o.EM)("ha-aspect-ratio")],c)},17366(t,i,e){e.a(t,async function(t,a){try{e.r(i),e.d(i,{DEFAULT_ASPECT_RATIO:()=>C,DEVICE_CLASSES:()=>S,HuiAreaCard:()=>H,SENSOR_ATTRIBUTE_SOURCES:()=>I,SUM_DEVICE_CLASSES:()=>E});e(74423),e(44114),e(18111),e(22489),e(20116),e(61701),e(18237),e(45367),e(92731),e(17642),e(58004),e(33853),e(45876),e(32475),e(15024),e(31698);var s=e(62826),o=e(5124),n=e(22441),r=e(63672),c=e(89784),h=e(22786),l=e(78870),u=(e(46190),e(65522)),d=e(4423),_=e(20058),p=e(8549),g=e(58548),f=(e(39168),e(76776),e(48374),e(28624),e(59174)),m=(e(47680),e(22109),e(22573),e(80933),e(32248),e(22675)),y=e(32359),v=e(19037),b=e(22064),$=e(97176),A=e(51989),w=t([f,y,_]);[f,y,_]=w.then?(await w)():w;const x="M20 2H4C2.9 2 2 2.9 2 4V20C2 21.11 2.9 22 4 22H20C21.11 22 22 21.11 22 20V4C22 2.9 21.11 2 20 2M4 6L6 4H10.9L4 10.9V6M4 13.7L13.7 4H18.6L4 18.6V13.7M20 18L18 20H13.1L20 13.1V18M20 10.3L10.3 20H5.4L20 5.4V10.3Z",C="16:9",S={sensor:["temperature","humidity"],binary_sensor:["motion","moisture"]},E=["power","apparent_power","reactive_power","energy","reactive_energy","current","gas","monetary","volume","water"],I={temperature:[{domain:"climate",attribute:"current_temperature"}],humidity:[{domain:"climate",attribute:"current_humidity"},{domain:"humidifier",attribute:"current_humidity"}]};class H extends o.WF{static async getConfigElement(){return await Promise.all([e.e(64442),e.e(88862)]).then(e.bind(e,25453)),document.createElement("hui-area-card-editor")}setConfig(t){if(!t.area)throw new Error("Specify an area");const i=t.display_type||(t.show_camera?"camera":"picture"),e="compact"===i&&t.vertical;let a=t.tap_action;t.navigation_path&&!a&&(a={action:"navigate",navigation_path:t.navigation_path});let s=t.image_tap_action;"camera"!==i||s||(s={action:"more-info"}),this._config={...t,vertical:e,display_type:i,tap_action:a||{action:"none"},image_tap_action:s},this._featureContext={area_id:t.area,exclude_entities:t.exclude_entities}}static async getStubConfig(t){const i=Object.values(t.areas);return{type:"area",area:i[0]?.area_id||""}}getCardSize(){const t=this._config&&this._featurePosition(this._config),i=this._config?.display_type||"picture",e=this._config?.features?.length||0;return 1+("compact"===i?this._config?.vertical?1:0:2)+("inline"===t?0:e)}getGridOptions(){let t=6,i=6,e=1;const a=this._config?this._featurePosition(this._config):"bottom",s=this._config?.features?.length||0;s&&("inline"===a?(i=12,t=12):e+=s);const o=this._config?.display_type||"picture";return this._config?.vertical&&(e++,i=3),"compact"!==o&&(e+="inline"===a&&s>0?3:2),{columns:t,rows:e,min_columns:i,min_rows:e}}get _hasCardAction(){return(0,$.h)(this._config?.tap_action)}get _hasImageAction(){return"compact"!==this._config?.display_type&&((0,$.h)(this._config?.image_tap_action)||(0,$.h)(this._config?.tap_action))}_handleAction(t){(0,b.$)(this,this.hass,this._config,t.detail.action)}_handleImageAction(t){if((0,$.h)(this._config?.image_tap_action)){const i="camera"===this._config?.display_type?this._getCameraEntity(this.hass.entities,this._config.area):void 0;(0,b.$)(this,this.hass,{entity:i,tap_action:this._config.image_tap_action},t.detail.action)}else(0,b.$)(this,this.hass,this._config,t.detail.action)}_computeActiveAlertStates(){const t=this._config?.area,i=t?this.hass.areas[t]:void 0,e=this._config?.alert_classes,a=this._config?.exclude_entities;if(!i||!e)return[];const s=this._groupedBinarySensorEntityIds(this.hass.entities,i.area_id,e,a);return e.map(t=>{const i=s.get(t)||[];return i?i.map(t=>this.hass.states[t]).filter(t=>"on"===t?.state):[]}).filter(t=>t.length>0).map(t=>t[0])}_renderAlertSensorBadge(){const t=this._computeActiveAlertStates();if(0===t.length)return o.s6;const i=t[0];return o.qy` <ha-tile-badge class="alert-badge"> <ha-state-icon .stateObj="${i}"></ha-state-icon> </ha-tile-badge> `}_renderAlertSensors(){const t=this._computeActiveAlertStates();return 0===t.length?o.s6:o.qy` <div class="alerts"> ${t.map(t=>o.qy` <div class="alert"> <ha-state-icon .stateObj="${t}"></ha-state-icon> </div> `)} </div> `}_computeSensorsDisplay(){const t=this._config?.area,i=t?this.hass.areas[t]:void 0,e=this._config?.sensor_classes,a=this._config?.exclude_entities;if(!i||!e)return;const s=this._groupedSensorEntityIds(this.hass.entities,i.area_id,e,a);return e.map(t=>{if("temperature"===t&&i.temperature_entity_id){const t=this.hass.states[i.temperature_entity_id];return t&&t.state!==m.Hh&&t.state!==m.HV?this.hass.formatEntityState(t):""}if("humidity"===t&&i.humidity_entity_id){const t=this.hass.states[i.humidity_entity_id];return t&&t.state!==m.Hh&&t.state!==m.HV?this.hass.formatEntityState(t):""}const e=s.get(t)||[],o=[];let n;const r=new Set;for(const t of e){const i=this.hass.states[t];if(i&&i.state!==m.Hh&&i.state!==m.HV&&(0,_.x)(i)&&!isNaN(Number(i.state))&&(n||(n=i.attributes.unit_of_measurement),i.attributes.unit_of_measurement===n)){o.push(Number(i.state));const e=this.hass.entities[t];e?.device_id&&r.add(e.device_id)}}const c=I[t];if(c){const e=[...new Set(c.map(t=>t.domain))],s=this._domainEntityIds(this.hass.entities,i.area_id,e,a);for(const i of s){const e=this.hass.states[i];if(!e)continue;const a=this.hass.entities[i];if(a?.device_id&&r.has(a.device_id))continue;const s=i.split(".")[0],h=c.find(t=>t.domain===s);if(!h)continue;const l=e.attributes[h.attribute];null==l||isNaN(Number(l))||(n||(n=this._getAttributeUnit(t,s)),o.push(Number(l)))}}if(0===o.length)return;const h=E.includes(t)?o.reduce((t,i)=>t+i,0):this._computeMedianValue(o);return`${(0,_.ZV)(h,this.hass.locale,{maximumFractionDigits:1})}${n?`${(0,p.A)(n,this.hass.locale)}${n}`:""}`}).filter(Boolean).join(" · ")}_getAttributeUnit(t,i){return"temperature"===t&&"climate"===i?this.hass.config.unit_system.temperature:"humidity"===t?"%":""}_computeMedianValue(t){const i=[...t].sort((t,i)=>t-i);if(i.length%2==0){const t=i.length/2;return(i[t]+i[t-1])/2}return i[Math.floor(i.length/2)]}willUpdate(t){(t.has("_config")||null===this._ratio)&&(this._ratio=this._config?.aspect_ratio?(0,g.A)(this._config?.aspect_ratio):null,(null===this._ratio||this._ratio.w<=0||this._ratio.h<=0)&&(this._ratio=(0,g.A)(C)))}render(){if(!this._config||!this.hass)return o.s6;const t=this._config?.area,i=t?this.hass.areas[t]:void 0;if(!i)return o.qy` <hui-warning .hass="${this.hass}"> ${this.hass.localize("ui.card.area.area_not_found")} </hui-warning> `;const e=i.icon||void 0,a=this._config.name||(0,u.A)(i),s=this._computeSensorsDisplay(),n=this._featurePosition(this._config),h=this._displayedFeatures(this._config),d=this._config.display_type||"picture",_="camera"===d?this._getCameraEntity(this.hass.entities,i.area_id):void 0,p="grid"===this.layout||"panel"===this.layout,g={"--tile-color":this._config.color?(0,l.MP)(this._config.color):void 0};return o.qy` <ha-card style="${(0,c.W)(g)}"> ${"compact"===d?o.s6:o.qy` <div class="header"> <div class="picture" ="${this._handleImageAction}" .actionHandler="${this._hasImageAction?(0,v.T)():o.s6}" role="${(0,r.J)(this._hasImageAction?"button":void 0)}" tabindex="${(0,r.J)(this._hasImageAction?"0":void 0)}"> ${"picture"!==d&&"camera"!==d||!_&&!i.picture?o.qy` <ha-aspect-ratio .aspectRatio="${p?void 0:this._config.aspect_ratio||C}"> <div class="icon-container"> ${i.icon?o.qy`<ha-icon .icon="${i.icon}"></ha-icon>`:o.s6} </div> </ha-aspect-ratio> `:o.qy` <hui-image .cameraImage="${_}" .cameraView="${this._config.camera_view}" .image="${i.picture?i.picture:void 0}" .hass="${this.hass}" fit-mode="cover" .aspectRatio="${p?void 0:this._config.aspect_ratio||C}"></hui-image> `} </div> ${this._renderAlertSensors()} </div> `} <ha-tile-container .featurePosition="${n}" .vertical="${Boolean(this._config.vertical)}" .interactive="${Boolean(this._hasCardAction)}" ="${this._handleAction}"> <ha-tile-icon slot="icon" .icon="${e}" .iconPath="${e?void 0:x}"> ${"compact"===d?this._renderAlertSensorBadge():o.s6} </ha-tile-icon> <ha-tile-info slot="info" .primary="${a}" .secondary="${s}"></ha-tile-info> ${h.length>0?o.qy` <hui-card-features slot="features" .hass="${this.hass}" .context="${this._featureContext}" .color="${this._config.color}" .features="${h}" .position="${n}"></hui-card-features> `:o.s6} </ha-tile-container> </ha-card> `}constructor(...t){super(...t),this._featureContext={},this._ratio=null,this._groupEntitiesByDeviceClass=t=>t.reduce((t,i)=>{const e=this.hass.states[i],a=e.attributes.device_class;return t.has(a)||t.set(a,[]),t.get(a).push(e.entity_id),t},new Map),this._groupedSensorEntityIds=(0,h.A)((t,i,e,a)=>{const s=(0,d.r)(this.hass,{area:i,entity_category:"none",domain:"sensor",device_class:e}),o=Object.keys(t).filter(t=>s(t)&&!a?.includes(t));return this._groupEntitiesByDeviceClass(o)}),this._groupedBinarySensorEntityIds=(0,h.A)((t,i,e,a)=>{const s=(0,d.r)(this.hass,{area:i,entity_category:"none",domain:"binary_sensor",device_class:e}),o=Object.keys(t).filter(t=>s(t)&&!a?.includes(t));return this._groupEntitiesByDeviceClass(o)}),this._getCameraEntity=(0,h.A)((t,i)=>{const e=(0,d.r)(this.hass,{area:i,entity_category:"none",domain:"camera"}),a=Object.keys(t).filter(e);return a.length>0?a[0]:void 0}),this._domainEntityIds=(0,h.A)((t,i,e,a)=>{const s=(0,d.r)(this.hass,{area:i,entity_category:"none",domain:e});return Object.keys(t).filter(t=>s(t)&&!a?.includes(t))}),this._featurePosition=(0,h.A)(t=>t.vertical?"bottom":t.features_position||"bottom"),this._displayedFeatures=(0,h.A)(t=>{const i=t.features||[];return"inline"===this._featurePosition(t)?i.slice(0,1):i})}}H.styles=[A.c,o.AH`:host{--tile-color:var(--state-icon-color)}ha-card{display:flex;flex-direction:column;justify-content:space-between}.header{flex:1;overflow:hidden;border-radius:var(--ha-card-border-radius,var(--ha-border-radius-lg));border-end-end-radius:0;border-end-start-radius:0;position:relative;z-index:1}.picture{height:100%;width:100%;background-size:cover;background-position:center;position:relative;pointer-events:none}.picture[role=button]{pointer-events:auto;cursor:pointer}.picture[role=button]:focus-visible{outline:2px solid var(--primary-color);outline-offset:-2px}.picture hui-image{height:100%}.picture .icon-container{height:100%;width:100%;display:flex;align-items:center;justify-content:center;--mdc-icon-size:var(--ha-space-12);color:var(--tile-color)}.picture .icon-container::before{position:absolute;content:"";width:100%;height:100%;background-color:var(--tile-color);opacity:.12}.header+ha-tile-container{height:auto;flex:none}ha-tile-badge{position:absolute;top:3px;right:3px;inset-inline-end:3px;inset-inline-start:initial}hui-card-features{--feature-color:var(--tile-color)}.alert-badge{--tile-badge-background-color:var(--orange-color)}.alerts{position:absolute;top:0;left:0;display:flex;flex-direction:row;gap:var(--ha-space-2);padding:var(--ha-space-2);pointer-events:none;z-index:1}.alert{background-color:var(--orange-color);border-radius:var(--ha-border-radius-lg);width:var(--ha-space-6);height:var(--ha-space-6);padding:2px;box-sizing:border-box;--mdc-icon-size:var(--ha-space-4);display:flex;align-items:center;justify-content:center;color:#fff}`],(0,s.Cg)([(0,n.MZ)({attribute:!1})],H.prototype,"hass",void 0),(0,s.Cg)([(0,n.MZ)({attribute:!1})],H.prototype,"layout",void 0),(0,s.Cg)([(0,n.wk)()],H.prototype,"_config",void 0),(0,s.Cg)([(0,n.wk)()],H.prototype,"_featureContext",void 0),H=(0,s.Cg)([(0,n.EM)("hui-area-card")],H),a()}catch(t){a(t)}})}};