zwave-js-ui
Version:
Z-Wave Control Panel and MQTT Gateway
5 lines (4 loc) • 16.8 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AssociationGroups-ISFJ7SvH.js","./index-B9yS4Bcc.js","./index-Bm7DxUwf.css","./VDataTable-CKSj76XP.js","./sort-CSOGXH9I.js","./VTable-BXtGlLLl.js","./VTable-CQyv0wyO.css","./VDataTable-DNwLG7iF.css","./HomeAssistant-0lC97P_d.js","./VTextarea-BABdvF5b.js","./VTextarea-BTR7f0gW.css","./NodeDetails-CEaFqDkk.js","./VExpansionPanels-BZZ3W0eQ.js","./VExpansionPanels-RsCANmDP.css","./NodeDetails-BVv96O7e.css","./DialogAdvanced-B9I1E5QR.js","./DialogAdvanced-BEfdsoBJ.css","./StatisticsCard-yimBnRML.js","./OTAUpdates-Cr80P6B4.js","./OTWUpdates-DK8pfBJO.js","./UserCodeTable-DKYr0clb.js"])))=>i.map(i=>d[i]);
import{_ as K,I as Z,d as h,z as v,m as G,u as A,av as U,a as Q,j as X,aQ as Y,a8 as $,r as y,o as i,c as m,b as n,w as r,f as x,U as c,t as g,v as C,l,i as ee,k as w,ao as T,q as d,n as I,g as te,h as k,p as oe,e as D,an as V,am as S,X as se,y as ne,M as ae,aW as p,aX as ie,aY as f,V as L,W as re,a_ as le,a1 as de,a9 as ue}from"./index-B9yS4Bcc.js";import{V as ce}from"./VTextarea-BABdvF5b.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:[Z],components:{AssociationGroups:h(()=>v(()=>import("./AssociationGroups-ISFJ7SvH.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url)),HomeAssistant:h(()=>v(()=>import("./HomeAssistant-0lC97P_d.js"),__vite__mapDeps([8,1,2,3,4,5,6,7,9,10]),import.meta.url)),NodeDetails:h(()=>v(()=>import("./NodeDetails-CEaFqDkk.js"),__vite__mapDeps([11,1,2,12,13,14]),import.meta.url)),DialogAdvanced:h(()=>v(()=>import("./DialogAdvanced-B9I1E5QR.js"),__vite__mapDeps([15,1,2,16]),import.meta.url)),StatisticsCard:h(()=>v(()=>import("./StatisticsCard-yimBnRML.js"),__vite__mapDeps([17,1,2]),import.meta.url)),OTAUpdates:h(()=>v(()=>import("./OTAUpdates-Cr80P6B4.js"),__vite__mapDeps([18,1,2]),import.meta.url)),OTWUpdates:h(()=>v(()=>import("./OTWUpdates-DK8pfBJO.js"),__vite__mapDeps([19,1,2]),import.meta.url)),UserCodeTable:h(()=>v(()=>import("./UserCodeTable-DKYr0clb.js"),__vite__mapDeps([20,1,2,3,4,5,6,7]),import.meta.url))},computed:{...G(A,["gateway","mqtt"]),isMobile(){return this.$vuetify.display.xs},isLongRange(){return this.node?this.node.protocol===U.ZWaveLongRange:!1},nodeMetadata(){var e;return(e=this.node.deviceConfig)==null?void 0:e.metadata},nodeComments(){var t;const e=((t=this.nodeMetadata)==null?void 0:t.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!==U.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=A().getPreference("eventsList",{inverseSort:!0,autoScroll:!0});this.inverseSort=e.inverseSort,this.autoScroll=e.autoScroll},methods:{...Q(A,["showSnackbar","setValue","getDateTimeString"]),savePreferences(){A().savePreferences({eventsList:{inverseSort:this.inverseSort,autoScroll:this.autoScroll}})},async updateValue(e,t){if(e){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),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 _=o.result;if(pe(_))this.showSnackbar("Value updated","success");else{let s=_.message;!s&&_.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}:
`+X(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():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 _=[this.node.id],u={api:e,args:_};this.socket.emit(Y.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 $(),e.scrollTop=e.scrollHeight)}}},R=()=>{ue(e=>({"28355f2c":e.$vuetify.theme.current.colors.secondary}))},O=N.setup;N.setup=O?(e,t)=>(R(),O(e,t)):R;const fe={class:"subtitle font-weight-bold font-monospace"},he={key:0,class:"comment font-weight-bold text-primary"},ve=["innerHTML"],ye={class:"text-uppercase"},ge={class:"text-caption"},_e={key:1},we={class:"text-uppercase"};function ke(e,t,o,_,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:de(`max-width: calc(100vw - ${e.$vuetify.display.lgAndUp?120:70}px)`),class:"mx-2"},[n(D,{class:"mt-2",align:"center"},{default:r(()=>[n(x,{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,g(o.node.hexId),1),C((i(),l(ee,{onClick:t[0]||(t[0]=a=>s.openLink(o.node.dbLink)),class:"ml-2"},{default:r(()=>t[11]||(t[11]=[w(" open_in_new ")])),_:1,__:[11]})),[[T,"See device config","bottom"]]),t[14]||(t[14]=c("br",null,null,-1)),e.$vuetify.display.smAndDown?(i(),m("span",he,g(`${o.node.manufacturer||""}${o.node.productDescription?" - "+o.node.productDescription:""}`),1)):d("",!0)]),_:1,__:[12,13,14]}),n(x,{class:I(e.$vuetify.display.smAndDown?"text-center":"text-end")},{default:r(()=>[n(te,{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]=[w(" Statistics ")])),_:1,__:[15]},8,["onClick","prepend-icon"]),o.node.isControllerNode?d("",!0):(i(),l(k,{key:0,color:"primary",onClick:t[1]||(t[1]=oe(a=>e.pingNode(o.node),["stop"])),variant:"flat"},{default:r(()=>t[16]||(t[16]=[w(" Ping ")])),_:1,__:[16]})),n(k,{color:"success",variant:"flat",onClick:t[2]||(t[2]=a=>u.advancedShowDialog=!0)},{default:r(()=>t[17]||(t[17]=[w(" Advanced ")])),_:1,__:[17]})]),_:1})]),_:1},8,["class"])]),_:1}),s.nodeComments.length>0?(i(),l(D,{key:0},{default:r(()=>[n(x,null,{default:r(()=>[(i(!0),m(V,null,S(s.nodeComments,a=>(i(),l(se,{key:a.level,text:"",style:{"white-space":"break-spaces"},type:a.level},{default:r(()=>[c("span",{innerHTML:s.linkify(a.text)},null,8,ve)]),_:2},1032,["type"]))),128))]),_:1})]),_:1})):d("",!0),n(D,{"no-gutters":""},{default:r(()=>[u.showStatistics?(i(),l(ne,{key:0,class:"my-4",border:"",rounded:""},{default:r(()=>[n(j,{title:"Statistics",node:o.node},null,8,["node"])]),_:1})):d("",!0)]),_:1}),n(ae,{class:"my-4"}),c("div",{class:I(["d-flex",e.$vuetify.display.mdAndUp?"flex-row":"flex-column"])},[n(ie,{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(le,{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(V,null,S(s.metaKeys,a=>(i(),m("section",{key:`tab-${a}`,class:"px-8 py-4"},[c("h1",ye,g(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]=[w(" DOWNLOAD ")])),_:2,__:[18]},1032,["href"])):(i(),m("span",_e,g(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(L,{"grid-list-md":""},{default:r(()=>[n(re,{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):C((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"]]),C(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(x,{ref:s.onEventsListInited,class:"pa-5 events-list"},{default:r(()=>[(i(!0),m(V,null,S(s.filteredNodeEvents,(a,z)=>(i(),m("div",{key:"event_"+z+a.time,class:"log-row font-monospace"},[c("span",null,[c("i",null,g(e.getDateTimeString(a.time)),1)]),t[19]||(t[19]=w(" - ")),c("strong",we,g(a.event),1),(i(!0),m(V,null,S(a.args,(J,E)=>(i(),m("span",{style:{"white-space":"pre","font-size":"0.75rem"},key:"arg_"+E},g(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(L,{"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};