LVDEPLOY

SERVER RACK TOOL

LVDeploy — Rack Placement & BOM
⚠️ Disclaimer & Acceptable Use This tool is the exclusive property of LVDeploy and is intended solely for authorised personnel. All data entered is for internal rack documentation purposes only. Unauthorised access, distribution, or reproduction of this tool or its contents is strictly prohibited. By logging in you agree to use this tool responsibly and in accordance with LVDeploy policies. LVDeploy accepts no liability for inaccurate documentation entered by users.
Incorrect username or password. Please try again.
"Planning & quoting tools for low voltage contractors"

New Installation

hello@lvdeploy.com | lvdeploy.com
Engineer:  |  Date:

Server Rack Bill of Materials (BOM)

Rack is empty. Add hardware or cables.

Infrastructure Connection Log

SourcePortTargetAction
'),q['document']['close']();}function updateHeader(){currentEntrance=document['getElementById']('entrance-path')['value'],document['getElementById']('display-job')['textContent']=document['getElementById']('job-name')['value']||'New\x20Installation',document['getElementById']('display-engineer')['textContent']=document['getElementById']('engineer-name')['value']||'—';const a=document['getElementById']('project-date')['value'];document['getElementById']('display-date')['textContent']=a?new Date(a+'T00:00:00')['toLocaleDateString']():'—',document['getElementById']('vis-wall')['style']['display']=currentEntrance==='In-Wall'?'block':'none',document['getElementById']('vis-emt')['style']['display']=currentEntrance==='EMT\x20Sleeve'?'block':'none',document['getElementById']('vis-ceil')['style']['display']=currentEntrance==='Ceiling\x20w/\x20Velcro'?'block':'none',renderBOM();}function exportExcel(){saveCurrentRackState();const a=XLSX['utils']['book_new'](),b=document['getElementById']('job-name')['value']||'—',c=document['getElementById']('job-location')['value']||'—',d=document['getElementById']('engineer-name')['value']||'—',e=document['getElementById']('project-date')['value'],f=e?new Date(e+'T00:00:00')['toLocaleDateString']():new Date()['toLocaleDateString'](),g=document['getElementById']('entrance-path')['value']||'—',h=parseFloat(document['getElementById']('circuit-capacity')['value'])||0x780,i=parseFloat(document['getElementById']('weight-capacity')['value'])||0x0,j=[['SERVER\x20RACK\x20CONFIGURATION'],[],['Job\x20/\x20Client:',b],['Location\x20/\x20Site:',c],['Engineer:',d],['Date:',f],['Cable\x20Entrance:',g],['Number\x20of\x20Racks:',racks['length']],['Circuit\x20Capacity\x20(80%\x20usable):',h+'W'],['Weight\x20Capacity\x20(this\x20rack):',i?i+'\x20lbs':'—'],[],['Rack','Style','Power\x20Draw','%\x20of\x20Circuit','Weight','%\x20of\x20Weight\x20Cap']];racks['forEach'](t=>{const u=t['hardware']['reduce']((x,y)=>x+(y['watts']||0x0),0x0),v=t['hardware']['reduce']((x,y)=>x+(y['weight']||0x0),0x0),w={'42|cabinet':'42U\x20Cabinet\x20(White)','42|twopost':'42U\x202-Post\x20Relay','20|cabinet':'20U\x20Wall\x20Cabinet'}[t['rackType']]||t['rackType'];j['push']([t['name'],w,u+'W',Math['round'](u/h*0x64)+'%',v+'\x20lbs',i?Math['round'](v/ i*0x64)+'%':'—']);}),XLSX['utils']['book_append_sheet'](a,XLSX['utils']['aoa_to_sheet'](j),'Summary'),racks['forEach'](t=>{const u=parseInt(t['rackType']['split']('|')[0x0]),v={};t['hardware']['forEach'](A=>{v[A['u']]=A;});const w=[['U\x20Position','Equipment','Size\x20(U)','Watts','Weight\x20(lbs)']];for(let A=0x1;A<=u;A++){const B=v[A];if(B)w['push']([A+'U',B['name'],B['size'],B['watts']||0x0,B['weight']||0x0]);else{const C=v[A-0x1];if(C&&C['size']===0x2)continue;w['push']([A+'U','Empty','—','','']);}}const x=t['hardware']['reduce']((D,E)=>D+(E['watts']||0x0),0x0),y=t['hardware']['reduce']((D,E)=>D+(E['weight']||0x0),0x0);w['push']([]),w['push'](['Total\x20Power\x20Draw:',x+'W','',Math['round'](x/h*0x64)+'%\x20of\x20circuit']),w['push'](['Total\x20Weight:',y+'\x20lbs','',i?Math['round'](y/ i*0x64)+'%\x20of\x20rated\x20capacity':'']);const z=XLSX['utils']['aoa_to_sheet'](w);z['!cols']=[{'wch':0xc},{'wch':0x20},{'wch':0xa},{'wch':0xa},{'wch':0xc}],XLSX['utils']['book_append_sheet'](a,z,t['name']['substring'](0x0,0x1f));});const k=[['Equipment','Quantity','Rack(s)']],l={},m={};racks['forEach'](t=>t['hardware']['forEach'](u=>{l[u['name']]=(l[u['name']]||0x0)+0x1,m[u['name']]=m[u['name']]||new Set(),m[u['name']]['add'](t['name']);})),Object['keys'](l)['forEach'](t=>k['push']([t,l[t],Array['from'](m[t])['join'](',\x20')]));const n=XLSX['utils']['aoa_to_sheet'](k);n['!cols']=[{'wch':0x1e},{'wch':0xa},{'wch':0x18}],XLSX['utils']['book_append_sheet'](a,n,'Hardware\x20BOM');const o=[['Length','Color','Type','Quantity']];patchInventory['forEach'](t=>{const u={'blue':'Data','white':'VOIP','black':'WAP','red':'Internet'};o['push']([t['length'],t['color']['toUpperCase'](),u[t['color']]||t['color'],t['qty']]);});const p=XLSX['utils']['aoa_to_sheet'](o);p['!cols']=[{'wch':0xa},{'wch':0xc},{'wch':0xe},{'wch':0xa}],XLSX['utils']['book_append_sheet'](a,p,'Patch\x20Cables');const q=[['Source\x20Room','Port\x20#','Target\x20Equipment']];document['querySelectorAll']('#cable-table\x20tbody\x20tr')['forEach'](t=>{const u=t['querySelectorAll']('td');if(u['length']>=0x3)q['push']([u[0x0]['textContent'],u[0x1]['textContent'],u[0x2]['textContent']]);});const r=XLSX['utils']['aoa_to_sheet'](q);r['!cols']=[{'wch':0x12},{'wch':0xa},{'wch':0x1c}],XLSX['utils']['book_append_sheet'](a,r,'Connection\x20Log');const s='rack_config_'+b['replace'](/\s+/g,'_')+'_'+Date['now']()+'.xlsx';XLSX['writeFile'](a,s);}function importExcel(a){const b=a['target']['files'][0x0];a['target']['value']='';if(!b)return;const c=new FileReader();c['onload']=d=>{try{const f=XLSX['read'](new Uint8Array(d['target']['result']),{'type':'array'}),g=f['Sheets']['Summary'];g&&(XLSX['utils']['sheet_to_json'](g,{'header':0x1})['forEach'](l=>{if(l[0x0]==='Job\x20/\x20Client:')document['getElementById']('job-name')['value']=l[0x1]||'';if(l[0x0]==='Location\x20/\x20Site:')document['getElementById']('job-location')['value']=l[0x1]||'';if(l[0x0]==='Engineer:')document['getElementById']('engineer-name')['value']=l[0x1]||'';if(l[0x0]==='Date:')try{const m=new Date(l[0x1]);if(!isNaN(m)){const n=m['toISOString']()['split']('T')[0x0];document['getElementById']('project-date')['value']=n;}}catch(p){}if(l[0x0]==='Cable\x20Entrance:'){const q=document['getElementById']('entrance-path');for(let r of q['options']){if(r['value']===l[0x1]){q['value']=l[0x1];break;}}}}),updateHeader());const h=['Summary','Hardware\x20BOM','Patch\x20Cables','Connection\x20Log'],i=f['SheetNames']['filter'](l=>!h['includes'](l));i['length']&&(racks=[],i['forEach'](l=>{const m=f['Sheets'][l],n=XLSX['utils']['sheet_to_json'](m,{'header':0x1}),o=[];let p=0x14;n['slice'](0x1)['forEach'](r=>{if(!r[0x0]||typeof r[0x0]!=='string'||!r[0x0]['endsWith']('U'))return;const s=parseInt(r[0x0]);if(isNaN(s))return;p=Math['max'](p,s);if(!r[0x1]||r[0x1]==='Empty')return;const t=parseInt(r[0x2])||0x1,u=parseFloat(r[0x3])||0x0,v=parseFloat(r[0x4])||0x0;o['push']({'u':s,'name':r[0x1],'size':t,'watts':u,'weight':v});});const q=p>0x14?'42|cabinet':'20|cabinet';racks['push']({'id':++rackIdCtr,'name':l,'rackType':q,'hardware':o});}),currentRackIdx=0x0,loadRackState(0x0));const j=f['Sheets']['Patch\x20Cables'];j&&(patchInventory=[],XLSX['utils']['sheet_to_json'](j,{'header':0x1})['slice'](0x1)['forEach'](l=>{if(!l[0x0]||!l[0x1])return;patchInventory['push']({'length':l[0x0],'color':(l[0x1]||'')['toLowerCase'](),'qty':parseInt(l[0x3])||0x0});}));const k=f['Sheets']['Connection\x20Log'];if(k){const l=document['querySelector']('#cable-table\x20tbody');l['innerHTML']='',XLSX['utils']['sheet_to_json'](k,{'header':0x1})['slice'](0x1)['forEach'](m=>{if(!m[0x0])return;const n=l['insertRow']();n['innerHTML']=''+(m[0x0]||'')+''+(m[0x1]||'')+''+(m[0x2]||'')+'Del';});}renderBOM(),alert('✅\x20Configuration\x20imported\x20successfully!');}catch(m){alert('❌\x20Could\x20not\x20read\x20Excel\x20file.\x20Please\x20use\x20a\x20file\x20exported\x20from\x20this\x20tool.'),console['error'](m);}},c['readAsArrayBuffer'](b);}function importFromPatchPanel(a){const b=a['target']['files'][0x0];a['target']['value']='';if(!b)return;const c=new FileReader();c['onload']=d=>{let f;try{f=JSON['parse'](d['target']['result']);if(!f['panels']||!Array['isArray'](f['panels']))throw new Error('Invalid');}catch(q){alert('❌\x20That\x20doesn\x27t\x20look\x20like\x20a\x20valid\x20Patch\x20Panel\x20Manager\x20project\x20file\x20(.json).');return;}if(f['meta']){const r=(s,t)=>{const u=document['getElementById'](s);if(u&&!u['value']['trim']()&&t)u['value']=t;};r('job-name',f['meta']['customer']),r('job-location',f['meta']['location']),r('engineer-name',f['meta']['tech']);}const g=f['panels']['filter'](s=>!s['isFiller']);if(!g['length']){alert('That\x20Patch\x20Panel\x20Manager\x20file\x20has\x20no\x20panels\x20or\x20switches\x20to\x20import.');return;}function h(s){if(!s['isSwitch'])return 0x0;return s['poe']?s['ports']*0x1e:Math['round'](s['ports']*2.5)+0xf;}function i(s){if(!s['isSwitch'])return s['ports']===0x30?0x8:0x5;return Math['round'](s['ports']*0.25)+0x6;}const j=g['map'](s=>({'name':s['isSwitch']?s['name']+'\x20('+s['ports']+'-Port'+(s['poe']?'\x20PoE':'')+'\x20Switch)':s['name']+'\x20('+s['ports']+'-Port\x20Patch\x20Panel)','size':!s['isSwitch']&&s['ports']===0x30?0x2:0x1,'watts':h(s),'weight':i(s),'portData':s['portData']||[]})),k=j['reduce']((t,u)=>t+u['size'],0x0);if(rackHardware['length']>0x0){const s=confirm('The\x20current\x20rack\x20\x22'+racks[currentRackIdx]['name']+'\x22\x20already\x20has\x20'+rackHardware['length']+'\x20item(s)\x20in\x20it.\x0a\x0aOK\x20=\x20import\x20into\x20a\x20new\x20rack\x20tab\x0aCancel\x20=\x20replace\x20what\x27s\x20in\x20the\x20current\x20rack');if(s){saveCurrentRackState();const t=f['meta']&&f['meta']['location']?f['meta']['location']:'Rack\x20'+(racks['length']+0x1);racks['push']({'id':++rackIdCtr,'name':t,'rackType':'42|cabinet','hardware':[]}),currentRackIdx=racks['length']-0x1,document['getElementById']('rack-type')['value']='42|cabinet';}}let l=parseInt(document['getElementById']('rack-type')['value']['split']('|')[0x0]);k>l&&(document['getElementById']('rack-type')['value']='42|cabinet',l=0x2a);buildEmptyRackGrid();let m=0x1,n=0x0;const o=[];j['forEach'](u=>{if(m+u['size']-0x1>l)return;const v=document['getElementById']('u-'+m);if(u['size']===0x2){const w=document['getElementById']('u-'+(m+0x1));v['classList']['add']('occupied','occupied-2u'),v['querySelector']('.content')['textContent']=u['name'],w['style']['display']='none',w['classList']['add']('occupied-hidden'),rackHardware['push']({'u':m,'name':u['name'],'size':0x2,'watts':u['watts'],'weight':u['weight']});}else v['classList']['add']('occupied'),v['querySelector']('.content')['textContent']=u['name'],rackHardware['push']({'u':m,'name':u['name'],'size':0x1,'watts':u['watts'],'weight':u['weight']});n++,u['portData']['forEach']((x,y)=>{if(!x||!x['label']&&!x['service']&&!x['cableId'])return;o['push']([x['label']||'Port\x20'+(y+0x1),y+0x1,u['name']]);}),m+=u['size'];});if(o['length']){const u=document['querySelector']('#cable-table\x20tbody');o['forEach'](v=>{const w=u['insertRow']();w['innerHTML']=''+v[0x0]+''+v[0x1]+''+v[0x2]+'Del';});}saveCurrentRackState(),renderRackTabs(),updateHeader(),renderBOM();const p=j['length']-n;alert('✅\x20Imported\x20'+n+'\x20item(s)\x20from\x20Patch\x20Panel\x20Manager\x20('+o['length']+'\x20port\x20assignment(s)\x20added\x20to\x20the\x20Connection\x20Log)'+(p>0x0?'\x0a\x0a⚠️\x20'+p+'\x20item(s)\x20didn\x27t\x20fit\x20even\x20at\x2042U\x20and\x20were\x20skipped.':''));},c['readAsText'](b);}function addCableRow(){const a=document['getElementById']('c-room')['value'],b=document['getElementById']('c-port')['value'],c=document['getElementById']('c-equip')['value'];if(!a||!b)return;const d=document['getElementById']('cable-table')['querySelector']('tbody')['insertRow']();d['innerHTML']=''+a+''+b+''+c+'Del',document['getElementById']('c-room')['value']='',document['getElementById']('c-port')['value']='';}function editLabel(a){const b=document['getElementById']('u-'+a);if(!b['classList']['contains']('occupied'))return;const c=rackHardware['find'](g=>g['u']===a),d=prompt('Label\x20hardware:',b['querySelector']('.content')['textContent']);if(d){b['querySelector']('.content')['textContent']=d;if(c)c['name']=d;}const e=prompt('Power\x20draw\x20in\x20watts\x20(0\x20for\x20passive\x20gear\x20like\x20patch\x20panels/shelves):',c?c['watts']||0x0:0x0);if(e!==null&&c){const g=parseFloat(e);c['watts']=isNaN(g)?0x0:g;}const f=prompt('Weight\x20in\x20lbs:',c?c['weight']||0x0:0x0);if(f!==null&&c){const h=parseFloat(f);c['weight']=isNaN(h)?0x0:h;}saveCurrentRackState(),renderBOM();}document['querySelectorAll']('.drag-item')['forEach'](a=>{a['addEventListener']('dragstart',b=>{b['dataTransfer']['setData']('size',a['dataset']['size']),b['dataTransfer']['setData']('name',a['dataset']['name']),b['dataTransfer']['setData']('watts',a['dataset']['watts']||'0'),b['dataTransfer']['setData']('weight',a['dataset']['weight']||'0');});});