zwave-js-ui
Version:
Z-Wave Control Panel and MQTT Gateway
5 lines (4 loc) • 17 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AssociationGroups-BEqmDO51.js","./index-DwzE-W2i.js","./index-B2zoqM3Y.css","./VDataTable-D8DZXD9Y.js","./sort-C8HQTCiq.js","./VTable-Cxuwit5L.js","./VTable-BsI6FsWH.css","./VDataTable-CLcLRj9B.css","./HomeAssistant-CLibPVY8.js","./VTextarea-DtC2nuOc.js","./VTextarea-DyGjqrlm.css","./NodeDetails-BJGpO3e7.js","./VNumberInput-CPMgIbm4.js","./VNumberInput-C8IBMqyK.css","./VExpansionPanels-DapzAmhb.js","./VExpansionPanels-Dyw0hWW-.css","./NodeDetails-BVv96O7e.css","./DialogAdvanced-BzlXZa0Z.js","./DialogAdvanced-D5h3KQey.css","./StatisticsCard-DHyEKBDD.js","./UserCodeTable-DFm1aAhN.js"])))=>i.map(i=>d[i]);
import{_ as K,m as Z,a as G,d as h,I as Q,s as y,c as m,h as d,z as i,b as n,e as l,H as c,w as r,f as A,q as S,t as w,l as X,k as _,am as T,n as U,g as Y,i as k,o as $,V as D,P as x,an as V,O as ee,r as te,E as oe,aX as p,aY as se,aZ as f,u as I,D as ne,a$ as ae,W as ie,a9 as re,aN as le,j as de,x as C,az as L,y as v,aa as ue}from"./index-DwzE-W2i.js";import{V as ce}from"./VTextarea-DtC2nuOc.js";var b;(function(e){e[e.NoDeviceSupport=0]="NoDeviceSupport",e[e.Working=1]="Working",e[e.Fail=2]="Fail",e[e.EndpointNotFound=3]="EndpointNotFound",e[e.NotImplemented=4]="NotImplemented",e[e.InvalidValue=5]="InvalidValue",e[e.SuccessUnsupervised=254]="SuccessUnsupervised",e[e.Success=255]="Success"})(b||(b={}));function me(e){return e.status===b.Success||e.status===b.Working}function pe(e){return e.status===b.SuccessUnsupervised||me(e)}const N={props:{actions:Array,headers:{type:Array,default:()=>[]},node:Object,socket:Object},mixins:[Q],components:{AssociationGroups:h(()=>v(()=>import("./AssociationGroups-BEqmDO51.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url)),HomeAssistant:h(()=>v(()=>import("./HomeAssistant-CLibPVY8.js"),__vite__mapDeps([8,1,2,3,4,5,6,7,9,10]),import.meta.url)),NodeDetails:h(()=>v(()=>import("./NodeDetails-BJGpO3e7.js"),__vite__mapDeps([11,1,2,12,13,14,15,16]),import.meta.url)),DialogAdvanced:h(()=>v(()=>import("./DialogAdvanced-BzlXZa0Z.js"),__vite__mapDeps([17,1,2,18]),import.meta.url)),StatisticsCard:h(()=>v(()=>import("./StatisticsCard-DHyEKBDD.js"),__vite__mapDeps([19,1,2]),import.meta.url)),OTAUpdates:h(()=>v(()=>import("./index-DwzE-W2i.js").then(e=>e.eb),__vite__mapDeps([1,2]),import.meta.url)),OTWUpdates:h(()=>v(()=>import("./index-DwzE-W2i.js").then(e=>e.ec),__vite__mapDeps([1,2]),import.meta.url)),UserCodeTable:h(()=>v(()=>import("./UserCodeTable-DFm1aAhN.js"),__vite__mapDeps([20,1,2,3,4,5,6,7]),import.meta.url))},computed:{...G(C,["gateway","mqtt"]),isMobile(){return this.$vuetify.display.xs},isLongRange(){return this.node?this.node.protocol===L.ZWaveLongRange:!1},nodeMetadata(){return this.node.deviceConfig?.metadata},nodeComments(){const e=this.nodeMetadata?.comments??[];return Array.isArray(e)?e:[e]},metaKeys(){const e=["manual","inclusion","exclusion","reset","wakeup"];return(this.nodeMetadata?Object.keys(this.nodeMetadata):[]).filter(o=>e.includes(o))},nodeJson(){return JSON.stringify(this.node,null,2)},showHass(){return!this.mqtt.disabled&&this.gateway.hassDiscovery&&this.node.hassDevices&&Object.keys(this.node.hassDevices).length>0},statisticsOpeningIndicator(){return this.showStatistics?"arrow_drop_up":"arrow_drop_down"},statsBorderColor(){return this.showStatistics?"border-primary":""},filteredNodeEvents(){return this.node.eventsQueue.filter(e=>!this.searchEvents||JSON.stringify(e).toLowerCase().includes(this.searchEvents.toLowerCase())).sort((e,t)=>(e=new Date(e.time),t=new Date(t.time),this.inverseSort?t-e:e-t))},advancedActions(){const e=this.node.isControllerNode?[]:[{text:"Firmware update",options:[{name:"Begin",action:"updateFirmware"},{name:"Abort",action:"abortFirmwareUpdate"}],icon:"update",color:"error",desc:"Start/Stop a firmware update"},{text:"Refresh Values",options:[{name:"Refresh",action:"refreshValues",args:{confirm:"Are you sure you want to refresh values of this node? This action increases network traffic"}}],icon:"cached",desc:"Update all CC values and metadata. Use only when many values seems stale"},{text:"Re-interview Node",options:[{name:"Interview",action:"refreshInfo"}],icon:"history",desc:"Clear all info about this node and make a new full interview. Use when the node has wrong or missing capabilities"},{text:"Failed Nodes",options:[{name:"Remove",action:"removeFailedNode"},{name:"Replace",action:"replaceFailedNode"}],color:"error",icon:"dangerous",desc:"Manage nodes that are dead and/or marked as failed with the controller"}];this.node.protocol!==L.ZWaveLongRange&&e.splice(1,0,{text:"Rebuild Routes",options:[{name:"Rebuild",action:"rebuildNodeRoutes",args:{confirm:"Rebuilding node routes causes a lot of traffic, can take minutes up to hours and you can expect degraded performance while it is going on"}}],icon:"healing",color:"warning",desc:"Discover and assign new routes from node to the controller and other nodes."});const t=this.node.isControllerNode?[]:[{name:"Clear",action:"removeAllAssociations",color:"error",args:{confirm:"This action will remove all associations of this node. This will also clear lifeline association with controller node, the node won't report state changes until that is set up again"}}],o=[];return this.node.supportsTime&&o.push({text:"Set Date and Time",options:[{name:"Sync",action:"syncNodeDateAndTime"}],icon:"schedule",desc:"Set date and time of this node to current time"}),[{text:"Export json",options:[{name:"UI",action:"exportNode"},{name:"Driver",action:"dumpNode"}],icon:"get_app",desc:"Export this node in a json file"},{text:"Clear Retained",options:[{name:"Clear",action:"removeNodeRetained",args:{mqtt:!0,confirm:"Are you sure you want to remove all retained messages?"}}],icon:"clear",desc:"All retained messages of this node will be removed from broker"},{text:"Update topics",options:[{name:"Update",action:"updateNodeTopics",args:{mqtt:!0,confirm:"Are you sure you want to update all topics?"}}],icon:"update",desc:"Update all node topics. Useful when name/location has changed"},...e,{text:"Associations",options:[...t,{name:"Remove",action:"removeNodeFromAllAssociations",args:{confirm:"All direct associations to this node will be removed. Battery-powered nodes need to be woken up to edit their associations."}}],icon:"link_off",color:"error",desc:"Clear all node associations / Remove node from all associations"},...o]}},watch:{"node.eventsQueue":{handler(){this.scrollBottom()},deep:1},inverseSort(){this.savePreferences()},autoScroll(){this.savePreferences()}},data(){return{currentTab:0,autoScroll:!0,inverseSort:!0,searchEvents:"",advancedShowDialog:!1,showStatistics:!1}},mounted(){const e=C().getPreference("eventsList",{inverseSort:!0,autoScroll:!0});this.inverseSort=e.inverseSort,this.autoScroll=e.autoScroll},methods:{...Z(C,["setValue","getDateTimeString"]),savePreferences(){C().savePreferences({eventsList:{inverseSort:this.inverseSort,autoScroll:this.autoScroll}})},async updateValue(e,t){if(e){if(e.toUpdate=!0,e.type==="number"&&(e.newValue=Number(e.newValue)),e.type==="boolean"&&!e.readable&&(e.newValue=!0),t!==void 0&&(e.newValue=t),e.destructive&&!await this.app.confirm("Warning","This is a destructive operation. The device may require manual intervention to recover. Are you sure you want to proceed?","alert")){e.toUpdate=!1;return}this.setValue(e);const o=await this.app.apiRequest("writeValue",[{nodeId:e.nodeId,commandClass:e.commandClass,endpoint:e.endpoint,property:e.property,propertyKey:e.propertyKey},e.newValue,this.options]);if(e.toUpdate=!1,o.success){const g=o.result;if(pe(g))this.showSnackbar("Value updated","success");else{let s=g.message;!s&&g.status===b.NoDeviceSupport&&(s="No device support"),this.showSnackbar("Value update failed"+(s?": "+s:""),"error")}}else this.showSnackbar(`Error updating value${o.message?": "+o.message:""}`,"error")}},prettyPrintEventArg(e,t){return`
Arg ${t}:
`+de(e,void 0,1)},linkify(e){var t=/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi;return e.replace(t,function(o){return'<a target="_blank" href="'+o+'">'+o+"</a>"})},copyText(){this.$refs.nodeJsonContent.$el.querySelector("textarea").select(),document.execCommand("copy")},nodeAction(e,t={}){e==="exportNode"?this.exportNode():e==="applyTemplate"?this.applyTemplate():t.mqtt?this.sendMqttAction(e,t.confirm):this.sendAction(e,{...t,nodeId:this.node.id})},exportNode(){this.app.exportConfiguration(this.node,"node_"+this.node.id,"json")},async sendMqttAction(e,t){if(this.node){let o=!0;if(t&&(o=await this.app.confirm("Info",t,"info",{confirmText:"Ok"})),o){const g=[this.node.id],u={api:e,args:g};this.socket.emit(le.mqtt,u,s=>{s.success?this.showSnackbar(`Node ${this.node.id}: ${e} successfully sent `,"success"):this.showSnackbar(`Error sending ${e} to node ${this.node.id}: ${s.message}`,"error")})}}},toggleStatistics(){this.showStatistics=!this.showStatistics},openLink(e){window.open(e,"_blank")},toggleAutoScroll(){this.autoScroll=!this.autoScroll},toggleSort(){this.inverseSort=!this.inverseSort},onEventsListInited(e){e?(this.eventsListEl=e.$el,this.scrollBottom()):this.eventsListEl=null},async scrollBottom(){if(!this.autoScroll||this.inverseSort)return;const e=this.eventsListEl;e&&(await re(),e.scrollTop=e.scrollHeight)}}},O=()=>{ue(e=>({afba6ece:e.$vuetify.theme.current.colors.secondary}))},R=N.setup;N.setup=R?(e,t)=>(O(),R(e,t)):O;const fe={class:"subtitle font-weight-bold font-monospace"},he={key:0,class:"comment font-weight-bold text-primary"},ye=["innerHTML"],ve={class:"text-uppercase"},ge={class:"text-caption"},we={key:1},_e={class:"text-uppercase"};function ke(e,t,o,g,u,s){const j=y("statistics-card"),P=y("node-details"),M=y("home-assistant"),W=y("association-groups"),F=y("user-code-table"),B=y("OTAUpdates"),q=y("OTWUpdates"),H=y("DialogAdvanced");return o.node?(i(),m("div",{key:0,style:ie(`max-width: calc(100vw - ${e.$vuetify.display.lgAndUp?120:70}px)`),class:"mx-2"},[n(D,{class:"mt-2",align:"center"},{default:r(()=>[n(A,{style:{"min-width":"200px"},class:"ml-4"},{default:r(()=>[t[12]||(t[12]=c("span",{class:"text-h6 text-grey"},"Device ",-1)),t[13]||(t[13]=c("br",null,null,-1)),c("span",fe,w(o.node.hexId),1),S((i(),l(X,{onClick:t[0]||(t[0]=a=>s.openLink(o.node.dbLink)),class:"ml-2"},{default:r(()=>[...t[11]||(t[11]=[_(" open_in_new ",-1)])]),_:1})),[[T,"See device config","bottom"]]),t[14]||(t[14]=c("br",null,null,-1)),e.$vuetify.display.smAndDown?(i(),m("span",he,w(`${o.node.manufacturer||""}${o.node.productDescription?" - "+o.node.productDescription:""}`),1)):d("",!0)]),_:1}),n(A,{class:U(e.$vuetify.display.smAndDown?"text-center":"text-end")},{default:r(()=>[n(Y,{class:"ml-2",multiple:""},{default:r(()=>[n(k,{color:"primary",variant:"outlined",onClick:s.toggleStatistics,"prepend-icon":s.statisticsOpeningIndicator,"append-icon":"multiline_chart"},{default:r(()=>[...t[15]||(t[15]=[_(" Statistics ",-1)])]),_:1},8,["onClick","prepend-icon"]),o.node.isControllerNode?d("",!0):(i(),l(k,{key:0,color:"primary",onClick:t[1]||(t[1]=$(a=>e.pingNode(o.node),["stop"])),variant:"flat"},{default:r(()=>[...t[16]||(t[16]=[_(" Ping ",-1)])]),_:1})),n(k,{color:"success",variant:"flat",onClick:t[2]||(t[2]=a=>u.advancedShowDialog=!0)},{default:r(()=>[...t[17]||(t[17]=[_(" Advanced ",-1)])]),_:1})]),_:1})]),_:1},8,["class"])]),_:1}),s.nodeComments.length>0?(i(),l(D,{key:0},{default:r(()=>[n(A,null,{default:r(()=>[(i(!0),m(x,null,V(s.nodeComments,a=>(i(),l(ee,{key:a.level,text:"",style:{"white-space":"break-spaces"},type:a.level},{default:r(()=>[c("span",{innerHTML:s.linkify(a.text)},null,8,ye)]),_:2},1032,["type"]))),128))]),_:1})]),_:1})):d("",!0),n(D,{"no-gutters":""},{default:r(()=>[u.showStatistics?(i(),l(te,{key:0,class:"my-4",border:"",rounded:""},{default:r(()=>[n(j,{title:"Statistics",node:o.node},null,8,["node"])]),_:1})):d("",!0)]),_:1}),n(oe,{class:"my-4"}),c("div",{class:U(["d-flex",e.$vuetify.display.mdAndUp?"flex-row":"flex-column"])},[n(se,{modelValue:u.currentTab,"onUpdate:modelValue":t[3]||(t[3]=a=>u.currentTab=a),"show-arrows":"",class:"bg-transparent mb-4",direction:e.$vuetify.display.mdAndUp?"vertical":"horizontal"},{default:r(()=>[n(p,{"prepend-icon":"widgets",value:"node",class:"justify-start",text:"Node"}),s.nodeMetadata?(i(),l(p,{key:0,"prepend-icon":"help",value:"manual",class:"justify-start",text:"Help",W:""})):d("",!0),s.showHass?(i(),l(p,{key:1,"prepend-icon":"home",value:"homeassistant",class:"justify-start",text:"Home Assistant"})):d("",!0),n(p,{"prepend-icon":"device_hub",value:"groups",class:"justify-start",text:"Groups"}),o.node.schedule?(i(),l(p,{key:2,"prepend-icon":"group",value:"users",class:"justify-start",text:"Users"})):d("",!0),o.node.isControllerNode?d("",!0):(i(),l(p,{key:3,value:"ota","prepend-icon":"auto_mode",class:"justify-start",text:"OTA Updates"})),o.node.isControllerNode?(i(),l(p,{key:4,value:"otw","prepend-icon":"auto_mode",class:"justify-start",text:"Firmware Updates"})):d("",!0),n(p,{"prepend-icon":"list_alt",value:"events",class:"justify-start",text:"Events"}),e.$vuetify.display.mdAndUp?(i(),l(p,{key:5,"prepend-icon":"bug_report",class:"justify-start",value:"debug",text:"Debug Info"})):d("",!0)]),_:1},8,["modelValue","direction"]),n(ae,{style:{background:"transparent","padding-bottom":"10px"},touchless:"",class:"fill",modelValue:u.currentTab,"onUpdate:modelValue":t[8]||(t[8]=a=>u.currentTab=a)},{default:r(()=>[n(f,{value:"node",transition:"slide-y-transition"},{default:r(()=>[n(P,{ref:"nodeDetails",headers:o.headers,node:o.node,onUpdateValue:s.updateValue},null,8,["headers","node","onUpdateValue"])]),_:1}),s.nodeMetadata?(i(),l(f,{key:0,value:"manual",transition:"slide-y-transition"},{default:r(()=>[(i(!0),m(x,null,V(s.metaKeys,a=>(i(),m("section",{key:`tab-${a}`,class:"px-8 py-4"},[c("h1",ve,w(a),1),c("p",ge,[a==="manual"?(i(),l(k,{key:0,class:"ma-2",href:s.nodeMetadata[a],variant:"flat",color:"primary"},{default:r(()=>[...t[18]||(t[18]=[_(" DOWNLOAD ",-1)])]),_:1},8,["href"])):(i(),m("span",we,w(s.nodeMetadata[a]),1))])]))),128))]),_:1})):d("",!0),s.showHass?(i(),l(f,{key:1,value:"homeassistant",transition:"slide-y-transition"},{default:r(()=>[n(M,{node:o.node,socket:o.socket},null,8,["node","socket"])]),_:1})):d("",!0),n(f,{value:"groups",transition:"slide-y-transition"},{default:r(()=>[n(W,{node:o.node},null,8,["node"])]),_:1}),o.node.schedule?(i(),l(f,{key:2,value:"users",transition:"slide-y-transition"},{default:r(()=>[n(F,{node:o.node,onUpdateValue:s.updateValue},null,8,["node","onUpdateValue"])]),_:1})):d("",!0),o.node.isControllerNode?d("",!0):(i(),l(f,{key:3,value:"ota",transition:"slide-y-transition"},{default:r(()=>[n(B,{node:o.node,socket:o.socket},null,8,["node","socket"])]),_:1})),o.node.isControllerNode?(i(),l(f,{key:4,value:"otw",transition:"slide-y-transition"},{default:r(()=>[n(q,{node:o.node,socket:o.socket},null,8,["node","socket"])]),_:1})):d("",!0),n(f,{value:"events",transition:"slide-y-transition"},{default:r(()=>[n(I,{"grid-list-md":""},{default:r(()=>[n(ne,{modelValue:u.searchEvents,"onUpdate:modelValue":t[6]||(t[6]=a=>u.searchEvents=a),variant:"outlined",density:"compact","prepend-icon":"search",label:"Search",class:"pa-3","single-line":"","hide-details":"",style:{"max-width":"400px"},clearable:""},{append:r(()=>[u.inverseSort?d("",!0):S((i(),l(k,{key:0,variant:u.autoScroll?"flat":"outlined",size:"small",onClick:t[4]||(t[4]=a=>s.toggleAutoScroll()),icon:"autorenew",color:"primary"},null,8,["variant"])),[[T,"Enable/Disable auto scroll","bottom"]]),S(n(k,{onClick:t[5]||(t[5]=a=>s.toggleSort()),icon:"swap_vert",class:"ml-2",variant:u.inverseSort?"flat":"outlined",size:"small",color:"primary"},null,8,["variant"]),[[T,"Inverse Sort","bottom"]])]),_:1},8,["modelValue"]),n(A,{ref:s.onEventsListInited,class:"pa-5 events-list"},{default:r(()=>[(i(!0),m(x,null,V(s.filteredNodeEvents,(a,z)=>(i(),m("div",{key:"event_"+z+a.time,class:"log-row font-monospace"},[c("span",null,[c("i",null,w(e.getDateTimeString(a.time)),1)]),t[19]||(t[19]=_(" - ",-1)),c("strong",_e,w(a.event),1),(i(!0),m(x,null,V(a.args,(J,E)=>(i(),m("span",{style:{"white-space":"pre","font-size":"0.75rem"},key:"arg_"+E},w(s.prettyPrintEventArg(J,E)),1))),128))]))),128))]),_:1},512)]),_:1})]),_:1}),e.$vuetify.display.mdAndUp?(i(),l(f,{key:5,value:"debug",transition:"slide-y-transition"},{default:r(()=>[n(I,{"grid-list-md":""},{default:r(()=>[n(ce,{class:"debug-content font-monospace mx-2","append-icon":"content_copy",modelValue:s.nodeJson,"onUpdate:modelValue":t[7]||(t[7]=a=>s.nodeJson=a),readonly:"","hide-details":"","no-resize":"",rows:"37",ref:"nodeJsonContent","onClick:append":s.copyText},null,8,["modelValue","onClick:append"])]),_:1})]),_:1})):d("",!0)]),_:1},8,["modelValue"])],2),n(H,{modelValue:u.advancedShowDialog,"onUpdate:modelValue":t[9]||(t[9]=a=>u.advancedShowDialog=a),onClose:t[10]||(t[10]=a=>u.advancedShowDialog=!1),actions:s.advancedActions,onAction:s.nodeAction},null,8,["modelValue","actions","onAction"])],4)):d("",!0)}const xe=K(N,[["render",ke]]);export{xe as default};