From 6662b7f52d5705f401f62efbfeba17d4c7a7f259 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen <paulus@paulusschoutsen.nl> Date: Thu, 18 May 2017 17:40:49 -0700 Subject: [PATCH] Update frontend --- homeassistant/components/frontend/version.py | 2 +- .../www_static/home-assistant-polymer | 2 +- .../www_static/panels/ha-panel-zwave.html | 648 +++++++++++++++++- .../www_static/panels/ha-panel-zwave.html.gz | Bin 6135 -> 12987 bytes 4 files changed, 649 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index e0fd270b81b..d232f027f84 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -18,6 +18,6 @@ FINGERPRINTS = { "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab", "panels/ha-panel-logbook.html": "6dd6a16f52117318b202e60f98400163", "panels/ha-panel-map.html": "31c592c239636f91e07c7ac232a5ebc4", - "panels/ha-panel-zwave.html": "84fb45638d2a69bac343246a687f647c", + "panels/ha-panel-zwave.html": "19336d2c50c91dd6a122acc0606ff10d", "websocket_test.html": "575de64b431fe11c3785bf96d7813450" } diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index ffe0b22d772..ad3b3ce3dce 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit ffe0b22d772c619efabc43ae56d94e1564f9f6e6 +Subproject commit ad3b3ce3dce3811cdc06e87585914c60c91e02af diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html index 6af056b0db4..70e5cc64177 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html @@ -1 +1,647 @@ -<html><head><meta charset="UTF-8"></head><body><div hidden="" by-vulcanize=""><style>[hidden]{display:none!important}</style><style is="custom-style">:root{--layout:{display:-ms-flexbox;display:-webkit-flex;display:flex};--layout-inline:{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex};--layout-horizontal:{@apply(--layout);-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row};--layout-horizontal-reverse:{@apply(--layout);-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse};--layout-vertical:{@apply(--layout);-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column};--layout-vertical-reverse:{@apply(--layout);-ms-flex-direction:column-reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse};--layout-wrap:{-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap};--layout-no-wrap:{-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap};--layout-wrap-reverse:{-ms-flex-wrap:wrap-reverse;-webkit-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse};--layout-flex-auto:{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto};--layout-flex-none:{-ms-flex:none;-webkit-flex:none;flex:none};--layout-flex:{-ms-flex:1 1 .000000001px;-webkit-flex:1;flex:1;-webkit-flex-basis:.000000001px;flex-basis:.000000001px};--layout-flex-2:{-ms-flex:2;-webkit-flex:2;flex:2};--layout-flex-3:{-ms-flex:3;-webkit-flex:3;flex:3};--layout-flex-4:{-ms-flex:4;-webkit-flex:4;flex:4};--layout-flex-5:{-ms-flex:5;-webkit-flex:5;flex:5};--layout-flex-6:{-ms-flex:6;-webkit-flex:6;flex:6};--layout-flex-7:{-ms-flex:7;-webkit-flex:7;flex:7};--layout-flex-8:{-ms-flex:8;-webkit-flex:8;flex:8};--layout-flex-9:{-ms-flex:9;-webkit-flex:9;flex:9};--layout-flex-10:{-ms-flex:10;-webkit-flex:10;flex:10};--layout-flex-11:{-ms-flex:11;-webkit-flex:11;flex:11};--layout-flex-12:{-ms-flex:12;-webkit-flex:12;flex:12};--layout-start:{-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start};--layout-center:{-ms-flex-align:center;-webkit-align-items:center;align-items:center};--layout-end:{-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end};--layout-baseline:{-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline};--layout-start-justified:{-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start};--layout-center-justified:{-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center};--layout-end-justified:{-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end};--layout-around-justified:{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around};--layout-justified:{-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between};--layout-center-center:{@apply(--layout-center);@apply(--layout-center-justified)};--layout-self-start:{-ms-align-self:flex-start;-webkit-align-self:flex-start;align-self:flex-start};--layout-self-center:{-ms-align-self:center;-webkit-align-self:center;align-self:center};--layout-self-end:{-ms-align-self:flex-end;-webkit-align-self:flex-end;align-self:flex-end};--layout-self-stretch:{-ms-align-self:stretch;-webkit-align-self:stretch;align-self:stretch};--layout-self-baseline:{-ms-align-self:baseline;-webkit-align-self:baseline;align-self:baseline};--layout-start-aligned:{-ms-flex-line-pack:start;-ms-align-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start};--layout-end-aligned:{-ms-flex-line-pack:end;-ms-align-content:flex-end;-webkit-align-content:flex-end;align-content:flex-end};--layout-center-aligned:{-ms-flex-line-pack:center;-ms-align-content:center;-webkit-align-content:center;align-content:center};--layout-between-aligned:{-ms-flex-line-pack:justify;-ms-align-content:space-between;-webkit-align-content:space-between;align-content:space-between};--layout-around-aligned:{-ms-flex-line-pack:distribute;-ms-align-content:space-around;-webkit-align-content:space-around;align-content:space-around};--layout-block:{display:block};--layout-invisible:{visibility:hidden!important};--layout-relative:{position:relative};--layout-fit:{position:absolute;top:0;right:0;bottom:0;left:0};--layout-scroll:{-webkit-overflow-scrolling:touch;overflow:auto};--layout-fullbleed:{margin:0;height:100vh};--layout-fixed-top:{position:fixed;top:0;left:0;right:0};--layout-fixed-right:{position:fixed;top:0;right:0;bottom:0};--layout-fixed-bottom:{position:fixed;right:0;bottom:0;left:0};--layout-fixed-left:{position:fixed;top:0;bottom:0;left:0};}</style><dom-module id="iron-image" assetpath="../../bower_components/iron-image/"><template><style>:host{display:inline-block;overflow:hidden;position:relative}#sizedImgDiv{@apply(--layout-fit);display:none}#img{display:block;width:var(--iron-image-width,auto);height:var(--iron-image-height,auto)}:host([sizing]) #sizedImgDiv{display:block}:host([sizing]) #img{display:none}#placeholder{@apply(--layout-fit);background-color:inherit;opacity:1;@apply(--iron-image-placeholder)}#placeholder.faded-out{transition:opacity .5s linear;opacity:0}</style><div id="sizedImgDiv" role="img" hidden$="[[_computeImgDivHidden(sizing)]]" aria-hidden$="[[_computeImgDivARIAHidden(alt)]]" aria-label$="[[_computeImgDivARIALabel(alt, src)]]"></div><img id="img" alt$="[[alt]]" hidden$="[[_computeImgHidden(sizing)]]"><div id="placeholder" hidden$="[[_computePlaceholderHidden(preload, fade, loading, loaded)]]" class$="[[_computePlaceholderClassName(preload, fade, loading, loaded)]]"></div></template><script>Polymer({is:"iron-image",properties:{src:{observer:"_srcChanged",type:String,value:""},alt:{type:String,value:null},preventLoad:{type:Boolean,value:!1,observer:"_preventLoadChanged"},sizing:{type:String,value:null,reflectToAttribute:!0},position:{type:String,value:"center"},preload:{type:Boolean,value:!1},placeholder:{type:String,value:null,observer:"_placeholderChanged"},fade:{type:Boolean,value:!1},loaded:{notify:!0,readOnly:!0,type:Boolean,value:!1},loading:{notify:!0,readOnly:!0,type:Boolean,value:!1},error:{notify:!0,readOnly:!0,type:Boolean,value:!1},width:{observer:"_widthChanged",type:Number,value:null},height:{observer:"_heightChanged",type:Number,value:null}},observers:["_transformChanged(sizing, position)"],ready:function(){var e=this.$.img;e.onload=function(){this.$.img.src===this._resolveSrc(this.src)&&(this._setLoading(!1),this._setLoaded(!0),this._setError(!1))}.bind(this),e.onerror=function(){this.$.img.src===this._resolveSrc(this.src)&&(this._reset(),this._setLoading(!1),this._setLoaded(!1),this._setError(!0))}.bind(this),this._resolvedSrc=""},_load:function(e){e?this.$.img.src=e:this.$.img.removeAttribute("src"),this.$.sizedImgDiv.style.backgroundImage=e?'url("'+e+'")':"",this._setLoading(!!e),this._setLoaded(!1),this._setError(!1)},_reset:function(){this.$.img.removeAttribute("src"),this.$.sizedImgDiv.style.backgroundImage="",this._setLoading(!1),this._setLoaded(!1),this._setError(!1)},_computePlaceholderHidden:function(){return!this.preload||!this.fade&&!this.loading&&this.loaded},_computePlaceholderClassName:function(){return this.preload&&this.fade&&!this.loading&&this.loaded?"faded-out":""},_computeImgDivHidden:function(){return!this.sizing},_computeImgDivARIAHidden:function(){return""===this.alt?"true":void 0},_computeImgDivARIALabel:function(){if(null!==this.alt)return this.alt;if(""===this.src)return"";var e=new URL(this._resolveSrc(this.src)).pathname.split("/");return e[e.length-1]},_computeImgHidden:function(){return!!this.sizing},_widthChanged:function(){this.style.width=isNaN(this.width)?this.width:this.width+"px"},_heightChanged:function(){this.style.height=isNaN(this.height)?this.height:this.height+"px"},_preventLoadChanged:function(){this.preventLoad||this.loaded||(this._reset(),this._load(this.src))},_srcChanged:function(e,t){var i=this._resolveSrc(e);i!==this._resolvedSrc&&(this._resolvedSrc=i,this._reset(),this.preventLoad||this._load(e))},_placeholderChanged:function(){this.$.placeholder.style.backgroundImage=this.placeholder?'url("'+this.placeholder+'")':""},_transformChanged:function(){var e=this.$.sizedImgDiv.style,t=this.$.placeholder.style;e.backgroundSize=t.backgroundSize=this.sizing,e.backgroundPosition=t.backgroundPosition=this.sizing?this.position:"",e.backgroundRepeat=t.backgroundRepeat=this.sizing?"no-repeat":""},_resolveSrc:function(e){var t=this.ownerDocument.baseURI;return new URL(Polymer.ResolveUrl.resolveUrl(e,t),t).href}})</script></dom-module><style is="custom-style">:root{--google-red-100:#f4c7c3;--google-red-300:#e67c73;--google-red-500:#db4437;--google-red-700:#c53929;--google-blue-100:#c6dafc;--google-blue-300:#7baaf7;--google-blue-500:#4285f4;--google-blue-700:#3367d6;--google-green-100:#b7e1cd;--google-green-300:#57bb8a;--google-green-500:#0f9d58;--google-green-700:#0b8043;--google-yellow-100:#fce8b2;--google-yellow-300:#f7cb4d;--google-yellow-500:#f4b400;--google-yellow-700:#f09300;--google-grey-100:#f5f5f5;--google-grey-300:#e0e0e0;--google-grey-500:#9e9e9e;--google-grey-700:#616161;--paper-red-50:#ffebee;--paper-red-100:#ffcdd2;--paper-red-200:#ef9a9a;--paper-red-300:#e57373;--paper-red-400:#ef5350;--paper-red-500:#f44336;--paper-red-600:#e53935;--paper-red-700:#d32f2f;--paper-red-800:#c62828;--paper-red-900:#b71c1c;--paper-red-a100:#ff8a80;--paper-red-a200:#ff5252;--paper-red-a400:#ff1744;--paper-red-a700:#d50000;--paper-pink-50:#fce4ec;--paper-pink-100:#f8bbd0;--paper-pink-200:#f48fb1;--paper-pink-300:#f06292;--paper-pink-400:#ec407a;--paper-pink-500:#e91e63;--paper-pink-600:#d81b60;--paper-pink-700:#c2185b;--paper-pink-800:#ad1457;--paper-pink-900:#880e4f;--paper-pink-a100:#ff80ab;--paper-pink-a200:#ff4081;--paper-pink-a400:#f50057;--paper-pink-a700:#c51162;--paper-purple-50:#f3e5f5;--paper-purple-100:#e1bee7;--paper-purple-200:#ce93d8;--paper-purple-300:#ba68c8;--paper-purple-400:#ab47bc;--paper-purple-500:#9c27b0;--paper-purple-600:#8e24aa;--paper-purple-700:#7b1fa2;--paper-purple-800:#6a1b9a;--paper-purple-900:#4a148c;--paper-purple-a100:#ea80fc;--paper-purple-a200:#e040fb;--paper-purple-a400:#d500f9;--paper-purple-a700:#aa00ff;--paper-deep-purple-50:#ede7f6;--paper-deep-purple-100:#d1c4e9;--paper-deep-purple-200:#b39ddb;--paper-deep-purple-300:#9575cd;--paper-deep-purple-400:#7e57c2;--paper-deep-purple-500:#673ab7;--paper-deep-purple-600:#5e35b1;--paper-deep-purple-700:#512da8;--paper-deep-purple-800:#4527a0;--paper-deep-purple-900:#311b92;--paper-deep-purple-a100:#b388ff;--paper-deep-purple-a200:#7c4dff;--paper-deep-purple-a400:#651fff;--paper-deep-purple-a700:#6200ea;--paper-indigo-50:#e8eaf6;--paper-indigo-100:#c5cae9;--paper-indigo-200:#9fa8da;--paper-indigo-300:#7986cb;--paper-indigo-400:#5c6bc0;--paper-indigo-500:#3f51b5;--paper-indigo-600:#3949ab;--paper-indigo-700:#303f9f;--paper-indigo-800:#283593;--paper-indigo-900:#1a237e;--paper-indigo-a100:#8c9eff;--paper-indigo-a200:#536dfe;--paper-indigo-a400:#3d5afe;--paper-indigo-a700:#304ffe;--paper-blue-50:#e3f2fd;--paper-blue-100:#bbdefb;--paper-blue-200:#90caf9;--paper-blue-300:#64b5f6;--paper-blue-400:#42a5f5;--paper-blue-500:#2196f3;--paper-blue-600:#1e88e5;--paper-blue-700:#1976d2;--paper-blue-800:#1565c0;--paper-blue-900:#0d47a1;--paper-blue-a100:#82b1ff;--paper-blue-a200:#448aff;--paper-blue-a400:#2979ff;--paper-blue-a700:#2962ff;--paper-light-blue-50:#e1f5fe;--paper-light-blue-100:#b3e5fc;--paper-light-blue-200:#81d4fa;--paper-light-blue-300:#4fc3f7;--paper-light-blue-400:#29b6f6;--paper-light-blue-500:#03a9f4;--paper-light-blue-600:#039be5;--paper-light-blue-700:#0288d1;--paper-light-blue-800:#0277bd;--paper-light-blue-900:#01579b;--paper-light-blue-a100:#80d8ff;--paper-light-blue-a200:#40c4ff;--paper-light-blue-a400:#00b0ff;--paper-light-blue-a700:#0091ea;--paper-cyan-50:#e0f7fa;--paper-cyan-100:#b2ebf2;--paper-cyan-200:#80deea;--paper-cyan-300:#4dd0e1;--paper-cyan-400:#26c6da;--paper-cyan-500:#00bcd4;--paper-cyan-600:#00acc1;--paper-cyan-700:#0097a7;--paper-cyan-800:#00838f;--paper-cyan-900:#006064;--paper-cyan-a100:#84ffff;--paper-cyan-a200:#18ffff;--paper-cyan-a400:#00e5ff;--paper-cyan-a700:#00b8d4;--paper-teal-50:#e0f2f1;--paper-teal-100:#b2dfdb;--paper-teal-200:#80cbc4;--paper-teal-300:#4db6ac;--paper-teal-400:#26a69a;--paper-teal-500:#009688;--paper-teal-600:#00897b;--paper-teal-700:#00796b;--paper-teal-800:#00695c;--paper-teal-900:#004d40;--paper-teal-a100:#a7ffeb;--paper-teal-a200:#64ffda;--paper-teal-a400:#1de9b6;--paper-teal-a700:#00bfa5;--paper-green-50:#e8f5e9;--paper-green-100:#c8e6c9;--paper-green-200:#a5d6a7;--paper-green-300:#81c784;--paper-green-400:#66bb6a;--paper-green-500:#4caf50;--paper-green-600:#43a047;--paper-green-700:#388e3c;--paper-green-800:#2e7d32;--paper-green-900:#1b5e20;--paper-green-a100:#b9f6ca;--paper-green-a200:#69f0ae;--paper-green-a400:#00e676;--paper-green-a700:#00c853;--paper-light-green-50:#f1f8e9;--paper-light-green-100:#dcedc8;--paper-light-green-200:#c5e1a5;--paper-light-green-300:#aed581;--paper-light-green-400:#9ccc65;--paper-light-green-500:#8bc34a;--paper-light-green-600:#7cb342;--paper-light-green-700:#689f38;--paper-light-green-800:#558b2f;--paper-light-green-900:#33691e;--paper-light-green-a100:#ccff90;--paper-light-green-a200:#b2ff59;--paper-light-green-a400:#76ff03;--paper-light-green-a700:#64dd17;--paper-lime-50:#f9fbe7;--paper-lime-100:#f0f4c3;--paper-lime-200:#e6ee9c;--paper-lime-300:#dce775;--paper-lime-400:#d4e157;--paper-lime-500:#cddc39;--paper-lime-600:#c0ca33;--paper-lime-700:#afb42b;--paper-lime-800:#9e9d24;--paper-lime-900:#827717;--paper-lime-a100:#f4ff81;--paper-lime-a200:#eeff41;--paper-lime-a400:#c6ff00;--paper-lime-a700:#aeea00;--paper-yellow-50:#fffde7;--paper-yellow-100:#fff9c4;--paper-yellow-200:#fff59d;--paper-yellow-300:#fff176;--paper-yellow-400:#ffee58;--paper-yellow-500:#ffeb3b;--paper-yellow-600:#fdd835;--paper-yellow-700:#fbc02d;--paper-yellow-800:#f9a825;--paper-yellow-900:#f57f17;--paper-yellow-a100:#ffff8d;--paper-yellow-a200:#ffff00;--paper-yellow-a400:#ffea00;--paper-yellow-a700:#ffd600;--paper-amber-50:#fff8e1;--paper-amber-100:#ffecb3;--paper-amber-200:#ffe082;--paper-amber-300:#ffd54f;--paper-amber-400:#ffca28;--paper-amber-500:#ffc107;--paper-amber-600:#ffb300;--paper-amber-700:#ffa000;--paper-amber-800:#ff8f00;--paper-amber-900:#ff6f00;--paper-amber-a100:#ffe57f;--paper-amber-a200:#ffd740;--paper-amber-a400:#ffc400;--paper-amber-a700:#ffab00;--paper-orange-50:#fff3e0;--paper-orange-100:#ffe0b2;--paper-orange-200:#ffcc80;--paper-orange-300:#ffb74d;--paper-orange-400:#ffa726;--paper-orange-500:#ff9800;--paper-orange-600:#fb8c00;--paper-orange-700:#f57c00;--paper-orange-800:#ef6c00;--paper-orange-900:#e65100;--paper-orange-a100:#ffd180;--paper-orange-a200:#ffab40;--paper-orange-a400:#ff9100;--paper-orange-a700:#ff6500;--paper-deep-orange-50:#fbe9e7;--paper-deep-orange-100:#ffccbc;--paper-deep-orange-200:#ffab91;--paper-deep-orange-300:#ff8a65;--paper-deep-orange-400:#ff7043;--paper-deep-orange-500:#ff5722;--paper-deep-orange-600:#f4511e;--paper-deep-orange-700:#e64a19;--paper-deep-orange-800:#d84315;--paper-deep-orange-900:#bf360c;--paper-deep-orange-a100:#ff9e80;--paper-deep-orange-a200:#ff6e40;--paper-deep-orange-a400:#ff3d00;--paper-deep-orange-a700:#dd2c00;--paper-brown-50:#efebe9;--paper-brown-100:#d7ccc8;--paper-brown-200:#bcaaa4;--paper-brown-300:#a1887f;--paper-brown-400:#8d6e63;--paper-brown-500:#795548;--paper-brown-600:#6d4c41;--paper-brown-700:#5d4037;--paper-brown-800:#4e342e;--paper-brown-900:#3e2723;--paper-grey-50:#fafafa;--paper-grey-100:#f5f5f5;--paper-grey-200:#eeeeee;--paper-grey-300:#e0e0e0;--paper-grey-400:#bdbdbd;--paper-grey-500:#9e9e9e;--paper-grey-600:#757575;--paper-grey-700:#616161;--paper-grey-800:#424242;--paper-grey-900:#212121;--paper-blue-grey-50:#eceff1;--paper-blue-grey-100:#cfd8dc;--paper-blue-grey-200:#b0bec5;--paper-blue-grey-300:#90a4ae;--paper-blue-grey-400:#78909c;--paper-blue-grey-500:#607d8b;--paper-blue-grey-600:#546e7a;--paper-blue-grey-700:#455a64;--paper-blue-grey-800:#37474f;--paper-blue-grey-900:#263238;--dark-divider-opacity:0.12;--dark-disabled-opacity:0.38;--dark-secondary-opacity:0.54;--dark-primary-opacity:0.87;--light-divider-opacity:0.12;--light-disabled-opacity:0.3;--light-secondary-opacity:0.7;--light-primary-opacity:1.0}</style><style is="custom-style">:root{--primary-text-color:var(--light-theme-text-color);--primary-background-color:var(--light-theme-background-color);--secondary-text-color:var(--light-theme-secondary-color);--disabled-text-color:var(--light-theme-disabled-color);--divider-color:var(--light-theme-divider-color);--error-color:var(--paper-deep-orange-a700);--primary-color:var(--paper-indigo-500);--light-primary-color:var(--paper-indigo-100);--dark-primary-color:var(--paper-indigo-700);--accent-color:var(--paper-pink-a200);--light-accent-color:var(--paper-pink-a100);--dark-accent-color:var(--paper-pink-a400);--light-theme-background-color:#ffffff;--light-theme-base-color:#000000;--light-theme-text-color:var(--paper-grey-900);--light-theme-secondary-color:#737373;--light-theme-disabled-color:#9b9b9b;--light-theme-divider-color:#dbdbdb;--dark-theme-background-color:var(--paper-grey-900);--dark-theme-base-color:#ffffff;--dark-theme-text-color:#ffffff;--dark-theme-secondary-color:#bcbcbc;--dark-theme-disabled-color:#646464;--dark-theme-divider-color:#3c3c3c;--text-primary-color:var(--dark-theme-text-color);--default-primary-color:var(--primary-color)}</style><dom-module id="paper-card" assetpath="../../bower_components/paper-card/"><template><style include="paper-material">:host{display:inline-block;position:relative;box-sizing:border-box;background-color:var(--paper-card-background-color,--primary-background-color);border-radius:2px;@apply(--paper-font-common-base);@apply(--paper-card)}[hidden]{display:none!important}.header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;overflow:hidden;@apply(--paper-card-header)}.header iron-image{display:block;width:100%;--iron-image-width:100%;pointer-events:none;@apply(--paper-card-header-image)}.header .title-text{padding:16px;font-size:24px;font-weight:400;color:var(--paper-card-header-color,#000);@apply(--paper-card-header-text)}.header .title-text.over-image{position:absolute;bottom:0;@apply(--paper-card-header-image-text)}:host ::content .card-content{padding:16px;position:relative;@apply(--paper-card-content)}:host ::content .card-actions{border-top:1px solid #e8e8e8;padding:5px 16px;position:relative;@apply(--paper-card-actions)}</style><div class="header"><iron-image hidden$="[[!image]]" aria-hidden$="[[_isHidden(image)]]" src="[[image]]" alt="[[alt]]" placeholder="[[placeholderImage]]" preload="[[preloadImage]]" fade="[[fadeImage]]"></iron-image><div hidden$="[[!heading]]" class$="title-text [[_computeHeadingClass(image)]]">[[heading]]</div></div><content></content></template><script>Polymer({is:"paper-card",properties:{heading:{type:String,value:"",observer:"_headingChanged"},image:{type:String,value:""},alt:{type:String},preloadImage:{type:Boolean,value:!1},fadeImage:{type:Boolean,value:!1},placeholderImage:{type:String,value:null},elevation:{type:Number,value:1,reflectToAttribute:!0},animatedShadow:{type:Boolean,value:!1},animated:{type:Boolean,reflectToAttribute:!0,readOnly:!0,computed:"_computeAnimated(animatedShadow)"}},_isHidden:function(e){return e?"false":"true"},_headingChanged:function(e){var t=this.getAttribute("heading"),a=this.getAttribute("aria-label");"string"==typeof a&&a!==t||this.setAttribute("aria-label",e)},_computeHeadingClass:function(e){return e?" over-image":""},_computeAnimated:function(e){return e}})</script></dom-module><dom-module id="ha-progress-button" assetpath="../../src/components/buttons/"><template><style>.container{position:relative;display:inline-block}paper-button{transition:all 1s}.success paper-button{color:#fff;background-color:var(--google-green-500);transition:none}.error paper-button{color:#fff;background-color:var(--google-red-500);transition:none}paper-button[disabled]{color:#c8c8c8}.progress{@apply(--layout);@apply(--layout-center-center);position:absolute;top:0;left:0;right:0;bottom:0}</style><div class="container" id="container"><paper-button id="button" disabled="[[computeDisabled(disabled, progress)]]" on-tap="buttonTapped"><slot></slot></paper-button><template is="dom-if" if="[[progress]]"><div class="progress"><paper-spinner active=""></paper-spinner></div></template></div></template></dom-module><script>Polymer({is:"ha-progress-button",properties:{hass:{type:Object},progress:{type:Boolean,value:!1},domain:{type:String},service:{type:String},serviceData:{type:Object,value:{}},disabled:{type:Boolean,value:!1}},tempClass:function(t){var e=this.$.container.classList;e.add(t),this.async(function(){e.remove(t)},1e3)},listeners:{tap:"buttonTapped"},buttonTapped:function(t){this.progress&&t.stopPropagation()},actionSuccess:function(){this.tempClass("success")},actionError:function(){this.tempClass("error")},computeDisabled:function(t,e){return t||e}})</script><dom-module id="ha-call-service-button" assetpath="../../src/components/buttons/"><template><ha-progress-button id="progress" progress="[[progress]]" on-tap="buttonTapped"><slot></slot></ha-progress-button></template></dom-module><script>Polymer({is:"ha-call-service-button",properties:{hass:{type:Object},progress:{type:Boolean,value:!1},domain:{type:String},service:{type:String},serviceData:{type:Object,value:{}}},buttonTapped:function(){this.progress=!0;var e=this,s={domain:this.domain,service:this.service,serviceData:this.serviceData};this.hass.callService(this.domain,this.service,this.serviceData).then(function(){e.progress=!1,e.$.progress.actionSuccess(),s.success=!0},function(){e.progress=!1,e.$.progress.actionError(),s.success=!1}).then(function(){e.fire("hass-service-called",s)})}})</script></div><dom-module id="ha-panel-zwave"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}.card-actions.warning ha-call-service-button{color:var(--google-red-500)}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Z-Wave Manager</div></app-toolbar></app-header><div class="content"><paper-card heading="Z-Wave Network Management"><div class="card-content">Z-Wave Network controls.</div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="add_node_secure">Add Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="remove_failed_node">Remove Failed Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="remove_node">Remove Node</ha-call-service-button></div><div class="card-actions warning"><ha-call-service-button hass="[[hass]]" domain="zwave" service="cancel_command">Cancel Command</ha-call-service-button></div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="heal_network">Heal Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="start_network">Start Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="stop_network">Stop Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="soft_reset">Soft Reset</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="test_network">Test Network</ha-call-service-button></div></paper-card></div></app-header-layout></template></dom-module><script>Polymer({is:"ha-panel-zwave",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1}}})</script></body></html> \ No newline at end of file +<html><head><meta charset="UTF-8"></head><body><div hidden="" by-vulcanize=""><style>[hidden]{display:none!important}</style><style is="custom-style">:root{--layout:{display:-ms-flexbox;display:-webkit-flex;display:flex};--layout-inline:{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex};--layout-horizontal:{@apply(--layout);-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row};--layout-horizontal-reverse:{@apply(--layout);-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse};--layout-vertical:{@apply(--layout);-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column};--layout-vertical-reverse:{@apply(--layout);-ms-flex-direction:column-reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse};--layout-wrap:{-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap};--layout-no-wrap:{-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap};--layout-wrap-reverse:{-ms-flex-wrap:wrap-reverse;-webkit-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse};--layout-flex-auto:{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto};--layout-flex-none:{-ms-flex:none;-webkit-flex:none;flex:none};--layout-flex:{-ms-flex:1 1 .000000001px;-webkit-flex:1;flex:1;-webkit-flex-basis:.000000001px;flex-basis:.000000001px};--layout-flex-2:{-ms-flex:2;-webkit-flex:2;flex:2};--layout-flex-3:{-ms-flex:3;-webkit-flex:3;flex:3};--layout-flex-4:{-ms-flex:4;-webkit-flex:4;flex:4};--layout-flex-5:{-ms-flex:5;-webkit-flex:5;flex:5};--layout-flex-6:{-ms-flex:6;-webkit-flex:6;flex:6};--layout-flex-7:{-ms-flex:7;-webkit-flex:7;flex:7};--layout-flex-8:{-ms-flex:8;-webkit-flex:8;flex:8};--layout-flex-9:{-ms-flex:9;-webkit-flex:9;flex:9};--layout-flex-10:{-ms-flex:10;-webkit-flex:10;flex:10};--layout-flex-11:{-ms-flex:11;-webkit-flex:11;flex:11};--layout-flex-12:{-ms-flex:12;-webkit-flex:12;flex:12};--layout-start:{-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start};--layout-center:{-ms-flex-align:center;-webkit-align-items:center;align-items:center};--layout-end:{-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end};--layout-baseline:{-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline};--layout-start-justified:{-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start};--layout-center-justified:{-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center};--layout-end-justified:{-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end};--layout-around-justified:{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around};--layout-justified:{-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between};--layout-center-center:{@apply(--layout-center);@apply(--layout-center-justified)};--layout-self-start:{-ms-align-self:flex-start;-webkit-align-self:flex-start;align-self:flex-start};--layout-self-center:{-ms-align-self:center;-webkit-align-self:center;align-self:center};--layout-self-end:{-ms-align-self:flex-end;-webkit-align-self:flex-end;align-self:flex-end};--layout-self-stretch:{-ms-align-self:stretch;-webkit-align-self:stretch;align-self:stretch};--layout-self-baseline:{-ms-align-self:baseline;-webkit-align-self:baseline;align-self:baseline};--layout-start-aligned:{-ms-flex-line-pack:start;-ms-align-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start};--layout-end-aligned:{-ms-flex-line-pack:end;-ms-align-content:flex-end;-webkit-align-content:flex-end;align-content:flex-end};--layout-center-aligned:{-ms-flex-line-pack:center;-ms-align-content:center;-webkit-align-content:center;align-content:center};--layout-between-aligned:{-ms-flex-line-pack:justify;-ms-align-content:space-between;-webkit-align-content:space-between;align-content:space-between};--layout-around-aligned:{-ms-flex-line-pack:distribute;-ms-align-content:space-around;-webkit-align-content:space-around;align-content:space-around};--layout-block:{display:block};--layout-invisible:{visibility:hidden!important};--layout-relative:{position:relative};--layout-fit:{position:absolute;top:0;right:0;bottom:0;left:0};--layout-scroll:{-webkit-overflow-scrolling:touch;overflow:auto};--layout-fullbleed:{margin:0;height:100vh};--layout-fixed-top:{position:fixed;top:0;left:0;right:0};--layout-fixed-right:{position:fixed;top:0;right:0;bottom:0};--layout-fixed-bottom:{position:fixed;right:0;bottom:0;left:0};--layout-fixed-left:{position:fixed;top:0;bottom:0;left:0};}</style><dom-module id="iron-image" assetpath="../../bower_components/iron-image/"><template><style>:host{display:inline-block;overflow:hidden;position:relative}#sizedImgDiv{@apply(--layout-fit);display:none}#img{display:block;width:var(--iron-image-width,auto);height:var(--iron-image-height,auto)}:host([sizing]) #sizedImgDiv{display:block}:host([sizing]) #img{display:none}#placeholder{@apply(--layout-fit);background-color:inherit;opacity:1;@apply(--iron-image-placeholder)}#placeholder.faded-out{transition:opacity .5s linear;opacity:0}</style><div id="sizedImgDiv" role="img" hidden$="[[_computeImgDivHidden(sizing)]]" aria-hidden$="[[_computeImgDivARIAHidden(alt)]]" aria-label$="[[_computeImgDivARIALabel(alt, src)]]"></div><img id="img" alt$="[[alt]]" hidden$="[[_computeImgHidden(sizing)]]"><div id="placeholder" hidden$="[[_computePlaceholderHidden(preload, fade, loading, loaded)]]" class$="[[_computePlaceholderClassName(preload, fade, loading, loaded)]]"></div></template><script>Polymer({is:"iron-image",properties:{src:{observer:"_srcChanged",type:String,value:""},alt:{type:String,value:null},preventLoad:{type:Boolean,value:!1,observer:"_preventLoadChanged"},sizing:{type:String,value:null,reflectToAttribute:!0},position:{type:String,value:"center"},preload:{type:Boolean,value:!1},placeholder:{type:String,value:null,observer:"_placeholderChanged"},fade:{type:Boolean,value:!1},loaded:{notify:!0,readOnly:!0,type:Boolean,value:!1},loading:{notify:!0,readOnly:!0,type:Boolean,value:!1},error:{notify:!0,readOnly:!0,type:Boolean,value:!1},width:{observer:"_widthChanged",type:Number,value:null},height:{observer:"_heightChanged",type:Number,value:null}},observers:["_transformChanged(sizing, position)"],ready:function(){var e=this.$.img;e.onload=function(){this.$.img.src===this._resolveSrc(this.src)&&(this._setLoading(!1),this._setLoaded(!0),this._setError(!1))}.bind(this),e.onerror=function(){this.$.img.src===this._resolveSrc(this.src)&&(this._reset(),this._setLoading(!1),this._setLoaded(!1),this._setError(!0))}.bind(this),this._resolvedSrc=""},_load:function(e){e?this.$.img.src=e:this.$.img.removeAttribute("src"),this.$.sizedImgDiv.style.backgroundImage=e?'url("'+e+'")':"",this._setLoading(!!e),this._setLoaded(!1),this._setError(!1)},_reset:function(){this.$.img.removeAttribute("src"),this.$.sizedImgDiv.style.backgroundImage="",this._setLoading(!1),this._setLoaded(!1),this._setError(!1)},_computePlaceholderHidden:function(){return!this.preload||!this.fade&&!this.loading&&this.loaded},_computePlaceholderClassName:function(){return this.preload&&this.fade&&!this.loading&&this.loaded?"faded-out":""},_computeImgDivHidden:function(){return!this.sizing},_computeImgDivARIAHidden:function(){return""===this.alt?"true":void 0},_computeImgDivARIALabel:function(){if(null!==this.alt)return this.alt;if(""===this.src)return"";var e=new URL(this._resolveSrc(this.src)).pathname.split("/");return e[e.length-1]},_computeImgHidden:function(){return!!this.sizing},_widthChanged:function(){this.style.width=isNaN(this.width)?this.width:this.width+"px"},_heightChanged:function(){this.style.height=isNaN(this.height)?this.height:this.height+"px"},_preventLoadChanged:function(){this.preventLoad||this.loaded||(this._reset(),this._load(this.src))},_srcChanged:function(e,t){var i=this._resolveSrc(e);i!==this._resolvedSrc&&(this._resolvedSrc=i,this._reset(),this.preventLoad||this._load(e))},_placeholderChanged:function(){this.$.placeholder.style.backgroundImage=this.placeholder?'url("'+this.placeholder+'")':""},_transformChanged:function(){var e=this.$.sizedImgDiv.style,t=this.$.placeholder.style;e.backgroundSize=t.backgroundSize=this.sizing,e.backgroundPosition=t.backgroundPosition=this.sizing?this.position:"",e.backgroundRepeat=t.backgroundRepeat=this.sizing?"no-repeat":""},_resolveSrc:function(e){var t=this.ownerDocument.baseURI;return new URL(Polymer.ResolveUrl.resolveUrl(e,t),t).href}})</script></dom-module><style is="custom-style">:root{--google-red-100:#f4c7c3;--google-red-300:#e67c73;--google-red-500:#db4437;--google-red-700:#c53929;--google-blue-100:#c6dafc;--google-blue-300:#7baaf7;--google-blue-500:#4285f4;--google-blue-700:#3367d6;--google-green-100:#b7e1cd;--google-green-300:#57bb8a;--google-green-500:#0f9d58;--google-green-700:#0b8043;--google-yellow-100:#fce8b2;--google-yellow-300:#f7cb4d;--google-yellow-500:#f4b400;--google-yellow-700:#f09300;--google-grey-100:#f5f5f5;--google-grey-300:#e0e0e0;--google-grey-500:#9e9e9e;--google-grey-700:#616161;--paper-red-50:#ffebee;--paper-red-100:#ffcdd2;--paper-red-200:#ef9a9a;--paper-red-300:#e57373;--paper-red-400:#ef5350;--paper-red-500:#f44336;--paper-red-600:#e53935;--paper-red-700:#d32f2f;--paper-red-800:#c62828;--paper-red-900:#b71c1c;--paper-red-a100:#ff8a80;--paper-red-a200:#ff5252;--paper-red-a400:#ff1744;--paper-red-a700:#d50000;--paper-pink-50:#fce4ec;--paper-pink-100:#f8bbd0;--paper-pink-200:#f48fb1;--paper-pink-300:#f06292;--paper-pink-400:#ec407a;--paper-pink-500:#e91e63;--paper-pink-600:#d81b60;--paper-pink-700:#c2185b;--paper-pink-800:#ad1457;--paper-pink-900:#880e4f;--paper-pink-a100:#ff80ab;--paper-pink-a200:#ff4081;--paper-pink-a400:#f50057;--paper-pink-a700:#c51162;--paper-purple-50:#f3e5f5;--paper-purple-100:#e1bee7;--paper-purple-200:#ce93d8;--paper-purple-300:#ba68c8;--paper-purple-400:#ab47bc;--paper-purple-500:#9c27b0;--paper-purple-600:#8e24aa;--paper-purple-700:#7b1fa2;--paper-purple-800:#6a1b9a;--paper-purple-900:#4a148c;--paper-purple-a100:#ea80fc;--paper-purple-a200:#e040fb;--paper-purple-a400:#d500f9;--paper-purple-a700:#aa00ff;--paper-deep-purple-50:#ede7f6;--paper-deep-purple-100:#d1c4e9;--paper-deep-purple-200:#b39ddb;--paper-deep-purple-300:#9575cd;--paper-deep-purple-400:#7e57c2;--paper-deep-purple-500:#673ab7;--paper-deep-purple-600:#5e35b1;--paper-deep-purple-700:#512da8;--paper-deep-purple-800:#4527a0;--paper-deep-purple-900:#311b92;--paper-deep-purple-a100:#b388ff;--paper-deep-purple-a200:#7c4dff;--paper-deep-purple-a400:#651fff;--paper-deep-purple-a700:#6200ea;--paper-indigo-50:#e8eaf6;--paper-indigo-100:#c5cae9;--paper-indigo-200:#9fa8da;--paper-indigo-300:#7986cb;--paper-indigo-400:#5c6bc0;--paper-indigo-500:#3f51b5;--paper-indigo-600:#3949ab;--paper-indigo-700:#303f9f;--paper-indigo-800:#283593;--paper-indigo-900:#1a237e;--paper-indigo-a100:#8c9eff;--paper-indigo-a200:#536dfe;--paper-indigo-a400:#3d5afe;--paper-indigo-a700:#304ffe;--paper-blue-50:#e3f2fd;--paper-blue-100:#bbdefb;--paper-blue-200:#90caf9;--paper-blue-300:#64b5f6;--paper-blue-400:#42a5f5;--paper-blue-500:#2196f3;--paper-blue-600:#1e88e5;--paper-blue-700:#1976d2;--paper-blue-800:#1565c0;--paper-blue-900:#0d47a1;--paper-blue-a100:#82b1ff;--paper-blue-a200:#448aff;--paper-blue-a400:#2979ff;--paper-blue-a700:#2962ff;--paper-light-blue-50:#e1f5fe;--paper-light-blue-100:#b3e5fc;--paper-light-blue-200:#81d4fa;--paper-light-blue-300:#4fc3f7;--paper-light-blue-400:#29b6f6;--paper-light-blue-500:#03a9f4;--paper-light-blue-600:#039be5;--paper-light-blue-700:#0288d1;--paper-light-blue-800:#0277bd;--paper-light-blue-900:#01579b;--paper-light-blue-a100:#80d8ff;--paper-light-blue-a200:#40c4ff;--paper-light-blue-a400:#00b0ff;--paper-light-blue-a700:#0091ea;--paper-cyan-50:#e0f7fa;--paper-cyan-100:#b2ebf2;--paper-cyan-200:#80deea;--paper-cyan-300:#4dd0e1;--paper-cyan-400:#26c6da;--paper-cyan-500:#00bcd4;--paper-cyan-600:#00acc1;--paper-cyan-700:#0097a7;--paper-cyan-800:#00838f;--paper-cyan-900:#006064;--paper-cyan-a100:#84ffff;--paper-cyan-a200:#18ffff;--paper-cyan-a400:#00e5ff;--paper-cyan-a700:#00b8d4;--paper-teal-50:#e0f2f1;--paper-teal-100:#b2dfdb;--paper-teal-200:#80cbc4;--paper-teal-300:#4db6ac;--paper-teal-400:#26a69a;--paper-teal-500:#009688;--paper-teal-600:#00897b;--paper-teal-700:#00796b;--paper-teal-800:#00695c;--paper-teal-900:#004d40;--paper-teal-a100:#a7ffeb;--paper-teal-a200:#64ffda;--paper-teal-a400:#1de9b6;--paper-teal-a700:#00bfa5;--paper-green-50:#e8f5e9;--paper-green-100:#c8e6c9;--paper-green-200:#a5d6a7;--paper-green-300:#81c784;--paper-green-400:#66bb6a;--paper-green-500:#4caf50;--paper-green-600:#43a047;--paper-green-700:#388e3c;--paper-green-800:#2e7d32;--paper-green-900:#1b5e20;--paper-green-a100:#b9f6ca;--paper-green-a200:#69f0ae;--paper-green-a400:#00e676;--paper-green-a700:#00c853;--paper-light-green-50:#f1f8e9;--paper-light-green-100:#dcedc8;--paper-light-green-200:#c5e1a5;--paper-light-green-300:#aed581;--paper-light-green-400:#9ccc65;--paper-light-green-500:#8bc34a;--paper-light-green-600:#7cb342;--paper-light-green-700:#689f38;--paper-light-green-800:#558b2f;--paper-light-green-900:#33691e;--paper-light-green-a100:#ccff90;--paper-light-green-a200:#b2ff59;--paper-light-green-a400:#76ff03;--paper-light-green-a700:#64dd17;--paper-lime-50:#f9fbe7;--paper-lime-100:#f0f4c3;--paper-lime-200:#e6ee9c;--paper-lime-300:#dce775;--paper-lime-400:#d4e157;--paper-lime-500:#cddc39;--paper-lime-600:#c0ca33;--paper-lime-700:#afb42b;--paper-lime-800:#9e9d24;--paper-lime-900:#827717;--paper-lime-a100:#f4ff81;--paper-lime-a200:#eeff41;--paper-lime-a400:#c6ff00;--paper-lime-a700:#aeea00;--paper-yellow-50:#fffde7;--paper-yellow-100:#fff9c4;--paper-yellow-200:#fff59d;--paper-yellow-300:#fff176;--paper-yellow-400:#ffee58;--paper-yellow-500:#ffeb3b;--paper-yellow-600:#fdd835;--paper-yellow-700:#fbc02d;--paper-yellow-800:#f9a825;--paper-yellow-900:#f57f17;--paper-yellow-a100:#ffff8d;--paper-yellow-a200:#ffff00;--paper-yellow-a400:#ffea00;--paper-yellow-a700:#ffd600;--paper-amber-50:#fff8e1;--paper-amber-100:#ffecb3;--paper-amber-200:#ffe082;--paper-amber-300:#ffd54f;--paper-amber-400:#ffca28;--paper-amber-500:#ffc107;--paper-amber-600:#ffb300;--paper-amber-700:#ffa000;--paper-amber-800:#ff8f00;--paper-amber-900:#ff6f00;--paper-amber-a100:#ffe57f;--paper-amber-a200:#ffd740;--paper-amber-a400:#ffc400;--paper-amber-a700:#ffab00;--paper-orange-50:#fff3e0;--paper-orange-100:#ffe0b2;--paper-orange-200:#ffcc80;--paper-orange-300:#ffb74d;--paper-orange-400:#ffa726;--paper-orange-500:#ff9800;--paper-orange-600:#fb8c00;--paper-orange-700:#f57c00;--paper-orange-800:#ef6c00;--paper-orange-900:#e65100;--paper-orange-a100:#ffd180;--paper-orange-a200:#ffab40;--paper-orange-a400:#ff9100;--paper-orange-a700:#ff6500;--paper-deep-orange-50:#fbe9e7;--paper-deep-orange-100:#ffccbc;--paper-deep-orange-200:#ffab91;--paper-deep-orange-300:#ff8a65;--paper-deep-orange-400:#ff7043;--paper-deep-orange-500:#ff5722;--paper-deep-orange-600:#f4511e;--paper-deep-orange-700:#e64a19;--paper-deep-orange-800:#d84315;--paper-deep-orange-900:#bf360c;--paper-deep-orange-a100:#ff9e80;--paper-deep-orange-a200:#ff6e40;--paper-deep-orange-a400:#ff3d00;--paper-deep-orange-a700:#dd2c00;--paper-brown-50:#efebe9;--paper-brown-100:#d7ccc8;--paper-brown-200:#bcaaa4;--paper-brown-300:#a1887f;--paper-brown-400:#8d6e63;--paper-brown-500:#795548;--paper-brown-600:#6d4c41;--paper-brown-700:#5d4037;--paper-brown-800:#4e342e;--paper-brown-900:#3e2723;--paper-grey-50:#fafafa;--paper-grey-100:#f5f5f5;--paper-grey-200:#eeeeee;--paper-grey-300:#e0e0e0;--paper-grey-400:#bdbdbd;--paper-grey-500:#9e9e9e;--paper-grey-600:#757575;--paper-grey-700:#616161;--paper-grey-800:#424242;--paper-grey-900:#212121;--paper-blue-grey-50:#eceff1;--paper-blue-grey-100:#cfd8dc;--paper-blue-grey-200:#b0bec5;--paper-blue-grey-300:#90a4ae;--paper-blue-grey-400:#78909c;--paper-blue-grey-500:#607d8b;--paper-blue-grey-600:#546e7a;--paper-blue-grey-700:#455a64;--paper-blue-grey-800:#37474f;--paper-blue-grey-900:#263238;--dark-divider-opacity:0.12;--dark-disabled-opacity:0.38;--dark-secondary-opacity:0.54;--dark-primary-opacity:0.87;--light-divider-opacity:0.12;--light-disabled-opacity:0.3;--light-secondary-opacity:0.7;--light-primary-opacity:1.0}</style><style is="custom-style">:root{--primary-text-color:var(--light-theme-text-color);--primary-background-color:var(--light-theme-background-color);--secondary-text-color:var(--light-theme-secondary-color);--disabled-text-color:var(--light-theme-disabled-color);--divider-color:var(--light-theme-divider-color);--error-color:var(--paper-deep-orange-a700);--primary-color:var(--paper-indigo-500);--light-primary-color:var(--paper-indigo-100);--dark-primary-color:var(--paper-indigo-700);--accent-color:var(--paper-pink-a200);--light-accent-color:var(--paper-pink-a100);--dark-accent-color:var(--paper-pink-a400);--light-theme-background-color:#ffffff;--light-theme-base-color:#000000;--light-theme-text-color:var(--paper-grey-900);--light-theme-secondary-color:#737373;--light-theme-disabled-color:#9b9b9b;--light-theme-divider-color:#dbdbdb;--dark-theme-background-color:var(--paper-grey-900);--dark-theme-base-color:#ffffff;--dark-theme-text-color:#ffffff;--dark-theme-secondary-color:#bcbcbc;--dark-theme-disabled-color:#646464;--dark-theme-divider-color:#3c3c3c;--text-primary-color:var(--dark-theme-text-color);--default-primary-color:var(--primary-color)}</style><dom-module id="paper-card" assetpath="../../bower_components/paper-card/"><template><style include="paper-material">:host{display:inline-block;position:relative;box-sizing:border-box;background-color:var(--paper-card-background-color,--primary-background-color);border-radius:2px;@apply(--paper-font-common-base);@apply(--paper-card)}[hidden]{display:none!important}.header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;overflow:hidden;@apply(--paper-card-header)}.header iron-image{display:block;width:100%;--iron-image-width:100%;pointer-events:none;@apply(--paper-card-header-image)}.header .title-text{padding:16px;font-size:24px;font-weight:400;color:var(--paper-card-header-color,#000);@apply(--paper-card-header-text)}.header .title-text.over-image{position:absolute;bottom:0;@apply(--paper-card-header-image-text)}:host ::content .card-content{padding:16px;position:relative;@apply(--paper-card-content)}:host ::content .card-actions{border-top:1px solid #e8e8e8;padding:5px 16px;position:relative;@apply(--paper-card-actions)}</style><div class="header"><iron-image hidden$="[[!image]]" aria-hidden$="[[_isHidden(image)]]" src="[[image]]" alt="[[alt]]" placeholder="[[placeholderImage]]" preload="[[preloadImage]]" fade="[[fadeImage]]"></iron-image><div hidden$="[[!heading]]" class$="title-text [[_computeHeadingClass(image)]]">[[heading]]</div></div><content></content></template><script>Polymer({is:"paper-card",properties:{heading:{type:String,value:"",observer:"_headingChanged"},image:{type:String,value:""},alt:{type:String},preloadImage:{type:Boolean,value:!1},fadeImage:{type:Boolean,value:!1},placeholderImage:{type:String,value:null},elevation:{type:Number,value:1,reflectToAttribute:!0},animatedShadow:{type:Boolean,value:!1},animated:{type:Boolean,reflectToAttribute:!0,readOnly:!0,computed:"_computeAnimated(animatedShadow)"}},_isHidden:function(e){return e?"false":"true"},_headingChanged:function(e){var t=this.getAttribute("heading"),a=this.getAttribute("aria-label");"string"==typeof a&&a!==t||this.setAttribute("aria-label",e)},_computeHeadingClass:function(e){return e?" over-image":""},_computeAnimated:function(e){return e}})</script></dom-module><script>Polymer.IronSelection=function(e){this.selection=[],this.selectCallback=e},Polymer.IronSelection.prototype={get:function(){return this.multi?this.selection.slice():this.selection[0]},clear:function(e){this.selection.slice().forEach(function(t){(!e||e.indexOf(t)<0)&&this.setItemSelected(t,!1)},this)},isSelected:function(e){return this.selection.indexOf(e)>=0},setItemSelected:function(e,t){if(null!=e&&t!==this.isSelected(e)){if(t)this.selection.push(e);else{var i=this.selection.indexOf(e);i>=0&&this.selection.splice(i,1)}this.selectCallback&&this.selectCallback(e,t)}},select:function(e){this.multi?this.toggle(e):this.get()!==e&&(this.setItemSelected(this.get(),!1),this.setItemSelected(e,!0))},toggle:function(e){this.setItemSelected(e,!this.isSelected(e))}}</script><script>Polymer.IronSelectableBehavior={properties:{attrForSelected:{type:String,value:null},selected:{type:String,notify:!0},selectedItem:{type:Object,readOnly:!0,notify:!0},activateEvent:{type:String,value:"tap",observer:"_activateEventChanged"},selectable:String,selectedClass:{type:String,value:"iron-selected"},selectedAttribute:{type:String,value:null},fallbackSelection:{type:String,value:null},items:{type:Array,readOnly:!0,notify:!0,value:function(){return[]}},_excludedLocalNames:{type:Object,value:function(){return{template:1}}}},observers:["_updateAttrForSelected(attrForSelected)","_updateSelected(selected)","_checkFallback(fallbackSelection)"],created:function(){this._bindFilterItem=this._filterItem.bind(this),this._selection=new Polymer.IronSelection(this._applySelection.bind(this))},attached:function(){this._observer=this._observeItems(this),this._updateItems(),this._shouldUpdateSelection||this._updateSelected(),this._addListener(this.activateEvent)},detached:function(){this._observer&&Polymer.dom(this).unobserveNodes(this._observer),this._removeListener(this.activateEvent)},indexOf:function(e){return this.items.indexOf(e)},select:function(e){this.selected=e},selectPrevious:function(){var e=this.items.length,t=(Number(this._valueToIndex(this.selected))-1+e)%e;this.selected=this._indexToValue(t)},selectNext:function(){var e=(Number(this._valueToIndex(this.selected))+1)%this.items.length;this.selected=this._indexToValue(e)},selectIndex:function(e){this.select(this._indexToValue(e))},forceSynchronousItemUpdate:function(){this._updateItems()},get _shouldUpdateSelection(){return null!=this.selected},_checkFallback:function(){this._shouldUpdateSelection&&this._updateSelected()},_addListener:function(e){this.listen(this,e,"_activateHandler")},_removeListener:function(e){this.unlisten(this,e,"_activateHandler")},_activateEventChanged:function(e,t){this._removeListener(t),this._addListener(e)},_updateItems:function(){var e=Polymer.dom(this).queryDistributedElements(this.selectable||"*");e=Array.prototype.filter.call(e,this._bindFilterItem),this._setItems(e)},_updateAttrForSelected:function(){this._shouldUpdateSelection&&(this.selected=this._indexToValue(this.indexOf(this.selectedItem)))},_updateSelected:function(){this._selectSelected(this.selected)},_selectSelected:function(e){this._selection.select(this._valueToItem(this.selected)),this.fallbackSelection&&this.items.length&&void 0===this._selection.get()&&(this.selected=this.fallbackSelection)},_filterItem:function(e){return!this._excludedLocalNames[e.localName]},_valueToItem:function(e){return null==e?null:this.items[this._valueToIndex(e)]},_valueToIndex:function(e){if(!this.attrForSelected)return Number(e);for(var t,i=0;t=this.items[i];i++)if(this._valueForItem(t)==e)return i},_indexToValue:function(e){if(!this.attrForSelected)return e;var t=this.items[e];return t?this._valueForItem(t):void 0},_valueForItem:function(e){var t=e[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];return void 0!=t?t:e.getAttribute(this.attrForSelected)},_applySelection:function(e,t){this.selectedClass&&this.toggleClass(this.selectedClass,t,e),this.selectedAttribute&&this.toggleAttribute(this.selectedAttribute,t,e),this._selectionChange(),this.fire("iron-"+(t?"select":"deselect"),{item:e})},_selectionChange:function(){this._setSelectedItem(this._selection.get())},_observeItems:function(e){return Polymer.dom(e).observeNodes(function(e){this._updateItems(),this._shouldUpdateSelection&&this._updateSelected(),this.fire("iron-items-changed",e,{bubbles:!1,cancelable:!1})})},_activateHandler:function(e){for(var t=e.target,i=this.items;t&&t!=this;){var s=i.indexOf(t);if(s>=0){var n=this._indexToValue(s);return void this._itemActivate(n,t)}t=t.parentNode}},_itemActivate:function(e,t){this.fire("iron-activate",{selected:e,item:t},{cancelable:!0}).defaultPrevented||this.select(e)}}</script><script>Polymer.IronMultiSelectableBehaviorImpl={properties:{multi:{type:Boolean,value:!1,observer:"multiChanged"},selectedValues:{type:Array,notify:!0},selectedItems:{type:Array,readOnly:!0,notify:!0}},observers:["_updateSelected(selectedValues.splices)"],select:function(e){this.multi?this.selectedValues?this._toggleSelected(e):this.selectedValues=[e]:this.selected=e},multiChanged:function(e){this._selection.multi=e},get _shouldUpdateSelection(){return null!=this.selected||null!=this.selectedValues&&this.selectedValues.length},_updateAttrForSelected:function(){this.multi?this._shouldUpdateSelection&&(this.selectedValues=this.selectedItems.map(function(e){return this._indexToValue(this.indexOf(e))},this).filter(function(e){return null!=e},this)):Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this)},_updateSelected:function(){this.multi?this._selectMulti(this.selectedValues):this._selectSelected(this.selected)},_selectMulti:function(e){if(e){var t=this._valuesToItems(e);this._selection.clear(t);for(var l=0;l<t.length;l++)this._selection.setItemSelected(t[l],!0);if(this.fallbackSelection&&this.items.length&&!this._selection.get().length){this._valueToItem(this.fallbackSelection)&&(this.selectedValues=[this.fallbackSelection])}}else this._selection.clear()},_selectionChange:function(){var e=this._selection.get();this.multi?this._setSelectedItems(e):(this._setSelectedItems([e]),this._setSelectedItem(e))},_toggleSelected:function(e){var t=this.selectedValues.indexOf(e);t<0?this.push("selectedValues",e):this.splice("selectedValues",t,1)},_valuesToItems:function(e){return null==e?null:e.map(function(e){return this._valueToItem(e)},this)}},Polymer.IronMultiSelectableBehavior=[Polymer.IronSelectableBehavior,Polymer.IronMultiSelectableBehaviorImpl]</script><script>Polymer.IronMenuBehaviorImpl={properties:{focusedItem:{observer:"_focusedItemChanged",readOnly:!0,type:Object},attrForItemTitle:{type:String},disabled:{type:Boolean,value:!1,observer:"_disabledChanged"}},_SEARCH_RESET_TIMEOUT_MS:1e3,_previousTabIndex:0,hostAttributes:{role:"menu"},observers:["_updateMultiselectable(multi)"],listeners:{focus:"_onFocus",keydown:"_onKeydown","iron-items-changed":"_onIronItemsChanged"},keyBindings:{up:"_onUpKey",down:"_onDownKey",esc:"_onEscKey","shift+tab:keydown":"_onShiftTabDown"},attached:function(){this._resetTabindices()},select:function(e){this._defaultFocusAsync&&(this.cancelAsync(this._defaultFocusAsync),this._defaultFocusAsync=null);var t=this._valueToItem(e);t&&t.hasAttribute("disabled")||(this._setFocusedItem(t),Polymer.IronMultiSelectableBehaviorImpl.select.apply(this,arguments))},_resetTabindices:function(){var e=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this.items.forEach(function(t){t.setAttribute("tabindex",t===e?"0":"-1")},this)},_updateMultiselectable:function(e){e?this.setAttribute("aria-multiselectable","true"):this.removeAttribute("aria-multiselectable")},_focusWithKeyboardEvent:function(e){this.cancelDebouncer("_clearSearchText");var t=this._searchText||"";t+=(e.key&&1==e.key.length?e.key:String.fromCharCode(e.keyCode)).toLocaleLowerCase();for(var i,s=t.length,o=0;i=this.items[o];o++)if(!i.hasAttribute("disabled")){var n=this.attrForItemTitle||"textContent",r=(i[n]||i.getAttribute(n)||"").trim();if(!(r.length<s)&&r.slice(0,s).toLocaleLowerCase()==t){this._setFocusedItem(i);break}}this._searchText=t,this.debounce("_clearSearchText",this._clearSearchText,this._SEARCH_RESET_TIMEOUT_MS)},_clearSearchText:function(){this._searchText=""},_focusPrevious:function(){for(var e=this.items.length,t=Number(this.indexOf(this.focusedItem)),i=1;i<e+1;i++){var s=this.items[(t-i+e)%e];if(!s.hasAttribute("disabled")){var o=Polymer.dom(s).getOwnerRoot()||document;if(this._setFocusedItem(s),Polymer.dom(o).activeElement==s)return}}},_focusNext:function(){for(var e=this.items.length,t=Number(this.indexOf(this.focusedItem)),i=1;i<e+1;i++){var s=this.items[(t+i)%e];if(!s.hasAttribute("disabled")){var o=Polymer.dom(s).getOwnerRoot()||document;if(this._setFocusedItem(s),Polymer.dom(o).activeElement==s)return}}},_applySelection:function(e,t){t?e.setAttribute("aria-selected","true"):e.removeAttribute("aria-selected"),Polymer.IronSelectableBehavior._applySelection.apply(this,arguments)},_focusedItemChanged:function(e,t){t&&t.setAttribute("tabindex","-1"),!e||e.hasAttribute("disabled")||this.disabled||(e.setAttribute("tabindex","0"),e.focus())},_onIronItemsChanged:function(e){e.detail.addedNodes.length&&this._resetTabindices()},_onShiftTabDown:function(e){var t=this.getAttribute("tabindex");Polymer.IronMenuBehaviorImpl._shiftTabPressed=!0,this._setFocusedItem(null),this.setAttribute("tabindex","-1"),this.async(function(){this.setAttribute("tabindex",t),Polymer.IronMenuBehaviorImpl._shiftTabPressed=!1},1)},_onFocus:function(e){if(!Polymer.IronMenuBehaviorImpl._shiftTabPressed){var t=Polymer.dom(e).rootTarget;(t===this||void 0===t.tabIndex||this.isLightDescendant(t))&&(this._defaultFocusAsync=this.async(function(){var e=this.multi?this.selectedItems&&this.selectedItems[0]:this.selectedItem;this._setFocusedItem(null),e?this._setFocusedItem(e):this.items[0]&&this._focusNext()}))}},_onUpKey:function(e){this._focusPrevious(),e.detail.keyboardEvent.preventDefault()},_onDownKey:function(e){this._focusNext(),e.detail.keyboardEvent.preventDefault()},_onEscKey:function(e){this.focusedItem.blur()},_onKeydown:function(e){this.keyboardEventMatchesKeys(e,"up down esc")||this._focusWithKeyboardEvent(e),e.stopPropagation()},_activateHandler:function(e){Polymer.IronSelectableBehavior._activateHandler.call(this,e),e.stopPropagation()},_disabledChanged:function(e){e?(this._previousTabIndex=this.hasAttribute("tabindex")?this.tabIndex:0,this.removeAttribute("tabindex")):this.hasAttribute("tabindex")||this.setAttribute("tabindex",this._previousTabIndex)}},Polymer.IronMenuBehaviorImpl._shiftTabPressed=!1,Polymer.IronMenuBehavior=[Polymer.IronMultiSelectableBehavior,Polymer.IronA11yKeysBehavior,Polymer.IronMenuBehaviorImpl]</script><dom-module id="paper-listbox" assetpath="../../bower_components/paper-listbox/"><template><style>:host{display:block;padding:8px 0;background:var(--paper-listbox-background-color,--primary-background-color);color:var(--paper-listbox-color,--primary-text-color);@apply(--paper-listbox)}</style><content></content></template><script>!function(){Polymer({is:"paper-listbox",behaviors:[Polymer.IronMenuBehavior],hostAttributes:{role:"listbox"}})}()</script></dom-module><dom-module id="ha-progress-button" assetpath="../../src/components/buttons/"><template><style>.container{position:relative;display:inline-block}paper-button{transition:all 1s}.success paper-button{color:#fff;background-color:var(--google-green-500);transition:none}.error paper-button{color:#fff;background-color:var(--google-red-500);transition:none}paper-button[disabled]{color:#c8c8c8}.progress{@apply(--layout);@apply(--layout-center-center);position:absolute;top:0;left:0;right:0;bottom:0}</style><div class="container" id="container"><paper-button id="button" disabled="[[computeDisabled(disabled, progress)]]" on-tap="buttonTapped"><slot></slot></paper-button><template is="dom-if" if="[[progress]]"><div class="progress"><paper-spinner active=""></paper-spinner></div></template></div></template></dom-module><script>Polymer({is:"ha-progress-button",properties:{hass:{type:Object},progress:{type:Boolean,value:!1},domain:{type:String},service:{type:String},serviceData:{type:Object,value:{}},disabled:{type:Boolean,value:!1}},tempClass:function(t){var e=this.$.container.classList;e.add(t),this.async(function(){e.remove(t)},1e3)},listeners:{tap:"buttonTapped"},buttonTapped:function(t){this.progress&&t.stopPropagation()},actionSuccess:function(){this.tempClass("success")},actionError:function(){this.tempClass("error")},computeDisabled:function(t,e){return t||e}})</script><dom-module id="ha-call-service-button" assetpath="../../src/components/buttons/"><template><ha-progress-button id="progress" progress="[[progress]]" on-tap="buttonTapped"><slot></slot></ha-progress-button></template></dom-module><script>Polymer({is:"ha-call-service-button",properties:{hass:{type:Object},progress:{type:Boolean,value:!1},domain:{type:String},service:{type:String},serviceData:{type:Object,value:{}}},buttonTapped:function(){this.progress=!0;var e=this,s={domain:this.domain,service:this.service,serviceData:this.serviceData};this.hass.callService(this.domain,this.service,this.serviceData).then(function(){e.progress=!1,e.$.progress.actionSuccess(),s.success=!0},function(){e.progress=!1,e.$.progress.actionError(),s.success=!1}).then(function(){e.fire("hass-service-called",s)})}})</script><dom-module id="ozw-log" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}</style><paper-card heading="OZW Log"><div class="help-text"><pre>[[ozwLogs]]</pre></div><div class="card-actions"><paper-button raised="" on-tap="refreshLog">Refresh</paper-button></div></paper-card></template></dom-module><script>Polymer({is:"ozw-log",properties:{hass:{type:Object},ozwLogs:{type:String,value:""}},refreshLog:function(){this.ozwLogs="Loading ozw log...",this.hass.callApi("GET","zwave/ozwlog").then(function(o){this.ozwLogs=o}.bind(this))}})</script><dom-module id="zwave-network" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}.card-actions.warning ha-call-service-button{color:var(--google-red-500)}</style><paper-card heading="Z-Wave Network Management"><div class="card-content">Z-Wave Network controls.</div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="add_node_secure">Add Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="remove_node">Remove Node</ha-call-service-button></div><div class="card-actions warning"><ha-call-service-button hass="[[hass]]" domain="zwave" service="cancel_command">Cancel Command</ha-call-service-button></div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="heal_network">Heal Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="start_network">Start Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="stop_network">Stop Network</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="soft_reset">Soft Reset</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="test_network">Test Network</ha-call-service-button></div></paper-card></template></dom-module><script>Polymer({is:"zwave-network",properties:{hass:{type:Object}}})</script><dom-module id="zwave-node-information" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}.node-info{margin-left:16px;text-transform:capitalize}paper-card{display:block;margin:0 auto;max-width:600px}paper-button[toggles][active]{background:#d3d3d3}</style><div class="content"><paper-card heading="Node Information"><div class="card-actions"><paper-button toggles="" raised="" noink="" active="{{nodeInfoActive}}">Show</paper-button></div><template is="dom-if" if="{{nodeInfoActive}}"><template is="dom-repeat" items="[[selectedNodeAttrs]]" as="state"><div class="node-info"><span>[[state]]</span></div></template></template></paper-card></div></template></dom-module><script>Polymer({ + is: 'zwave-node-information', + + properties: { + nodes: { + type: Array, + observer: 'nodeChanged' + }, + + selectedNode: { + type: Number, + value: -1, + observer: 'nodeChanged' + }, + + selectedNodeAttrs: { + type: Array, + }, + + nodeInfoActive: { + type: Boolean, + }, + }, + + nodeChanged: function (selectedNode) { + if (!this.nodes || selectedNode === -1) return; + var nodeAttrs = this.nodes[this.selectedNode].attributes; + var att = []; + Object.entries(nodeAttrs).forEach(([key, value]) => { + att.push(key + ': ' + value); + }); + this.selectedNodeAttrs = att.sort(); + }, +});</script><dom-module id="zwave-node-config" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}.device-picker{@apply(--layout-horizontal);@apply(--layout-center-center);padding-left:24px;padding-right:24px;padding-bottom:24px}.help-text{padding-left:24px;padding-right:24px}</style><div class="content"><paper-card heading="Node config options"><template is="dom-if" if="[[wakeupNode]]"><div class="card-actions"><paper-input float-label="Wakeup Interval" type="number" value="{{wakeupInput}}" placeholder="[[computeGetWakeupValue(selectedNode)]]"><div suffix="">seconds</div></paper-input><ha-call-service-button hass="[[hass]]" domain="zwave" service="set_wakeup" service-data="[[computeWakeupServiceData(wakeupInput)]]">Set Wakeup</ha-call-service-button></div></template><div class="device-picker"><paper-dropdown-menu label="Config parameter" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedConfigParameter}}"><template is="dom-repeat" items="[[config]]" as="state"><paper-item>[[computeSelectCaptionConfigParameter(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><template is="dom-if" if="[[isConfigParameterSelected(selectedConfigParameter, 'List')]]"><div class="device-picker"><paper-dropdown-menu label="Config value" class="flex" placeholder="{{loadedConfigValue}}"><paper-listbox class="dropdown-content" selected="{{selectedConfigValue}}"><template is="dom-repeat" items="[[selectedConfigParameterValues]]" as="state"><paper-item>[[state]]</paper-item></template></paper-listbox></paper-dropdown-menu></div></template><template is="dom-if" if="[[isConfigParameterSelected(selectedConfigParameter, 'Byte Short Int')]]"><div class="card-actions"><paper-input label="{{selectedConfigParameterNumValues}}" type="number" value="{{selectedConfigValue}}" max="{{configParameterMax}}" min="{{configParameterMin}}"></paper-input></div></template><template is="dom-if" if="[[isConfigParameterSelected(selectedConfigParameter, 'Bool Button')]]"><div class="device-picker"><paper-dropdown-menu label="Config value" class="flex" placeholder="{{loadedConfigValue}}"><paper-listbox class="dropdown-content" selected="{{selectedConfigValue}}"><template is="dom-repeat" items="[[selectedConfigParameterValues]]" as="state"><paper-item>[[state]]</paper-item></template></paper-listbox></paper-dropdown-menu></div></template><div class="help-text"><span>[[configValueHelpText]]</span></div><template is="dom-if" if="[[isConfigParameterSelected(selectedConfigParameter, 'Bool Button Byte Short Int List')]]"><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="set_config_parameter" service-data="[[computeSetConfigParameterServiceData(selectedConfigValue)]]">Set Config Parameter</ha-call-service-button></div></template></paper-card></div></template></dom-module><script>Polymer({ + is: 'zwave-node-config', + + properties: { + hass: { + type: Object, + }, + + nodes: { + type: Array, + observer: 'nodesChanged' + }, + + selectedNode: { + type: Number, + value: -1, + observer: 'nodesChanged' + }, + + config: { + type: Array, + value: function () { + return []; + } + }, + + selectedConfigParameter: { + type: Number, + value: -1, + observer: 'selectedConfigParameterChanged' + }, + + configParameterMax: { + type: Number, + value: -1 + }, + + configParameterMin: { + type: Number, + value: -1 + }, + + configValueHelpText: { + type: String, + value: '', + computed: 'computeConfigValueHelp(selectedConfigParameter)' + }, + + selectedConfigParameterType: { + type: String, + value: '' + }, + + selectedConfigValue: { + type: Number, + value: -1, + observer: 'computeSetConfigParameterServiceData' + }, + + selectedConfigParameterValues: { + type: Array, + value: function () { + return []; + } + }, + + selectedConfigParameterNumValues: { + type: String, + value: '' + }, + + loadedConfigValue: { + type: Number, + value: -1 + }, + + wakeupInput: { + type: Number, + }, + + wakeupNode: { + type: Boolean, + value: false, + }, + }, + + listeners: { + 'hass-service-called': 'serviceCalled', + }, + + serviceCalled: function (ev) { + if (ev.detail.success) { + var foo = this; + setTimeout(function () { + foo.refreshConfig(foo.selectedNode); + }, 5000); + } + }, + + nodesChanged: function () { + if (!this.nodes) return; + this.wakeupNode = (this.nodes[this.selectedNode].attributes.wake_up_interval === 0 || + this.nodes[this.selectedNode].attributes.wake_up_interval); + if (this.wakeupNode) { + if (this.nodes[this.selectedNode].attributes.wake_up_interval === 0) this.wakeupInput = ''; + else this.wakeupInput = this.nodes[this.selectedNode].attributes.wake_up_interval; + } + }, + + computeGetWakeupValue: function (selectedNode) { + if (this.selectedNode === -1 || + !this.nodes[selectedNode].attributes.wake_up_interval) return 'unknown'; + return (this.nodes[selectedNode].attributes.wake_up_interval); + }, + + computeWakeupServiceData: function (wakeupInput) { + return { node_id: this.nodes[this.selectedNode].attributes.node_id, + value: wakeupInput }; + }, + + computeConfigValueHelp: function (selectedConfigParameter) { + if (selectedConfigParameter === -1) return ''; + var helpText = this.config[selectedConfigParameter].value.help; + if (!helpText) return ['No helptext available']; + return helpText; + }, + + computeSetConfigParameterServiceData: function (selectedConfigValue) { + if (this.selectedNode === -1 || this.selectedConfigParameter === -1) return -1; + var valueData = null; + if (('Short Byte Int').includes(this.selectedConfigParameterType)) { + valueData = parseInt(selectedConfigValue, 10); + } if (('Bool Button').includes(this.selectedConfigParameterType)) { + valueData = this.selectedConfigParameterValues[selectedConfigValue]; + } if (this.selectedConfigParameterType === 'List') { + valueData = this.selectedConfigParameterValues[selectedConfigValue]; + } + return { node_id: this.nodes[this.selectedNode].attributes.node_id, + parameter: this.config[this.selectedConfigParameter].key, + value: valueData }; + }, + + selectedConfigParameterChanged: function (selectedConfigParameter) { + if (selectedConfigParameter === -1) return; + this.selectedConfigValue = -1; + this.loadedConfigValue = -1; + this.selectedConfigParameterValues = []; + this.selectedConfigParameterType = this.config[selectedConfigParameter].value.type; + this.configParameterMax = this.config[selectedConfigParameter].value.max; + this.configParameterMin = this.config[selectedConfigParameter].value.min; + this.loadedConfigValue = this.config[selectedConfigParameter].value.data; + this.configValueHelpText = this.config[selectedConfigParameter].value.help; + if (('Short Byte Int').includes(this.selectedConfigParameterType)) { + this.selectedConfigParameterNumValues = this.config[selectedConfigParameter].value.data_items; + this.selectedConfigValue = this.loadedConfigValue; + } + if (('Bool Button').includes(this.selectedConfigParameterType)) { + this.selectedConfigParameterValues = ['True', 'False']; + if (this.config[selectedConfigParameter].value.data) { + this.loadedConfigValue = 'True'; + } else this.loadedConfigValue = 'False'; + } + if (('List').includes(this.selectedConfigParameterType)) { + this.selectedConfigParameterValues = this.config[selectedConfigParameter].value.data_items; + } + }, + + isConfigParameterSelected: function (selectedConfigParameter, type) { + if (selectedConfigParameter === -1) return false; + if (this.config[selectedConfigParameter].value.type === type) return true; + if (type.includes(this.config[selectedConfigParameter].value.type)) return true; + return false; + }, + + computeSelectCaptionConfigParameter: function (stateObj) { + return (stateObj.key + ': ' + stateObj.value.label); + }, + + refreshConfig: function (selectedNode) { + var configData = []; + this.hass.callApi('GET', 'zwave/config/' + this.nodes[selectedNode].attributes.node_id).then(function (config) { + Object.entries(config).forEach(([key, value]) => { + configData.push({ key, value }); + }); + this.config = configData; + this.selectedConfigParameterChanged(this.selectedConfigParameter); + }.bind(this)); + }, +});</script><dom-module id="zwave-usercodes" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}.device-picker{@apply(--layout-horizontal);@apply(--layout-center-center);padding-left:24px;padding-right:24px;padding-bottom:24px}</style><div class="content"><paper-card heading="Node user codes"><div class="device-picker"><paper-dropdown-menu label="Code slot" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedUserCode}}"><template is="dom-repeat" items="[[userCodes]]" as="state"><paper-item>[[computeSelectCaptionUserCodes(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><template is="dom-if" if="[[isUserCodeSelected(selectedUserCode)]]"><div class="card-actions"><paper-input label="User code" type="number" value="{{selectedUserCodeValue}}" maxlength="{{userCodeMaxLen}}" min="0"></paper-input></div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="lock" service="set_usercode" service-data="[[computeUserCodeServiceData(selectedUserCodeValue, "Add")]]">Set Usercode</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="lock" service="clear_usercode" service-data="[[computeUserCodeServiceData(selectedUserCode, "Delete")]]">Delete Usercode</ha-call-service-button></div></template></paper-card></div></template></dom-module><script>Polymer({ + is: 'zwave-usercodes', + + properties: { + hass: { + type: Object, + }, + + nodes: { + type: Array, + }, + + selectedNode: { + type: Number, + }, + + userCodes: { + type: Object, + }, + + userCodeMaxLen: { + type: Number, + value: 4 + }, + + selectedUserCode: { + type: Number, + value: -1, + observer: 'selectedUserCodeChanged' + }, + + selectedUserCodeValue: { + type: Number, + value: -1 + }, + }, + + listeners: { + 'hass-service-called': 'serviceCalled', + }, + serviceCalled: function (ev) { + if (ev.detail.success) { + var foo = this; + setTimeout(function () { + foo.refreshUserCodes(foo.selectedNode); + }, 5000); + } + }, + + isUserCodeSelected: function (selectedUserCode) { + if (selectedUserCode === -1) return false; + return true; + }, + + computeSelectCaptionUserCodes: function (stateObj) { + return (stateObj.key + ': ' + stateObj.value.label); + }, + + selectedUserCodeChanged: function (selectedUserCode) { + if (this.selectedUserCode === -1 || selectedUserCode === -1) return; + var value = (parseInt((this.userCodes[selectedUserCode].value.code).trim())); + this.userCodeMaxLen = (this.userCodes[selectedUserCode].value.length); + if (isNaN(value)) this.selectedUserCodeValue = ''; + else this.selectedUserCodeValue = value; + }, + + computeUserCodeServiceData: function (selectedUserCodeValue, type) { + if (this.selectedNode === -1 || !selectedUserCodeValue) return -1; + var serviceData = null; + var valueData = null; + if (type === 'Add') { + valueData = selectedUserCodeValue; + serviceData = { node_id: this.nodes[this.selectedNode].attributes.node_id, + code_slot: this.selectedUserCode, + usercode: valueData }; + } + if (type === 'Delete') { + serviceData = { node_id: this.nodes[this.selectedNode].attributes.node_id, + code_slot: this.selectedUserCode }; + } + return serviceData; + }, + + refreshUserCodes: function (selectedNode) { + this.selectedUserCodeValue = ''; + var userCodes = []; + this.hass.callApi('GET', 'zwave/usercodes/' + this.nodes[selectedNode].attributes.node_id).then(function (usercodes) { + Object.entries(usercodes).forEach(([key, value]) => { + userCodes.push({ key, value }); + }); + this.userCodes = userCodes; + this.selectedUserCodeChanged(this.selectedUserCode); + }.bind(this)); + }, +});</script><dom-module id="zwave-groups" assetpath="./"><template><style include="iron-flex ha-style">.content{margin-top:24px}paper-card{display:block;margin:0 auto;max-width:600px}.device-picker{@apply(--layout-horizontal);@apply(--layout-center-center);padding-left:24px;padding-right:24px;padding-bottom:24px}.help-text{padding-left:24px;padding-right:24px}</style><div class="content"><paper-card heading="Node group associations"><div class="device-picker"><paper-dropdown-menu label="Node to control" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedTargetNode}}"><template is="dom-repeat" items="[[nodes]]" as="state"><paper-item>[[computeSelectCaption(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><template is="dom-if" if="[[!computeIsTargetNodeSelected(selectedTargetNode)]]"><div class="device-picker"><paper-dropdown-menu label="Group" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedGroup}}"><template is="dom-repeat" items="[[groups]]" as="state"><paper-item>[[computeSelectCaptionGroup(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div></template><template is="dom-if" if="[[!computeIsGroupSelected(selectedGroup)]]"><div class="help-text"><span>Other Nodes in this group:</span><template is="dom-repeat" items="[[otherGroupNodes]]" as="state"><span>[[state]]</span></template></div><div class="help-text"><span>Max Associations:</span> <span>[[maxAssociations]]</span></div><div class="card-actions"><template is="dom-if" if="[[!noAssociationsLeft]]"><ha-call-service-button hass="[[hass]]" domain="zwave" service="change_association" service-data="[[computeAssocServiceData(selectedGroup, "add")]]">Add To Group</ha-call-service-button></template><ha-call-service-button hass="[[hass]]" domain="zwave" service="change_association" service-data="[[computeAssocServiceData(selectedGroup, "remove")]]">Remove From Group</ha-call-service-button></div></template></paper-card></div></template></dom-module><script>Polymer({ + is: 'zwave-groups', + + properties: { + hass: { + type: Object, + }, + + nodes: { + type: Array, + }, + + groups: { + type: Array, + }, + + selectedNode: { + type: Number, + }, + + selectedTargetNode: { + type: Number, + value: -1 + }, + + selectedGroup: { + type: Number, + value: -1, + observer: 'selectedGroupChanged' + }, + + otherGroupNodes: { + type: Array, + value: -1, + computed: 'computeOtherGroupNodes(selectedGroup)' + }, + + maxAssociations: { + type: String, + value: '', + computed: 'computeMaxAssociations(selectedGroup)' + }, + + noAssociationsLeft: { + type: Boolean, + value: true, + computed: 'computeAssociationsLeft(selectedGroup)' + }, + }, + + listeners: { + 'hass-service-called': 'serviceCalled', + }, + + serviceCalled: function (ev) { + if (ev.detail.success) { + var foo = this; + setTimeout(function () { + foo.refreshGroups(foo.selectedNode); + }, 5000); + } + }, + + computeAssociationsLeft: function (selectedGroup) { + if (selectedGroup === -1) return true; + return (this.maxAssociations === this.otherGroupNodes.length); + }, + + computeMaxAssociations: function (selectedGroup) { + if (selectedGroup === -1) return -1; + var maxAssociations = this.groups[selectedGroup].value.max_associations; + if (!maxAssociations) return ['None']; + return maxAssociations; + }, + + computeOtherGroupNodes: function (selectedGroup) { + if (selectedGroup === -1) return -1; + var associations = Object.values(this.groups[selectedGroup].value.associations); + if (!associations.length) return ['None']; + return associations; + }, + + computeSelectCaption: function (stateObj) { + return window.hassUtil.computeStateName(stateObj) + ' (Node:' + + stateObj.attributes.node_id + ' ' + + stateObj.attributes.query_stage + ')'; + }, + + computeSelectCaptionGroup: function (stateObj) { + return (stateObj.key + ': ' + stateObj.value.label); + }, + + computeIsTargetNodeSelected: function (selectedTargetNode) { + return (!this.nodes || selectedTargetNode === -1); + }, + + computeIsGroupSelected: function (selectedGroup) { + return (!this.nodes || this.selectedNode === -1 || selectedGroup === -1); + }, + + computeAssocServiceData: function (selectedGroup, type) { + if (!this.groups === -1 || selectedGroup === -1 || this.selectedNode === -1) return -1; + return { node_id: this.nodes[this.selectedNode].attributes.node_id, + association: type, + target_node_id: this.nodes[this.selectedTargetNode].attributes.node_id, + group: this.groups[selectedGroup].key }; + }, + + refreshGroups: function (selectedNode) { + var groupData = []; + this.hass.callApi('GET', 'zwave/groups/' + this.nodes[selectedNode].attributes.node_id).then(function (groups) { + Object.entries(groups).forEach(([key, value]) => { + groupData.push({ key, value }); + }); + this.groups = groupData; + this.selectedGroupChanged(this.selectedGroup); + }.bind(this)); + }, + + selectedGroupChanged: function (selectedGroup) { + if (this.selectedGroup === -1 || selectedGroup === -1) return; + this.maxAssociations = this.groups[selectedGroup].value.max_associations; + this.otherGroupNodes = Object.values(this.groups[selectedGroup].value.associations); + }, +});</script></div><dom-module id="ha-panel-zwave"><template><style include="iron-flex ha-style">.content{margin-top:24px}.node-info{margin-left:16px;text-transform:capitalize}.help-text{padding-left:24px;padding-right:24px}paper-card{display:block;margin:0 auto;max-width:600px}.device-picker{@apply(--layout-horizontal);@apply(--layout-center-center);padding-left:24px;padding-right:24px;padding-bottom:24px}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Z-Wave Manager</div></app-toolbar></app-header><div class="content"><zwave-network id="zwave-network" hass="[[hass]]"></zwave-network></div><div class="content"><paper-card heading="Z-Wave Node Management"><div class="card-content">Z-Wave Node controls.</div><div class="device-picker"><paper-dropdown-menu label="Nodes" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedNode}}"><template is="dom-repeat" items="[[nodes]]" as="state"><paper-item>[[computeSelectCaption(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><template is="dom-if" if="[[!computeIsNodeSelected(selectedNode)]]"><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="refresh_node" service-data="[[computeNodeServiceData(selectedNode)]]">Refresh Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="remove_failed_node" service-data="[[computeNodeServiceData(selectedNode)]]">Remove Failed Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="replace_failed_node" service-data="[[computeNodeServiceData(selectedNode)]]">Replace Failed Node</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="zwave" service="print_node" service-data="[[computeNodeServiceData(selectedNode)]]">Print Node</ha-call-service-button></div><div class="card-actions"><paper-input float-label="New node name" type="text" value="{{newNodeNameInput}}" placeholder="[[computeGetNodeName(selectedNode)]]"></paper-input><ha-call-service-button hass="[[hass]]" domain="zwave" service="rename_node" service-data="[[computeNodeNameServiceData(newNodeNameInput)]]">Rename Node</ha-call-service-button></div><div class="device-picker"><paper-dropdown-menu label="Entities of this node" class="flex"><paper-listbox class="dropdown-content" selected="{{selectedEntity}}"><template is="dom-repeat" items="[[entities]]" as="state"><paper-item>[[computeSelectCaptionEnt(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><template is="dom-if" if="[[!computeIsEntitySelected(selectedEntity)]]"><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="zwave" service="refresh_entity" service-data="[[computeRefreshEntityServiceData(selectedEntity)]]">Refresh Entity</ha-call-service-button></div><div class="content"><div class="card-actions"><paper-button toggles="" raised="" noink="" active="{{entityInfoActive}}">Entity Attributes</paper-button></div><template is="dom-if" if="{{entityInfoActive}}"><template is="dom-repeat" items="[[selectedEntityAttrs]]" as="state"><div class="node-info"><span>[[state]]</span></div></template></template></div></template></template></paper-card></div><template is="dom-if" if="[[!computeIsNodeSelected(selectedNode)]]"><zwave-node-information id="zwave-node-information" nodes="[[nodes]]" selected-node="[[selectedNode]]"></zwave-node-information></template><template is="dom-if" if="[[!computeIsNodeSelected(selectedNode)]]"><zwave-groups hass="[[hass]]" nodes="[[nodes]]" selected-node="[[selectedNode]]" groups="[[groups]]"></zwave-groups></template><template is="dom-if" if="[[!computeIsNodeSelected(selectedNode)]]"><zwave-node-config hass="[[hass]]" nodes="[[nodes]]" selected-node="[[selectedNode]]" config="[[config]]"></zwave-node-config></template><template is="dom-if" if="{{hasNodeUserCodes}}"><zwave-usercodes id="zwave-usercodes" hass="[[hass]]" nodes="[[nodes]]" user-codes="[[userCodes]]" selected-node="[[selectedNode]]"></zwave-usercodes></template><div class="content"><ozw-log id="ozw-log" hass="[[hass]]"></ozw-log></div></app-header-layout></template></dom-module><script>Polymer({ + is: 'ha-panel-zwave', + + properties: { + hass: { + type: Object, + }, + + narrow: { + type: Boolean, + }, + + showMenu: { + type: Boolean, + value: false, + }, + + nodes: { + type: Array, + computed: 'computeNodes(hass)' + }, + + selectedNode: { + type: Number, + value: -1, + observer: 'selectedNodeChanged' + }, + + config: { + type: Array, + value: function () { + return []; + } + }, + + entities: { + type: Array, + computed: 'computeEntities(selectedNode)', + }, + + entityInfoActive: { + type: Boolean, + }, + + selectedEntity: { + type: Number, + value: -1, + observers: ['computeIsEntitySelected', + 'computeRefreshEntityServiceData'] + }, + + selectedEntityAttrs: { + type: Array, + computed: 'computeSelectedEntityAttrs(selectedEntity)' + }, + + groups: { + type: Array, + }, + + newNodeNameInput: { + type: String, + }, + + userCodes: { + type: Array, + value: function () { + return []; + }, + }, + + hasNodeUserCodes: { + type: Boolean, + value: false + }, + }, + + computeNodes: function (hass) { + return Object.keys(hass.states) + .map(function (key) { return hass.states[key]; }) + .filter(function (ent) { + return (!ent.attributes.hidden && + (ent.entity_id).match('zwave[.]')); + }) + .sort(function (entityA, entityB) { + if (entityA.entity_id < entityB.entity_id) { + return -1; + } + if (entityA.entity_id > entityB.entity_id) { + return 1; + } + return 0; + }); + }, + + computeEntities: function (selectedNode) { + if (!this.nodes || selectedNode === -1) return -1; + var hass = this.hass; + var nodeid = this.nodes[this.selectedNode].attributes.node_id; + return Object.keys(hass.states) + .map(function (key) { return hass.states[key]; }) + .filter(function (ent) { + if (ent.attributes.node_id === undefined) { + return false; + } + return (!ent.attributes.hidden && + 'node_id' in ent.attributes && + ent.attributes.node_id === nodeid && + (!(ent.entity_id).match('zwave[.]'))); + }) + .sort(function (entityA, entityB) { + if (entityA.entity_id < entityB.entity_id) { + return -1; + } + if (entityA.entity_id > entityB.entity_id) { + return 1; + } + return 0; + }); + }, + + selectedNodeChanged: function (selectedNode) { + if (selectedNode === -1) return; + this.selectedConfigParameter = -1; + this.selectedConfigParameterValue = -1; + this.selectedGroup = -1; + var configData = []; + this.hass.callApi('GET', 'zwave/config/' + this.nodes[selectedNode].attributes.node_id).then(function (configs) { + Object.entries(configs).forEach(([key, value]) => { + configData.push({ key, value }); + }); + this.config = configData; + }.bind(this)); + var groupData = []; + this.hass.callApi('GET', 'zwave/groups/' + this.nodes[selectedNode].attributes.node_id).then(function (groups) { + Object.entries(groups).forEach(([key, value]) => { + groupData.push({ key, value }); + }); + this.groups = groupData; + }.bind(this)); + var userCodes = []; + this.hasNodeUserCodes = false; + this.notifyPath('hasNodeUserCodes'); + this.hass.callApi('GET', 'zwave/usercodes/' + this.nodes[selectedNode].attributes.node_id).then(function (usercodes) { + Object.entries(usercodes).forEach(([key, value]) => { + userCodes.push({ key, value }); + }); + this.userCodes = userCodes; + if (Object.keys(userCodes).length === 0) { + this.hasNodeUserCodes = false; + } else { + this.hasNodeUserCodes = true; + } + this.notifyPath('hasNodeUserCodes'); + }.bind(this)); + }, + + computeSelectedEntityAttrs: function (selectedEntity) { + if (selectedEntity === -1) return 'No entity selected'; + var entityAttrs = this.entities[selectedEntity].attributes; + var att = []; + Object.entries(entityAttrs).forEach(([key, value]) => { + att.push(key + ': ' + value); + }); + return att.sort(); + }, + + computeSelectCaption: function (stateObj) { + return window.hassUtil.computeStateName(stateObj) + ' (Node:' + + stateObj.attributes.node_id + ' ' + + stateObj.attributes.query_stage + ')'; + }, + + computeSelectCaptionEnt: function (stateObj) { + return (window.hassUtil.computeDomain(stateObj) + '.' + + window.hassUtil.computeStateName(stateObj)); + }, + + computeIsNodeSelected: function () { + return (!this.nodes || this.selectedNode === -1); + }, + + computeIsEntitySelected: function (selectedEntity) { + return (selectedEntity === -1); + }, + + computeNodeServiceData: function (selectedNode) { + return { node_id: this.nodes[selectedNode].attributes.node_id }; + }, + + computeGetNodeName: function (selectedNode) { + if (this.selectedNode === -1 || + !this.nodes[selectedNode].entity_id) return -1; + var str = (this.nodes[selectedNode].entity_id); + var name = str.replace('zwave.', ''); + return name; + }, + + computeNodeNameServiceData: function (newNodeNameInput) { + return { node_id: this.nodes[this.selectedNode].attributes.node_id, + name: newNodeNameInput }; + }, + + computeRefreshEntityServiceData: function (selectedEntity) { + if (selectedEntity === -1) return -1; + return { entity_id: this.entities[selectedEntity].entity_id }; + }, +});</script></body></html> \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz index fec3a4f832bf9f5816f13564203a6ced55ac4e5e..86b8d15fd5d715f1bab8e0b4dcf6fcfed41408f4 100644 GIT binary patch literal 12987 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 literal 6135 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 J;dTdI001U%0Sy2E