zigbee2mqtt-windfront
Version:
[](https://npmjs.org/package/zigbee2mqtt-windfront) [](https://github.com/Nerivec/zigbee2mqtt-windf
21 lines (16 loc) • 8.68 kB
JavaScript
import{r as o,j as e,a3 as J,aA as V,b as T,C as E,F as K,G as H,aw as X,a as k,k as A,c as D,T as Y,L as U,aB as Z,aC as M}from"./index-Cg_dwqpD.js";import{T as F}from"./TextareaField-LpcEEomy.js";import{J as I}from"./Json-BZbhIKAk.js";import{I as O}from"./InputField-D9KJc30P.js";import{C as B,A as Q}from"./ClusterSinglePicker-TClcBWb_.js";import{E as ee}from"./EndpointPicker-Dnt0o2EO.js";import"./envs-CSqIi4cL.js";import"./SelectField-dfeWrxvV.js";const G=o.memo(({message:r})=>e.jsx("div",{className:"mockup-code w-full",children:e.jsx("pre",{"data-prefix":"~",className:J[r.level],children:e.jsxs("code",{children:["[",r.timestamp,"] ",r.message]})})})),te=[65,66,67,68];function se({value:r,onChange:s,attribute:i,definition:c,...m}){const d=te.includes(c.type)?"text":"number";return e.jsx("input",{type:d,value:r,onChange:u=>{const f=d==="number"?u.target.valueAsNumber:u.target.value;s(i,Number.isNaN(f)?void 0:f)},...m})}const ne=o.memo(({sourceIdx:r,device:s,readDeviceAttributes:i,writeDeviceAttributes:c,lastLog:m})=>{const[d,u]=o.useState(V(s.endpoints)??""),[f,g]=o.useState(""),[l,b]=o.useState([]),[y,C]=o.useState(""),{t:x}=T(["common","zigbee","devConsole"]),v=o.useCallback(n=>{g(""),b([]),u(n.toString())},[]),a=o.useCallback(n=>{b([]),g(n)},[]),t=o.useCallback((n,S)=>{if(!l.find(N=>N.attribute===n)){const N=l.concat([{attribute:n,definition:S}]);b(N)}},[l]),h=o.useCallback(n=>{C(n.target.value)},[]),w=o.useCallback(async()=>{await i(s.ieee_address,d,f,l.map(n=>n.attribute),y)},[s.ieee_address,d,f,l,y,i]),_=o.useCallback(async()=>{await c(s.ieee_address,d,f,l)},[s.ieee_address,d,f,l,c]),j=o.useMemo(()=>l.length>0&&e.jsx("fieldset",{className:"fieldset gap-2 p-3 rounded-box shadow-md",children:l.map(({attribute:n,value:S="",definition:N})=>e.jsxs("div",{className:"join join-horizontal min-w-xs",children:[e.jsxs("label",{className:"input join-item",children:[n,e.jsx(se,{value:S,attribute:n,definition:N,onChange:(P,R)=>{const L=Array.from(l),q=L.find(W=>W.attribute===P);q&&(q.value=R),b(L)}})]}),e.jsx(E,{className:"btn btn-error btn-outline join-item",item:n,onClick:P=>{const R=l.filter(L=>L.attribute!==P);b(R)},children:e.jsx(K,{icon:H})})]},n))}),[l]),z=o.useMemo(()=>{const n=new Set;if(d){const S=s.endpoints[Number.parseInt(d,10)];if(S)for(const N of S.clusters.input)n.add(N)}return n},[s,d]),$=l.length===0||f==="",p=o.useMemo(()=>X(s),[s]);return d?e.jsxs("div",{className:"flex-1 flex flex-col gap-3 w-full",children:[e.jsx("h2",{className:"text-lg",children:x(n=>n.read_write_attributes,{ns:"zigbee"})}),e.jsxs("div",{className:"flex flex-row flex-wrap gap-2",children:[e.jsx(ee,{label:x(n=>n.endpoint,{ns:"zigbee"}),values:p,value:d,onChange:v,required:!0}),e.jsx(B,{label:x(n=>n.cluster),clusters:z,value:f,onChange:a,required:!0}),e.jsx(Q,{sourceIdx:r,label:x(n=>n.attribute),value:"",cluster:f,device:s,onChange:t}),e.jsx(O,{type:"text",name:"state_property",label:x(n=>n.state_property,{ns:"devConsole"}),value:y,detail:`${x(n=>n.optional)}. ${x(n=>n.state_property_info,{ns:"devConsole"})}`,onChange:h})]}),j,e.jsxs("div",{className:"join join-horizontal",children:[e.jsx(E,{disabled:$||l.some(n=>!!n.value),className:"btn btn-success join-item",onClick:w,children:x(n=>n.read)}),e.jsx(E,{disabled:$,className:"btn btn-error join-item",onClick:_,children:x(n=>n.write)})]}),m&&e.jsx(G,{message:m})]}):e.jsx("span",{children:"No endpoints"})}),ae=o.memo(({sourceIdx:r,device:s,lastLog:i})=>{const{t:c}=T(["common","zigbee"]),[m,d]=o.useState(1),[u,f]=o.useState(""),[g,l]=o.useState(""),[b,y]=o.useState("{}"),C=k(A(t=>t.bridgeDefinitions[r])),x=o.useMemo(()=>{if(!u||!g)return!1;try{const t=JSON.parse(b);if(typeof t!="object"||Array.isArray(t)&&t.length>0&&typeof t[0]!="object")return!1}catch{return!1}return!0},[b,u,g]),v=o.useMemo(()=>{const t=s.endpoints[m],h=new Set,w=new Set,_=new Set,j=new Set,z=new Set;if(t){for(const p of t.clusters.input)h.add(p),w.add(p);for(const p of t.clusters.output)h.add(p),_.add(p)}if(C.custom_clusters[s.friendly_name])for(const p in C.custom_clusters[s.friendly_name])h.has(p)||(h.add(p),j.add(p));for(const p in C.clusters)h.has(p)||z.add(p);return[{name:"input_clusters",clusters:w},{name:"output_clusters",clusters:_},{name:"custom_clusters",clusters:j},{name:"other_zcl_clusters",clusters:z}]},[s.friendly_name,s.endpoints,m,C]),a=o.useCallback(async()=>{let t=Number.parseInt(g,10);Number.isNaN(t)&&(t=g),await D(r,`${s.ieee_address}/${m}/set`,{command:{cluster:u,command:t,payload:JSON.parse(b)}})},[r,u,s.ieee_address,g,b,m]);return e.jsxs("div",{className:"flex-1 flex flex-col gap-3 w-full",children:[e.jsx("h2",{className:"text-lg",children:c(t=>t.execute_command)}),e.jsxs("div",{className:"flex flex-row flex-wrap gap-2",children:[e.jsx(O,{type:"number",name:"endpoint",label:c(t=>t.endpoint,{ns:"zigbee"}),min:1,max:255,value:m,onChange:t=>!!t.target.value&&d(t.target.valueAsNumber),required:!0}),e.jsx(B,{label:c(t=>t.cluster,{ns:"zigbee"}),clusters:v,value:u,onChange:t=>{f(t)},required:!0}),e.jsx(O,{type:"text",name:"command",label:c(t=>t.command),value:g,placeholder:"state, color...",onChange:t=>l(t.target.value),pattern:"^\\d+|^\\w+",required:!0})]}),e.jsx(F,{name:"payload",label:c(t=>t.payload),rows:3,value:b,onChange:t=>y(t.target.value),className:"textarea validator w-full",required:!0}),e.jsx("div",{children:e.jsx(E,{onClick:a,disabled:!x,className:"btn btn-success",children:c(t=>t.execute)})}),i&&e.jsx(G,{message:i})]})}),oe=o.memo(({sourceIdx:r,device:s,externalDefinition:i})=>{const{t:c}=T("zigbee"),m=k(A(u=>u.bridgeInfo[r].zigbee_herdsman_converters.version)),d={labels:"new device support",title:`[New device support] ${s.model_id} from ${s.manufacturer}`,body:`<!-- MAKE SURE THIS IS NOT ALREADY POSTED ${M.slice(0,-4)} -->
### Link
### What does/doesn't work with the external definition?
### Details
zigbee-herdsman-converters: \`${m}\`
software_build_id: \`${s.software_build_id}\`
date_code: \`${s.date_code}\`
endpoints:
\`\`\`json
${JSON.stringify(s.endpoints)}
\`\`\`
### External definition:
\`\`\`ts
${i}
\`\`\`
`};return e.jsx(U,{target:"_blank",rel:"noopener noreferrer",to:`${M}?${new URLSearchParams(d).toString()}`,className:"btn",children:c(u=>u.request_support)})}),re=/^(zhc:tz: Read result of |z2m: Publish 'set' 'read' to |z2m: Publish 'set' 'write' to |zhc:tz: Wrote )/;function be({sourceIdx:r,device:s}){const{t:i}=T(["devConsole","common"]),c=k(A(a=>a.generatedExternalDefinitions[r][s.ieee_address])),m=k(A(a=>a.logs[r].findLast(t=>t.message.startsWith("zhc:tz: Invoked ")))),d=k(A(a=>a.logs[r].findLast(t=>re.test(t.message)))),u=k(a=>a.resetDeviceState),[f,g]=o.useState(!1),[l,b]=o.useState(!1);o.useEffect(()=>{g(!1)},[s]);const y=o.useCallback(async(a,t,h,w,_)=>{const j={read:{cluster:h,attributes:w}};_&&(j.read.state_property=_),await D(r,`${a}/${t}/set`,j)},[r]),C=o.useCallback(async(a,t,h,w)=>{const _={write:{cluster:h,payload:{}}};for(const j of w)_.write.payload[j.attribute]=j.value;await D(r,`${a}/${t}/set`,_)},[r]),x=o.useCallback(async()=>{g(!0),await D(r,"bridge/request/device/generate_external_definition",{id:s.ieee_address})},[r,s.ieee_address]),v=o.useCallback(()=>{u(r,s.friendly_name)},[r,s.friendly_name,u]);return e.jsxs("div",{className:"flex flex-col gap-3 w-full",children:[e.jsxs("div",{className:"flex flex-row flex-wrap justify-center items-center gap-2",children:[c?s.supported?null:e.jsx(oe,{sourceIdx:r,device:s,externalDefinition:c}):f?e.jsx("span",{className:"loading loading-infinity loading-xl"}):e.jsx(E,{className:"btn btn-primary",onClick:x,children:i(a=>a.generate_external_definition)}),e.jsx(E,{item:!l,onClick:b,className:"btn btn-primary",children:i(a=>l?a.hide_definition:a.show_definition)}),e.jsx(Y,{className:"btn btn-error",onClick:v,title:i(a=>a.reset_frontend_state),modalDescription:i(a=>a.dialog_confirmation_prompt,{ns:"common"}),modalCancelLabel:i(a=>a.cancel,{ns:"common"}),children:i(a=>a.reset_frontend_state)})]}),c&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"divider"}),e.jsx(F,{name:"generated_external_definition",label:i(a=>a.generated_external_definition),value:c,className:"textarea w-full",rows:8,readOnly:!0}),e.jsx(U,{to:Z,target:"_blank",rel:"noreferrer",className:"link link-primary self-end",children:i(a=>a.documentation,{ns:"common"})})]}),l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"divider"}),e.jsx(I,{obj:s.definition??{},lines:12})]}),e.jsx("div",{className:"divider"}),e.jsxs("div",{className:"flex flex-row flex-wrap justify-evenly gap-4",children:[e.jsx(ne,{sourceIdx:r,device:s,readDeviceAttributes:y,writeDeviceAttributes:C,lastLog:d}),e.jsx(ae,{sourceIdx:r,device:s,lastLog:m})]})]})}export{be as default};