
GrowPros 4′ Under Canopy Grow Lights Model 4 150W - Dual Channel 80% Red + White / InfraRed (730nm)
Boost bud quality and increase yields by lighting up the lower canopy with a compact dual-channel system designed for deeper, more uniform flower development. Growpros Solutions’ first-ever under-canopy lights with dual channels are engineered to enhance the yield and color of lower flowers. These supplemental lights can significantly enlarge B-buds and C-buds, promoting better growth and development in areas that typically underperform. By targeting the understory, Growpros Solutions ensures a more uniform and abundant harvest, maximizing the potential of every plant. The GrowPros Solutions 150W 4′ Under Canopy Grow Lights Model 4 Dual Channel have been meticulously designed by hydro growers for hydro growers. This innovative lighting system features two channels: one 125-watt channel with a Red + White spectrum and the other with a 25-watt IR spectrum. Both channels are dimmable, allowing for precise control over light intensity to meet the specific needs of your plants at important growth stages. ADJUSTABLE SPECTRUM /* Chart Container */ #chartcontainer_4ftuclm4 .chart-container4ftuclm4 { width: 100%; margin: 10px auto; display: flex; justify-content: center; } /* Control Panels */ #chartcontainer_4ftuclm4 #control-panels4ftuclm4 { display: flex; justify-content: space-around; margin-bottom: 20px; flex-wrap: wrap; } #chartcontainer_4ftuclm4 .control-panel4ftuclm4 { width: 100%; border: 1px dashed #000000; padding: 20px; border-radius: 2px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } #chartcontainer_4ftuclm4 .slider-title { font-family: Jost, sans-serif; font-size: 20px; margin-bottom: 15px; color: #000000; } #chartcontainer_4ftuclm4 .slider-paratitle { display: flex; flex-direction: row; justify-content: space-between; margin-top: 10px; } #chartcontainer_4ftuclm4 .slider-paratitle .current-value { text-align: right; width: 100%; font-weight: bold; color: #000000; } #chartcontainer_4ftuclm4 .slider-paratitle span { color:#cccccc; } /* Custom Process Bar Styles */ #chartcontainer_4ftuclm4 .process-container4ftuclm4 { width: 100%; height: 16px; background-color: #333333; position: relative; cursor: pointer; border-radius:2px; } #chartcontainer_4ftuclm4 .process-bar { height: 100%; background-color: #999999; width: 0; position: absolute; top: 0; left: 0; transform: translateX(0); will-change: width, transform; border-radius:2px; } #chartcontainer_4ftuclm4 .process-thumb { width: 20px; height: 20px; background-color: #046e82; border: 1px solid #111111; border-radius: 2px; position: absolute; top: 50%; transform: translate(-50%, -50%) translateX(0); left: 0; cursor: pointer; touch-action: none; transition: none; will-change: transform; } @media screen and (min-width: 768px) and (max-width: 1024px){ #chartcontainer_4ftuclm4 .control-panel4ftuclm4 { padding:10px 20px;} #chartcontainer_4ftuclm4 .slider-title { font-size:10px; margin-bottom:8px ; } #chartcontainer_4ftuclm4 .process-container4ftuclm4 { height:14px; } #chartcontainer_4ftuclm4 .process-thumb { width: 16px; height: 22px; } #chartcontainer_4ftuclm4 .slider-paratitle span {font-size:12px;} } /* Responsive adjustments */ @media screen and (max-width: 767px) { #chartcontainer_4ftuclm4 #control-panels4ftuclm4 { flex-direction: column; } #chartcontainer_4ftuclm4 .control-panel4ftuclm4 { width: 100%; margin-bottom: 20px; padding:10px; } #chartcontainer_4ftuclm4 .slider-title { font-size:8px; margin-bottom:4px; } #chartcontainer_4ftuclm4 .slider-title span { font-size: 7px; } #chartcontainer_4ftuclm4 .process-container4ftuclm4 { height:14px; } #chartcontainer_4ftuclm4 .process-thumb { width: 16px; height: 22px; } #chartcontainer_4ftuclm4 .slider-paratitle span { font-size:10px; } } var chart4ftuclm4 = jQuery.noConflict(true); chart4ftuclm4(document).ready(function($) { // Chart.js Setup const ctx = chart4ftuclm4('#myChart_4ftuclm4')[0].getContext('2d'); let chart; const dataset14ftuclm4 = { label: 'Channel 1', labels: ['','', '360', '', '', '', '', '395', '', '', '', '', '', '450', '', '', '', '', '', '500', '', '', '', '', '', '', '', '', '', '600', '', '', '', '', '660', '', '', '', '', '', '', '730', '', '', '', '', '', '780', '', '', '', '', '', ''], data: [0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 2, 7, 12, 7.5, 3.6, 2.3, 2.5, 3.6, 4.8, 5.8, 6.8, 8, 8.6, 9.2, 9.6, 10.2, 10.43, 10.4, 10.5, 11.1, 16, 30, 60, 100, 50, 15, 6, 2.4, 1.1, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }; const dataset24ftuclm4 = { label: 'Channel 2', data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 1.2, 2.6, 5.6, 12, 18.2, 21, 18.2, 12, 6, 2.7, 1.2, 0.2, 0, 0, 0] }; const colors = ['#111a39','#111a39','#111a39', '#111a39', '#111a39','#111a39','#111a39', '#111a39', '#162143', '#162143', '#162143', '#053390', '#1c4a9d', '#1c4a9d','#265aa8', '#3173b8', '#3698d5','#45bee3','#6fc4be', '#6ebf80', '#69b72d','#69b72d', '#6bb72d', '#79bc28','#97c626','#a8cc2b', '#c8d933','#d8e036', '#f1eb36','#f4c41c','#f19518', '#ed761b', '#e95619','#e62718','#e11713','#ce141b', '#b91c22', '#a91f24', '#951e23', '#851123', '#7f191e', '#7d191d','#76161b', '#6a1216', '#631014', '#5f0e12', '#51050a','#440104', '#380103','#230304','#221714', '#221714', '#221714','#221714', '#221714', '#221714','#221714', '#221714','#221714', '#221714']; let scale1 = 1; let scale2 = 1; function createGradient(ctx, chartArea, colors) { const gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 1); colors.forEach((color, index) => { gradient.addColorStop(index / (colors.length - 1), color); }); return gradient; } function createChart(labels, combinedData) { if (chart) { chart.destroy(); } chart = new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [ { type: 'line', label: 'PPF', data: combinedData, borderWidth: 0.1, backgroundColor: function(context) { const chart = context.chart; const {ctx, chartArea} = chart; if (!chartArea) { return null; } return createGradient(ctx, chartArea, colors); }, borderColor: function(context) { const chart = context.chart; const {ctx, chartArea} = chart; if (!chartArea) { return null; } return createGradient(ctx, chartArea, colors); }, fill: true, tension: 0.4 // Smoothing effect }, { type: 'line', label: 'Outline', data: combinedData, borderWidth: 2, backgroundColor: 'transparent', borderColor: '#000000', // Outline color fill: false, tension: 0.4 } ] }, options: { responsive: true, maintainAspectRatio: true, scales: { x: { stacked: true, grid: { display: false // Hide y-axis grid lines }, ticks: { color: '#000000', autoSkip: false, // Prevent auto-skipping of labels maxRotation: 0, // Prevent label rotation minRotation: 0, // Prevent label rotation maxTicksLimit: labels.length // Ensure all labels are shown }, border: { width:2, color: '#000000' // Change x-axis line color } }, y: { beginAtZero: true, max: 100, // Set a static max value for y-axis to accommodate added values grid: { color: '#000000', }, border: { width:2, color: '#000000' // Change y-axis line color }, ticks: { color: '#000000', callback: function(value) { return value % 20 === 0 ? value + '%' : ''; // Custom label formatting } } } }, events: null, radius: 0, plugins: { filler: {propagate: true}, // Enable filler legend: { display: false }, }, animation: { duration: 0 // Animation duration for smoother updates } } }); } function combineData(data1, data2) { return data1.map((value, index) => { return value + data2[index]; }); } function updateChart() { const scaledData1 = dataset14ftuclm4.data.map(value => value * scale1); const scaledData2 = dataset24ftuclm4.data.map(value => value * scale2); const combinedData = combineData(scaledData1, scaledData2); if (chart) { chart.data.datasets[0].data = combinedData; chart.data.datasets[1].data = combinedData; // Update outline dataset chart.options.animation.duration = 300; chart.update(); } } function createProcessBar(containerId, valueId, maxWattage) { // Added maxWattage parameter const $container = chart4ftuclm4(`#${containerId}`); const $controlPanel = $container.closest('.control-panel4ftuclm4'); const $thumb = $container.find('.process-thumb'); const $bar = $container.find('.process-bar'); const $currentValue = chart4ftuclm4(`#${valueId}`); let dragging = false; let containerOffset = $controlPanel.offset().left; let containerWidth = $controlPanel.width(); let processContainerWidth = $container.width(); let currentW = maxWattage; // Initialize to maxWattage // Update container metrics on resize function updateContainerMetrics() { containerOffset = $controlPanel.offset().left; containerWidth = $controlPanel.width(); processContainerWidth = $container.width(); setBarByWattage(currentW); } chart4ftuclm4(window).on('resize', updateContainerMetrics); // Initialize container metrics updateContainerMetrics(); // Function to set the bar and thumb position based on wattage function setBarByWattage(wattage) { currentW = Math.min(Math.max(wattage, 0), maxWattage); const touchRatio = currentW / maxWattage; const thumbLeft = touchRatio * processContainerWidth; // Update bar width $bar.css('width', `${touchRatio * 100}%`); // Update thumb position $thumb.css('transform', `translate(-50%, -50%) translateX(${thumbLeft}px)`); // Update displayed value $currentValue.text(`${currentW.toFixed(0)}W`); // Update the corresponding scale variable and chart if (containerId === 'process-container14ftuclm4') { scale1 = currentW / maxWattage; } else if (containerId === 'process-container24ftuclm4') { scale2 = currentW / maxWattage; } updateChart(); } // Function to handle the dragging logic function handleDrag(pageX) { const newLeft = pageX - containerOffset; const clampedLeft = Math.min(Math.max(newLeft, 0), containerWidth); const touchRatio = clampedLeft / containerWidth; const newWattage = touchRatio * maxWattage; setBarByWattage(newWattage); } // Throttle dragging using requestAnimationFrame let rafId = null; function onDrag(pageX) { if (rafId) return; // If a frame is already requested, do nothing rafId = requestAnimationFrame(() => { handleDrag(pageX); rafId = null; }); } // Mouse events $thumb.on('mousedown', function(e) { e.preventDefault(); dragging = true; }); chart4ftuclm4(document).on('mousemove', function(e) { if (dragging) { onDrag(e.pageX); } }); chart4ftuclm4(document).on('mouseup', function() { dragging = false; }); // Touch events bound to control panel $controlPanel.on('touchstart', function(e) { e.preventDefault(); dragging = true; const touch = e.originalEvent.touches[0]; onDrag(touch.pageX); }); chart4ftuclm4(document).on('touchmove', function(e) { if (dragging) { const touch = e.originalEvent.touches[0]; onDrag(touch.pageX); e.preventDefault(); } }); chart4ftuclm4(document).on('touchend touchcancel', function() { dragging = false; }); // Click on the control panel to set the thumb position $controlPanel.on('click', function(e) { const pageX = e.pageX; onDrag(pageX); }); // Initialize the bar to maxWattage setBarByWattage(currentW); } // Initialize the chart function initializeChart() { const scaledData1 = dataset14ftuclm4.data.map(value => value * scale1); const scaledData2 = dataset24ftuclm4.data.map(value => value * scale2); const initialCombinedData = combineData(scaledData1, scaledData2); createChart(dataset14ftuclm4.labels, initialCombinedData); } // Initial load initializeChart(); // Create Process Bars for Channel 1 and Channel 2 with different max wattages createProcessBar('process-container14ftuclm4', 'global-value14ftuclm4', 125); // Channel 1 with 125W max createProcessBar('process-container24ftuclm4', 'global-value24ftuclm4', 25); // Channel 2 with 25W max // Debounced Resize Handler to Redraw Chart on Screen Size Change let resizeTimeout; chart4ftuclm4(window).on('resize', function(){ clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function(){ if(chart){ chart.resize(); } // Update container metrics for process bars chart4ftuclm4('.process-container4ftuclm4').each(function(){ const containerId = chart4ftuclm4(this).attr('id'); const valueId = chart4ftuclm4(this).siblings('.slider-paratitle').find('.current-value').attr('id'); // The process bars are already handling their own resize events // No additional action is needed here }); }, 200); // Adjust the timeout as needed }); }); Slide the Bar to See How the Spectrum Changes Channel 1: 80%Red + White 0W 125W Channel 2: InfraRed (730nm) 0W 25W Usage Guidelines Features Adapted with 120V power cord or 240V power cord Sold Separately Increased Over All Yield – 25%-40% More Uniform Maturity across depth of canopy Less labor required in striping of under canopy Less labor required in sorting and trimming Increase in A and B buds means a higher value per pound Increase in grams per cubic foot of canopy Shortening of Flowering time – more harvest per year What's Included? GrowPros 4′ Under Canopy Grow Lights Model 4 Dual Channel 150W Download Resources Spec Sheet Maximum Power Electrical Data AC Current: 120V - 1.27A | 208V - 0.73A | 220V - 0.68A | 240V - 0.63A | 277V - 0.53A AC Power: 120V - 152W | 208V - 151W | 220V - 150.5W | 240V - 150W | 277V - 148W Power Factor: 120V - 0.99 | 208V - 0.98 | 220V - 0.97 | 240V - 0.96 | 277V - 0.94 Daisy Chain: 8 pcs @120V | 12 pcs @208V | 14 pcs @220V | 16 pcs @240V | 18 pcs @277V Interconnect Cables and Power Cords Additional components can be ordered separately since quantities will depend on the total number of lights and selected configurations. Note also that the lights connect together without interconnecting cables. The interconnecting cables are only needed to create the U where you have 2 rows of lights on a single bench OR if you need a space (up to 4 feet) between under canopy lights. See the above chart for limitations on how many lights can be connected on 1 power cable. Order your cords and cables below: Interconnect Cables Power Cords Power Adaptors (Convert 120V/240V into 277V Male Plug)