UNPKG

iobroker.lovelace

Version:

With this adapter you can build visualization for ioBroker with Home Assistant Lovelace UI

1 lines 14 kB
"use strict";(self.rspackChunkhome_assistant_frontend=self.rspackChunkhome_assistant_frontend||[]).push([[50235],{58548:function(t,i,e){e.d(i,{A:function(){return s}});e(16280),e(27495),e(25440);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(i){}return null}},39168:function(t,i,e){e(62953);var a=e(40445),s=e(5124),n=e(67576),o=e(89784),r=e(58548);let c,h,l,u=t=>t;class d 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?(0,s.qy)(h||(h=u` <div class="ratio" style="${0}"> <slot></slot> </div> `),(0,o.W)({paddingBottom:`${(100*this._ratio.h/this._ratio.w).toFixed(2)}%`})):(0,s.qy)(c||(c=u`<slot></slot>`))}constructor(...t){super(...t),this._ratio=null}}d.styles=(0,s.AH)(l||(l=u`.ratio ::slotted(*){position:absolute;top:0;left:0;width:100%;height:100%}`)),(0,a.Cg)([(0,n.MZ)({type:String,attribute:"aspect-ratio"})],d.prototype,"aspectRatio",void 0),d=(0,a.Cg)([(0,n.EM)("ha-aspect-ratio")],d)},17366:function(t,i,e){e.a(t,async function(t,a){try{e.r(i),e.d(i,{DEFAULT_ASPECT_RATIO:function(){return L},DEVICE_CLASSES:function(){return N},HuiAreaCard:function(){return D},SENSOR_ATTRIBUTE_SOURCES:function(){return R},SUM_DEVICE_CLASSES:function(){return P}});e(16280),e(74423),e(44114),e(72712),e(26910),e(18111),e(22489),e(20116),e(61701),e(18237),e(45367),e(92731),e(3362),e(17642),e(58004),e(33853),e(45876),e(32475),e(15024),e(31698),e(62953);var s=e(40445),n=e(5124),o=e(67576),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)),v=(e(47680),e(22109),e(22573),e(80933),e(32248),e(22675)),m=e(32359),y=e(19037),b=e(22064),$=e(97176),A=e(51989),w=t([f,m,_]);[f,m,_]=w.then?(await w)():w;let C,x,S,E,I,H,M,k,V,j,O,q=t=>t;const B="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",L="16:9",N={sensor:["temperature","humidity"],binary_sensor:["motion","moisture"]},P=["power","apparent_power","reactive_power","energy","reactive_energy","current","gas","monetary","volume","water"],R={temperature:[{domain:"climate",attribute:"current_temperature"}],humidity:[{domain:"climate",attribute:"current_humidity"},{domain:"humidifier",attribute:"current_humidity"}]};class D extends n.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=Object.assign(Object.assign({},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){var i;return{type:"area",area:(null===(i=Object.values(t.areas)[0])||void 0===i?void 0:i.area_id)||""}}getCardSize(){var t,i,e;const a=this._config&&this._featurePosition(this._config),s=(null===(t=this._config)||void 0===t?void 0:t.display_type)||"picture",n=(null===(i=this._config)||void 0===i||null===(i=i.features)||void 0===i?void 0:i.length)||0;return 1+("compact"===s?null!==(e=this._config)&&void 0!==e&&e.vertical?1:0:2)+("inline"===a?0:n)}getGridOptions(){var t,i,e;let a=6,s=6,n=1;const o=this._config?this._featurePosition(this._config):"bottom",r=(null===(t=this._config)||void 0===t||null===(t=t.features)||void 0===t?void 0:t.length)||0;r&&("inline"===o?(s=12,a=12):n+=r);const c=(null===(i=this._config)||void 0===i?void 0:i.display_type)||"picture";return null!==(e=this._config)&&void 0!==e&&e.vertical&&(n++,s=3),"compact"!==c&&(n+="inline"===o&&r>0?3:2),{columns:a,rows:n,min_columns:s,min_rows:n}}get _hasCardAction(){var t;return(0,$.h)(null===(t=this._config)||void 0===t?void 0:t.tap_action)}get _hasImageAction(){var t,i,e;return"compact"!==(null===(t=this._config)||void 0===t?void 0:t.display_type)&&((0,$.h)(null===(i=this._config)||void 0===i?void 0:i.image_tap_action)||(0,$.h)(null===(e=this._config)||void 0===e?void 0:e.tap_action))}_handleAction(t){(0,b.$)(this,this.hass,this._config,t.detail.action)}_handleImageAction(t){var i;if((0,$.h)(null===(i=this._config)||void 0===i?void 0:i.image_tap_action)){var e;const i="camera"===(null===(e=this._config)||void 0===e?void 0:e.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(){var t,i,e;const a=null===(t=this._config)||void 0===t?void 0:t.area,s=a?this.hass.areas[a]:void 0,n=null===(i=this._config)||void 0===i?void 0:i.alert_classes,o=null===(e=this._config)||void 0===e?void 0:e.exclude_entities;if(!s||!n)return[];const r=this._groupedBinarySensorEntityIds(this.hass.entities,s.area_id,n,o);return n.map(t=>{const i=r.get(t)||[];return i?i.map(t=>this.hass.states[t]).filter(t=>"on"===(null==t?void 0:t.state)):[]}).filter(t=>t.length>0).map(t=>t[0])}_renderAlertSensorBadge(){const t=this._computeActiveAlertStates();if(0===t.length)return n.s6;const i=t[0];return(0,n.qy)(C||(C=q` <ha-tile-badge class="alert-badge"> <ha-state-icon .stateObj="${0}"></ha-state-icon> </ha-tile-badge> `),i)}_renderAlertSensors(){const t=this._computeActiveAlertStates();return 0===t.length?n.s6:(0,n.qy)(x||(x=q` <div class="alerts"> ${0} </div> `),t.map(t=>(0,n.qy)(S||(S=q` <div class="alert"> <ha-state-icon .stateObj="${0}"></ha-state-icon> </div> `),t)))}_computeSensorsDisplay(){var t,i,e;const a=null===(t=this._config)||void 0===t?void 0:t.area,s=a?this.hass.areas[a]:void 0,n=null===(i=this._config)||void 0===i?void 0:i.sensor_classes,o=null===(e=this._config)||void 0===e?void 0:e.exclude_entities;if(!s||!n)return;const r=this._groupedSensorEntityIds(this.hass.entities,s.area_id,n,o);return n.map(t=>{if("temperature"===t&&s.temperature_entity_id){const t=this.hass.states[s.temperature_entity_id];return t&&t.state!==v.Hh&&t.state!==v.HV?this.hass.formatEntityState(t):""}if("humidity"===t&&s.humidity_entity_id){const t=this.hass.states[s.humidity_entity_id];return t&&t.state!==v.Hh&&t.state!==v.HV?this.hass.formatEntityState(t):""}const i=r.get(t)||[],e=[];let a;const n=new Set;for(const s of i){const t=this.hass.states[s];if(t&&t.state!==v.Hh&&t.state!==v.HV&&(0,_.x)(t)&&!isNaN(Number(t.state))&&(a||(a=t.attributes.unit_of_measurement),t.attributes.unit_of_measurement===a)){e.push(Number(t.state));const i=this.hass.entities[s];null!=i&&i.device_id&&n.add(i.device_id)}}const c=R[t];if(c){const i=[...new Set(c.map(t=>t.domain))],r=this._domainEntityIds(this.hass.entities,s.area_id,i,o);for(const s of r){const i=this.hass.states[s];if(!i)continue;const o=this.hass.entities[s];if(null!=o&&o.device_id&&n.has(o.device_id))continue;const r=s.split(".")[0],h=c.find(t=>t.domain===r);if(!h)continue;const l=i.attributes[h.attribute];null==l||isNaN(Number(l))||(a||(a=this._getAttributeUnit(t,r)),e.push(Number(l)))}}if(0===e.length)return;const h=P.includes(t)?e.reduce((t,i)=>t+i,0):this._computeMedianValue(e);return`${(0,_.ZV)(h,this.hass.locale,{maximumFractionDigits:1})}${a?`${(0,p.A)(a,this.hass.locale)}${a}`:""}`}).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){var i,e;(t.has("_config")||null===this._ratio)&&(this._ratio=null!==(i=this._config)&&void 0!==i&&i.aspect_ratio?(0,g.A)(null===(e=this._config)||void 0===e?void 0:e.aspect_ratio):null,(null===this._ratio||this._ratio.w<=0||this._ratio.h<=0)&&(this._ratio=(0,g.A)(L)))}render(){var t;if(!this._config||!this.hass)return n.s6;const i=null===(t=this._config)||void 0===t?void 0:t.area,e=i?this.hass.areas[i]:void 0;if(!e)return(0,n.qy)(E||(E=q` <hui-warning .hass="${0}"> ${0} </hui-warning> `),this.hass,this.hass.localize("ui.card.area.area_not_found"));const a=e.icon||void 0,s=this._config.name||(0,u.A)(e),o=this._computeSensorsDisplay(),h=this._featurePosition(this._config),d=this._displayedFeatures(this._config),_=this._config.display_type||"picture",p="camera"===_?this._getCameraEntity(this.hass.entities,e.area_id):void 0,g="grid"===this.layout||"panel"===this.layout,f={"--tile-color":this._config.color?(0,l.MP)(this._config.color):void 0};return(0,n.qy)(I||(I=q` <ha-card style="${0}"> ${0} <ha-tile-container .featurePosition="${0}" .vertical="${0}" .interactive="${0}" @action="${0}"> <ha-tile-icon slot="icon" .icon="${0}" .iconPath="${0}"> ${0} </ha-tile-icon> <ha-tile-info slot="info" .primary="${0}" .secondary="${0}"></ha-tile-info> ${0} </ha-tile-container> </ha-card> `),(0,c.W)(f),"compact"===_?n.s6:(0,n.qy)(H||(H=q` <div class="header"> <div class="picture" @action="${0}" .actionHandler="${0}" role="${0}" tabindex="${0}"> ${0} </div> ${0} </div> `),this._handleImageAction,this._hasImageAction?(0,y.T)():n.s6,(0,r.J)(this._hasImageAction?"button":void 0),(0,r.J)(this._hasImageAction?"0":void 0),"picture"!==_&&"camera"!==_||!p&&!e.picture?(0,n.qy)(k||(k=q` <ha-aspect-ratio .aspectRatio="${0}"> <div class="icon-container"> ${0} </div> </ha-aspect-ratio> `),g?void 0:this._config.aspect_ratio||L,e.icon?(0,n.qy)(V||(V=q`<ha-icon .icon="${0}"></ha-icon>`),e.icon):n.s6):(0,n.qy)(M||(M=q` <hui-image .cameraImage="${0}" .cameraView="${0}" .image="${0}" .hass="${0}" fit-mode="cover" .aspectRatio="${0}"></hui-image> `),p,this._config.camera_view,e.picture?e.picture:void 0,this.hass,g?void 0:this._config.aspect_ratio||L),this._renderAlertSensors()),h,Boolean(this._config.vertical),Boolean(this._hasCardAction),this._handleAction,a,a?void 0:B,"compact"===_?this._renderAlertSensorBadge():n.s6,s,o,d.length>0?(0,n.qy)(j||(j=q` <hui-card-features slot="features" .hass="${0}" .context="${0}" .color="${0}" .features="${0}" .position="${0}"></hui-card-features> `),this.hass,this._featureContext,this._config.color,d,h):n.s6)}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}),n=Object.keys(t).filter(t=>s(t)&&!(null!=a&&a.includes(t)));return this._groupEntitiesByDeviceClass(n)}),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}),n=Object.keys(t).filter(t=>s(t)&&!(null!=a&&a.includes(t)));return this._groupEntitiesByDeviceClass(n)}),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)&&!(null!=a&&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})}}D.styles=[A.c,(0,n.AH)(O||(O=q`: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,o.MZ)({attribute:!1})],D.prototype,"hass",void 0),(0,s.Cg)([(0,o.MZ)({attribute:!1})],D.prototype,"layout",void 0),(0,s.Cg)([(0,o.wk)()],D.prototype,"_config",void 0),(0,s.Cg)([(0,o.wk)()],D.prototype,"_featureContext",void 0),D=(0,s.Cg)([(0,o.EM)("hui-area-card")],D),a()}catch(C){a(C)}})}}]);