# HG changeset patch # User Michiel Broek # Date 1659804262 -7200 # Node ID 8b87ad5bd3c316fbba6e620da84c26daa8708576 # Parent 26ffc2fb0eafee94f26f1f4247afc94daa6bf422 Correction for Phosforic SG. Water treatment is a viewer. Start reordering and optimizing the calculations. diff -r 26ffc2fb0eaf -r 8b87ad5bd3c3 www/js/global.js --- a/www/js/global.js Fri Aug 05 20:11:11 2022 +0200 +++ b/www/js/global.js Sat Aug 06 18:44:22 2022 +0200 @@ -393,7 +393,7 @@ /* Note: AcidSG is for 100% use. AcidPrc is the default setting. */ { id: 0, en: 'Lactic', nl: 'Melkzuur', pK1: 3.86, pK2: 20, pK3: 20, MolWt: 90.08, AcidSG: 1238, AcidPrc: 80 }, { id: 1, en: 'Hydrochloric', nl: 'Zoutzuur', pK1: -7, pK2: 20, pK3: 20, MolWt: 36.46, AcidSG: 1497, AcidPrc: 28 }, - { id: 2, en: 'Phosphoric', nl: 'Fosforzuur', pK1: 2.12, pK2: 7.20, pK3: 12.44, MolWt: 98.00, AcidSG: 1982, AcidPrc: 75 }, + { id: 2, en: 'Phosphoric', nl: 'Fosforzuur', pK1: 2.12, pK2: 7.20, pK3: 12.44, MolWt: 98.00, AcidSG: 1773, AcidPrc: 75 }, { id: 3, en: 'Sulfuric', nl: 'Zwavelzuur', pK1: -1, pK2: 1.92, pK3: 20, MolWt: 98.07, AcidSG: 1884, AcidPrc: 93 } ], AcidTypeSource = { diff -r 26ffc2fb0eaf -r 8b87ad5bd3c3 www/js/prod_edit.js --- a/www/js/prod_edit.js Fri Aug 05 20:11:11 2022 +0200 +++ b/www/js/prod_edit.js Sat Aug 06 18:44:22 2022 +0200 @@ -35,17 +35,6 @@ cancelButton: $('#volumeReady') }); - $('#popupMash').jqxWindow({ - width: 800, - height: 400, - position: { x: 230, y: 100 }, - resizable: false, - theme: theme, - isModal: true, - autoOpen: false, - cancelButton: $('#MashReady'), - modalOpacity: 0.40 - }); } @@ -604,7 +593,7 @@ $('#sparge_ph').val(dataRecord.sparge_ph); $('#sparge_volume').val(dataRecord.sparge_volume); $('#sparge_source').val(dataRecord.sparge_source); - $('#sparge_acid_type').val(dataRecord.sparge_acid_type); + $('#sparge_acid_type').val(AcidTypeData[dataRecord.sparge_acid_type].nl); $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); $('#sparge_acid_amount').val(dataRecord.sparge_acid_amount * 1000); $('#calc_acid').val(dataRecord.calc_acid); @@ -946,19 +935,19 @@ if (row.m_use_use == 6) { // Sparge switch (row.m_name) { case 'CaCl2': -// $('#ss_cacl2').val(row.m_amount * 1000); + $('#ss_cacl2').val(row.m_amount * 1000); break; case 'CaSO4': -// $('#ss_caso4').val(row.m_amount * 1000); + $('#ss_caso4').val(row.m_amount * 1000); break; case 'MgSO4': -// $('#ss_mgso4').val(row.m_amount * 1000); + $('#ss_mgso4').val(row.m_amount * 1000); break; case 'NaCl': -// $('#ss_nacl').val(row.m_amount * 1000); + $('#ss_nacl').val(row.m_amount * 1000); break; case 'MgCl2': -// $('#ss_mgcl2').val(row.m_amount * 1000); + $('#ss_mgcl2').val(row.m_amount * 1000); break; } } @@ -1137,8 +1126,6 @@ { name: 'step_ph', type: 'float' }, { name: 'step_sg', type: 'float' } ], - addrow: function(rowid, rowdata, position, commit) { commit(true); }, - deleterow: function(rowid, commit) { commit(true); } }, mashAdapter = new $.jqx.dataAdapter(mashSource); @@ -1148,62 +1135,21 @@ source: mashAdapter, theme: theme, selectionmode: 'singlerow', - showtoolbar: true, - rendertoolbar: function(toolbar) { - var container = $('
'); - toolbar.append(container); - container.append(''); - container.append(''); - $('#saddrowbutton').jqxButton({ template: 'primary', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) }); - $('#saddrowbutton').on('click', function() { - var row = {}, rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount; - row['step_name'] = 'Stap ' + (rowscount + 1); - if (rowscount > 0) { - row['step_type'] = 1; - row['step_infuse_amount'] = 0.0; - row['step_volume'] = mash_infuse; - } else { - row['step_type'] = 0; - row['step_infuse_amount'] = 15.0; - row['step_volume'] = 15; - } - row['step_infuse_temp'] = 0; - row['step_temp'] = 62.0; - row['step_time'] = 20.0; - row['step_wg_ratio'] = 0.0; - row['ramp_time'] = 1.0; - row['end_temp'] = 62.0; - row['step_ph'] = 0.0; - row['step_sg'] = 0.0; - $('#mashGrid').jqxGrid('addrow', null, row); - calcMash(); - }); - // delete selected step. - $('#sdeleterowbutton').jqxButton({ template: 'danger', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) }); - $('#sdeleterowbutton').on('click', function() { - var rowscount, id, selectedrowindex = $('#mashGrid').jqxGrid('getselectedrowindex'); - rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount; - if (selectedrowindex >= 0 && selectedrowindex < rowscount) { - id = $('#mashGrid').jqxGrid('getrowid', selectedrowindex); - $('#mashGrid').jqxGrid('deleterow', id); - calcMash(); - } - }); - }, + editable: false, ready: function() { /* Calculate the whole recipe */ console.log('ready mashs, start calculations'); - calcFermentables(); - whirlpoolHops(); - calcIBUs(); - calcMiscs(); - calcViability(); - showStarter(); - calcYeast(); - calcInit(); + /* calcFermentables() must be first and is done by the grid load. Here it is too late. */ calcMash(); calcWater(); - kookTijd(); + calcIBUs(); + whirlpoolHops(); + calcMiscs(); +// calcViability(); +// showStarter(); +// calcYeast(); +// calcInit(); +// kookTijd(); console.log('calculations ready'); $('#jqxLoader').jqxLoader('close'); $('#jqxTabs').jqxTabs('first'); @@ -1246,78 +1192,13 @@ } }, { text: 'pH', datafield: 'step_ph', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f2' }, - { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' }, - { text: '', columntype: 'button', width: 15, align: 'center', - cellsrenderer: function(row) { - if (row < 2) - return ' '; - return '▴'; - }, buttonclick: function(row) { - if (row >= 2) { - swapMash(row, row-1); - } - } - }, - { text: '', columntype: 'button', width: 15, align: 'center', - cellsrenderer: function(row) { - rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount; - if (row < 1 || row > (rowscount -2)) - return ' '; - return '▾'; - }, buttonclick: function(row) { - rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount; - if (row >= 1 && row <= (rowscount -2)) { - swapMash(row, row+1); - } - } - }, - { text: '', datafield: 'Edit', columntype: 'button', width: 80, align: 'center', - cellsrenderer: function() { - return 'Wijzig'; - }, buttonclick: function(row) { - if (dataRecord.stage > 3) { - alert('Het maischen is al gedaan.'); - } else { - mashRow = row; - mashData = $('#mashGrid').jqxGrid('getrowdata', mashRow); - if (mashRow == 0) - $("#wstep_type").jqxDropDownList('disableAt', 2); - else - $("#wstep_type").jqxDropDownList('enableAt', 2); - $('#wstep_name').val(mashData.step_name); - $('#wstep_type').val(mashData.step_type); - $('#wstep_infuse_amount').val(mashData.step_infuse_amount); - $('#wstep_infuse_temp').val(mashData.step_infuse_temp); - $('#wstep_temp').val(mashData.step_temp); - $('#wend_temp').val(mashData.end_temp); - $('#wstep_time').val(mashData.step_time); - $('#wramp_time').val(mashData.ramp_time); - $('#wstep_infuse_amount').hide(); // Hide all untile we need it. - $('#wstep_infuse_temp').hide(); - $('#wstep_pmpt_amount').hide(); - $('#wstep_pmpt_temp').hide(); - if (mashData.step_type == 0) { - if (mashRow == 0) { - $('#wstep_infuse_amount').show(); - $('#wstep_pmpt_amount').show(); - } else { - $('#wstep_infuse_temp').show(); - $('#wstep_pmpt_temp').show(); - } - } - $('#wstep_ph').val(mashData.step_ph); - $('#wstep_sg').val(mashData.step_sg); - // show the popup window. - $('#popupMash').jqxWindow('open'); - } - } - } + { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' } ] }); }; /* - * Remove the top menu so that we MUST use the buttons to leave the editor. + * Remove the top menu so that we MUST use the button to leave the editor. */ $('#jqxMenu').jqxMenu('destroy'); console.log('record:' + my_record + ' return:' + my_return + ' theme:' + theme); @@ -1338,21 +1219,6 @@ } } - function swapMash(r1, r2) { - - console.log('swap mash rows ' + r1 + ' ' + r2); - var row1 = $('#mashGrid').jqxGrid('getrowdata', r1); - var row2 = $('#mashGrid').jqxGrid('getrowdata', r2); - var obj1 = { step_name: row1.step_name, step_type: row1.step_type, step_volume: row1.step_volume, step_infuse_amount: row1.step_infuse_amount, - step_infuse_temp: row1.step_infuse_temp, step_temp: row1.step_temp, step_time: row1.step_time, - ramp_time: row1.ramp_time, end_temp: row1.end_temp, step_wg_ratio: row1.step_wg_ratio, step_ph: row1.step_ph, step_sg: row1.step_sg }; - var obj2 = { step_name: row2.step_name, step_type: row2.step_type, step_volume: row2.step_volume, step_infuse_amount: row2.step_infuse_amount, - step_infuse_temp: row2.step_infuse_temp, step_temp: row2.step_temp, step_time: row2.step_time, - ramp_time: row2.ramp_time, end_temp: row2.end_temp, step_wg_ratio: row2.step_wg_ratio, step_ph: row2.step_ph, step_sg: row2.step_sg }; - $("#mashGrid").jqxGrid('updaterow', r1, obj2); - $("#mashGrid").jqxGrid('updaterow', r2, obj1); - } - function infusionVol(step_infused, step_mashkg, infuse_temp, step_temp, last_temp) { var a = last_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt); var b = step_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt); @@ -1796,40 +1662,6 @@ $('#brew_sparge_est').val(spoelw); } - /* - * Change OG of recipe but keep the water volumes. - */ - function calcFermentablesFromOG(OG) { - - console.log('calcFermentablesFromOG(' + OG + ')'); - var amount, row, d, i, sug, tot = 0, totmass = 0, rowscount, efficiency = parseFloat($('#efficiency').jqxNumberInput('decimal')); - sug = sg_to_plato(OG) * parseFloat($('#batch_size').jqxNumberInput('decimal')) * OG / 100; //total amount of sugars in kg - rowscount = dataRecord.fermentables.length; - - for (i = 0; i < rowscount; i++) { - row = dataRecord.fermentables[i]; - if (row.f_added < 4) { - d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100); - if (row.f_added == 0) // Mash - d = efficiency / 100 * d; - tot += d; - } - } - if (tot) - totmass = Round(sug / tot, 3); - - if (totmass) { - for (i = 0; i < rowscount; i++) { - row = dataRecord.fermentables[i]; - if (row.f_added < 4) { - amount = Math.round(row.f_percentage * 10 * totmass) / 1000; - dataRecord.fermentables[i].f_amount = amount; - $('#fermentableGrid').jqxGrid('setcellvalue', i, 'f_amount', amount); - } - } - } - }; - function getNeededYeastCells() { var plato, volume, sg = dataRecord.brew_fermenter_sg; @@ -2310,20 +2142,6 @@ $('#plato_cells').val(parseFloat(use_cells / (volume * plato))); }; - function adjustHops(factor) { - - //console.log('adjustHops(' + factor + ')'); - var row, i, amount, rowscount = dataRecord.hops.length; - if (rowscount == 0) - return; - for (i = 0; i < rowscount; i++) { - row = dataRecord.hops[i]; - amount = row.h_amount * factor; - dataRecord.hops[i].h_amount = amount; - $('#hopGrid').jqxGrid('setcellvalue', i, 'h_amount', amount); - } - }; - function whirlpoolHops() { var row, i, time, rowscount = dataRecord.hops.length; if (rowscount == 0) @@ -2357,96 +2175,6 @@ calcSupplies(); }; - function adjustMiscs(factor) { - - //console.log('adjustMiscs(' + factor + ')'); - var row, i, amount, rowscount = dataRecord.miscs.length; - if (rowscount == 0) - return; - for (i = 0; i < rowscount; i++) { - row = dataRecord.miscs[i]; - amount = row.m_amount * factor; - dataRecord.miscs[i].m_amount = amount; - $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount); - switch (row.m_name) { - case 'CaCl2': - $('#wa_cacl2').val(row.m_amount * 1000); - break; - case 'CaSO4': - $('#wa_caso4').val(row.m_amount * 1000); - break; - case 'MgSO4': - $('#wa_mgso4').val(row.m_amount * 1000); - break; - case 'NaCl': - $('#wa_nacl').val(row.m_amount * 1000); - break; - case 'MgCl2': - $('#wa_mgcl2').val(row.m_amount * 1000); - break; - case 'NaHCO3': - $('#wa_nahco3').val(row.m_amount * 1000); - break; - case 'CaCO3': - $('#wa_caco3').val(row.m_amount * 1000); - break; - case 'Melkzuur': - case 'Zoutzuur': - case 'Fosforzuur': - case 'Zwavelzuur': - $('#wa_acid').val(row.m_amount * 1000); - break; - } - } - }; - - function adjustYeasts(factor) { - - //console.log('adjustYeasts(' + factor + ')'); - var row, i, amount, rowscount = dataRecord.yeasts.length; - if (rowscount == 0) - return; - for (i = 0; i < rowscount; i++) { - row = dataRecord.yeasts[i]; - if (! dataRecord.starter_enable) { // Only adjust without a starter - amount = row.y_amount * factor; - dataRecord.yeasts[i].y_amount = amount; - $('#yeastGrid').jqxGrid('setcellvalue', i, 'y_amount', amount); - } - } - calcYeast(); - }; - - function adjustWaters(factor) { - - console.log('adjustWaters(' + factor + ')'); - var amount, row, i, rowscount = dataRecord.mashs.length; - if (rowscount == 0) - return; - mash_infuse = 0; - for (i = 0; i < rowscount; i++) { - row = dataRecord.mashs[i]; - if (row.step_type == 0) { // Infusion - amount = Round(parseFloat(row.step_infuse_amount) * factor, 1); - dataRecord.mashs[i].step_infuse_amount = amount; - $('#mashGrid').jqxGrid('setcellvalue', i, 'step_infuse_amount', amount); - mash_infuse += amount; - } - } - if (dataRecord.w2_amount == 0) { - dataRecord.w1_amount = mash_infuse; - $('#w1_amount').val(mash_infuse); - } else { - var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse; - var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse; - dataRecord.w1_amount = Round(w1_amount, 3); - dataRecord.w2_amount = Round(w2_amount, 3); - $('#w1_amount').val(dataRecord.w1_amount); - $('#w2_amount').val(dataRecord.w2_amount); - } - $('#wg_amount').val(mash_infuse); - }; - function calcMashEfficiency() { var c, m; if (parseFloat($('#brew_mash_sg').jqxNumberInput('decimal')) < 1.002) @@ -2513,20 +2241,16 @@ } function GetOptSO4Clratio() { - if (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) > 0 && parseFloat($('#pr_chloride').jqxNumberInput('decimal'))) { - return (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) / parseFloat($('#pr_chloride').jqxNumberInput('decimal'))); - } else { var BUGU = GetBUGU(); return (1.0 / (-1.2 * BUGU + 1.4)); - } } - function setWaterAgent(name, amount) { + function setWaterAgent(name, amount, use) { var row, i, id, found = false, miscs, rows = $('#miscGrid').jqxGrid('getrows'); if (amount == 0) { for (i = 0; i < rows.length; i++) { row = rows[i]; - if (row.m_name == name) { + if (row.m_name == name && row.m_use_use == use) { id = $('#miscGrid').jqxGrid('getrowid', i); $('#miscGrid').jqxGrid('deleterow', id); } @@ -2534,7 +2258,7 @@ } else { for (i = 0; i < rows.length; i++) { row = rows[i]; - if (row.m_name == name) { + if (row.m_name == name && row.m_use_use == use) { found = true; $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount / 1000); break; @@ -2551,7 +2275,7 @@ row['m_amount'] = amount / 1000; row['m_cost'] = record.cost; row['m_type'] = record.type; - row['m_use_use'] = record.use_use; + row['m_use_use'] = use; row['m_time'] = 0; row['m_amount_is_weight'] = record.amount_is_weight; row['m_inventory'] = record.inventory; @@ -2703,9 +2427,11 @@ return; } + $('#w1_hardness').val(Hardness(dataRecord.w1_calcium, dataRecord.w1_magnesium)); + $('#w1_ra').val(ResidualAlkalinity(dataRecord.w1_total_alkalinity, dataRecord.w1_calcium, dataRecord.w1_magnesium)); + // If there is a dillute water source, mix the waters. if ((dataRecord.w2_name != '') && (dataRecord.w2_name != 'Geen mengwater')) { -console.log("calcWater() mixed " + dataRecord.w2_name); liters = dataRecord.w1_amount + dataRecord.w2_amount; calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium); magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium); @@ -2714,8 +2440,9 @@ sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate); total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity); ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters); + $('#w2_hardness').val(Hardness(dataRecord.w2_calcium, dataRecord.w2_magnesium)); + $('#w2_ra').val(ResidualAlkalinity(dataRecord.w2_total_alkalinity, dataRecord.w2_calcium, dataRecord.w2_magnesium)); } else { -console.log("calcWater() single"); liters = dataRecord.w1_amount; calcium = dataRecord.w1_calcium; magnesium = dataRecord.w1_magnesium; @@ -2725,7 +2452,7 @@ total_alkalinity = dataRecord.w1_total_alkalinity; ph = dataRecord.w1_ph; } - var bicarbonate = total_alkalinity * 1.22; + var bicarbonate = Bicarbonate(total_alkalinity, ph); /* Save mixed water ions for later */ var wg_calcium = calcium; @@ -2735,6 +2462,9 @@ var wg_sulfate = sulfate; var wg_bicarbonate = bicarbonate; + dataRecord.wg_amount = liters; + dataRecord.wg_ph = ph; + $('#wg_amount').val(liters); $('#wg_calcium').val(Round(calcium, 1)); $('#wg_magnesium').val(Round(magnesium, 1)); @@ -2744,6 +2474,8 @@ $('#wg_chloride').val(Round(chloride, 1)); $('#wg_sulfate').val(Round(sulfate, 1)); $('#wg_ph').val(Round(ph, 2)); + $('#wg_hardness').val(Round(Hardness(calcium, magnesium), 1)); + $('#wg_ra').val(Round(ResidualAlkalinity(total_alkalinity, calcium, magnesium), 1)); var mash_ph = Round(MashpH(), 3); console.log('Distilled water mash pH: ' + mash_ph); @@ -2796,16 +2528,19 @@ Acid = protonDeficit / frac; Acid *= AcidTypeData[AT].MolWt; // mg Acidmg = Acid; - Acid = Acid / AcidTypeData[AT].AcidSG; // ml - Acid = Round(Acid / (parseFloat(dataRecord.wa_acid_perc) / 100), 2); // ml + var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (parseFloat(dataRecord.wa_acid_perc) / 100)) + 1000, 2); + Acid /= RealSG; + Acid /= AcidTypeData[AT].AcidPrc / 100; + Acid = Round(Acid, 2); console.log('Mash auto Acid final ml: ' + Acid); $('#wa_acid').val(Acid); - setWaterAgent(AcidTypeData[AT].nl, Acid); + setWaterAgent(AcidTypeData[AT].nl, Acid, 1); bicarbonate = bicarbonate - protonDeficit * frac / liters; total_alkalinity = bicarbonate * 50 / 61; } ph = TpH; + dataRecord.wb_ph = ph; $('#wb_ph').val(Round(ph, 2)); $('#est_mash_ph').val(Round(ph, 2)); } else { @@ -2840,9 +2575,8 @@ pd = ProtonDeficit(pHa); } //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa); - RA = wg_bicarbonate - protonDeficit * frac / liters; - bicarbonate = RA; - total_alkalinity = RA * 50 / 61; + bicarbonate = wg_bicarbonate - protonDeficit * frac / liters; + total_alkalinity = bicarbonate * 50 / 61; ph = pHa; $('#wb_ph').val(Round(ph, 2)); $('#est_mash_ph').val(Round(ph, 2)); @@ -2914,6 +2648,8 @@ $('#wb_chloride').val(Round(chloride, 1)); $('#wb_bicarbonate').val(Round(bicarbonate, 1)); $('#wb_total_alkalinity').val(Round(total_alkalinity, 1)); + $('#wb_hardness').val(Hardness(calcium, magnesium)); + $('#wb_ra').val(ResidualAlkalinity(total_alkalinity, calcium, magnesium)); if (calcium < 40) { setRangeIndicator('calcium', 'laag'); @@ -2975,79 +2711,130 @@ function calcSparge() { /* Based on the work of ajDeLange. */ + var ws_calcium, ws_magnesium, ws_total_alkalinity, ws_sodium, ws_chloride; + var ws_sulfate, ws_ph, ws_hardness, ws_ra; var TargetpH = dataRecord.sparge_ph; - var Source_pH = dataRecord.w1_ph; - var Source_alkalinity = dataRecord.w1_total_alkalinity; + var Source_pH = 7.0; + // Select watersource or fallback to the first source. - if (dataRecord.sparge_source == 1) { // Source 2 - if (dataRecord.w2_ph > 0.0) { + if ((dataRecord.sparge_source == 1) && (dataRecord.w2_ph > 0.0)) { // Source 2 + ws_calcium = dataRecord.w2_calcium; + ws_magnesium = dataRecord.w2_magnesium; + ws_total_alkalinity = dataRecord.w2_total_alkalinity; + ws_sodium = dataRecord.w2_sodium; + ws_chloride = dataRecord.w2_chloride; + ws_sulfate = dataRecord.w2_sulfate; Source_pH = dataRecord.w2_ph; - Source_alkalinity = dataRecord.w2_total_alkalinity; - } else { - dataRecord.sparge_source = 0; // Source 1 - $('#sparge_source').val(0); - } - } else if (dataRecord.sparge_source == 2) { // Mixed - if (dataRecord.w2_ph > 0.0) { - Source_pH = parseFloat(dataRecord.wg_ph); - Source_alkalinity = parseFloat(dataRecord.wg_total_alkalinity); - } else { - dataRecord.sparge_source = 0; - $('#sparge_source').val(0); - } + $('#w2_button').jqxRadioButton({ checked: true }); + } else if ((dataRecord.sparge_source == 2) && (dataRecord.w2_ph > 0.0)) { // Mixed + ws_calcium = dataRecord.wg_calcium; + ws_magnesium = dataRecord.wg_magnesium; + ws_total_alkalinity = dataRecord.wg_total_alkalinity; + ws_sodium = dataRecord.wg_sodium; + ws_chloride = dataRecord.wg_chloride; + ws_sulfate = dataRecord.wg_sulfate; + Source_pH = dataRecord.wg_ph; + $('#wg_button').jqxRadioButton({ checked: true }); + } else { + ws_calcium = dataRecord.w1_calcium; + ws_magnesium = dataRecord.w1_magnesium; + ws_total_alkalinity = dataRecord.w1_total_alkalinity; + ws_sodium = dataRecord.w1_sodium; + ws_chloride = dataRecord.w1_chloride; + ws_sulfate = dataRecord.w1_sulfate; + Source_pH = dataRecord.w1_ph; + $('#w1_button').jqxRadioButton({ checked: true }); } - // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH - var r1 = Math.pow(10, Source_pH - 6.35); - var r2 = Math.pow(10, Source_pH - 10.33); - var d = 1 + r1 + r1 * r2; - var f1 = 1 / d; - var f3 = r1 * r2 / d; - - //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) - var r143 = Math.pow(10, 4.3 - 6.35); - var r243 = Math.pow(10, 4.3 - 10.33); - var d43 = 1 + r143 + r143 * r243; - var f143 = 1 / d43; - var f343 = r143 * r243 / d43; - - //Step 4. Solve - var Ct = Source_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); - - //Step 5. Compute mole fractions at desired pH - var r1g = Math.pow(10, TargetpH - 6.35); - var r2g = Math.pow(10, TargetpH - 10.33); - var dg = 1 + r1g + r1g * r2g; - var f1g = 1 / dg; - var f3g = r1g * r2g / dg; - - //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) - var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l - Acid += 0.01; // Add acid that would be required for distilled water. - - //Step 8. Get the acid data. - var AT = dataRecord.sparge_acid_type; + if (dataRecord.sparge_volume > 0) { + ws_calcium += (parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 + + parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / dataRecord.sparge_volume; + ws_magnesium += (parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000 + + parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMMg / MMMgCl2 * 1000) / dataRecord.sparge_volume; + ws_sodium += (parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000) / dataRecord.sparge_volume; + ws_sulfate += (parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 + + parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / dataRecord.sparge_volume; + ws_chloride += (2 * parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 + + parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000 + + parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMCl / MMMgCl2 * 1000) / dataRecord.sparge_volume; + } + + /* Show the spargewate with salt additions */ + $('#sw_calcium').val(Round(ws_calcium, 1)); + $('#sw_magnesium').val(Round(ws_magnesium, 1)); + $('#sw_sodium').val(Round(ws_sodium, 1)); + $('#sw_sulfate').val(Round(ws_sulfate, 1)); + $('#sw_chloride').val(Round(ws_chloride, 1)); + $('#sw_bicarbonate').val(Round(Bicarbonate(ws_total_alkalinity, Source_pH), 1)); + $('#sw_total_alkalinity').val(Round(ws_total_alkalinity, 1)); + $('#sw_ph').val(dataRecord.sparge_ph); + $('#sw_hardness').val(Hardness(ws_calcium, ws_magnesium)); + $('#sw_ra').val(ResidualAlkalinity(ws_total_alkalinity, ws_calcium, ws_magnesium)); + + AT = dataRecord.sparge_acid_type; if (AT < 0 || AT >= AcidTypeData.length) { AT = 0; dataRecord.sparge_acid_type = 0; - $('#sparge_acid_type').val(0); + $('#sparge_acid_type').val(AcidTypeData[0].nl); dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc; $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); } - var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); - - //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. - Acid /= fract; - - //Step 10. Multiply by molecular weight of the acid - Acid *= AcidTypeData[AT].MolWt; //mg - - //Step 11. Divide by Specific Gravity and Percentage to get the final ml. - Acid = Acid / AcidTypeData[AT].AcidSG / (dataRecord.sparge_acid_perc / 100); //ml - Acid *= dataRecord.sparge_volume; //ml acid total - Acid = Round(Acid, 2); - dataRecord.sparge_acid_amount = Acid / 1000; - $('#sparge_acid_amount').val(Acid); + + /* + * Auto calculate the required acid + */ + if (dataRecord.calc_acid) { + // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH + var r1 = Math.pow(10, Source_pH - 6.35); + var r2 = Math.pow(10, Source_pH - 10.33); + var d = 1 + r1 + r1 * r2; + var f1 = 1 / d; + var f3 = r1 * r2 / d; + + //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) + var r143 = Math.pow(10, 4.3 - 6.35); + var r243 = Math.pow(10, 4.3 - 10.33); + var d43 = 1 + r143 + r143 * r243; + var f143 = 1 / d43; + var f343 = r143 * r243 / d43; + + //Step 4. Solve + var Ct = ws_total_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); + + //Step 5. Compute mole fractions at desired pH + var r1g = Math.pow(10, TargetpH - 6.35); + var r2g = Math.pow(10, TargetpH - 10.33); + var dg = 1 + r1g + r1g * r2g; + var f1g = 1 / dg; + var f3g = r1g * r2g / dg; + + //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) + var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l + Acid += 0.01; // Add acid that would be required for distilled water. + + //Step 8. Get the acid data. + var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); + + //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. + Acid /= fract; + + //Step 10. Multiply by molecular weight of the acid + Acid *= AcidTypeData[AT].MolWt; //mg + + //Step 11. Divide by Specific Gravity and Percentage to get the final ml. + var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (dataRecord.sparge_acid_perc / 100)) + 1000, 2); + Acid = Acid / RealSG; //ml + Acid *= dataRecord.sparge_volume; //ml acid total at 100% + Acid /= AcidTypeData[AT].AcidPrc / 100; //ml acid at supplied strength + Acid = Round(Acid, 2); + dataRecord.sparge_acid_amount = Acid / 1000; + $('#sparge_acid_amount').val(Acid); + } + + // Finally calculate the estimate preboil pH + var ph = -Math.log10(((Math.pow(10, -dataRecord.wb_ph) * dataRecord.wg_amount) + (Math.pow(10, -dataRecord.sparge_ph) * dataRecord.sparge_volume)) / + (dataRecord.wg_amount + dataRecord.sparge_volume)); + $('#preboil_ph').val(ph); } function calcFermentation() { @@ -3107,6 +2894,8 @@ var TSec, ABV, bvol, balc, babv, mvol, malc, tvol, talc, i, row, SFactor, pvol, pabv, Pressure, kabv; + console.log('calcCarbonation()'); + TSec = dataRecord.secondary_temp; if (TSec < 1) TSec = dataRecord.primary_end_temp; @@ -3197,35 +2986,7 @@ } function en_stage_afterbrew(state) { - - var onval = { disabled: (state) ? true:false }; - var spinstate = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 90:110 }; - var spinsmall = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 70:90 }; - $('#jqxTabs').jqxTabs((state) ? 'enableAt':'disableAt', 9); // Fermentation tab - $('#mash_select').jqxDropDownList(onval); - $('#w1_name').jqxDropDownList(onval); - $('#w2_name').jqxDropDownList(onval); - $('#w2_amount').jqxNumberInput(onval); - $('#pr_name').jqxDropDownList(onval); - $('#wa_cacl2').jqxNumberInput(spinstate); - $('#wa_caso4').jqxNumberInput(spinstate); - $('#wa_mgso4').jqxNumberInput(spinstate); - $('#wa_nacl').jqxNumberInput(spinstate); - $('#wa_mgcl2').jqxNumberInput(spinstate); - $('#wa_nahco3').jqxNumberInput(spinstate); - $('#wa_caco3').jqxNumberInput(spinstate); - $('#mash_ph').jqxNumberInput(spinstate); - $('#calc_acid').jqxCheckBox(onval); - $('#wa_acid_name').jqxDropDownList(onval); - $('#wa_acid').jqxNumberInput(spinstate); - $('#wa_acid_perc').jqxNumberInput(spinsmall); - $('#sparge_temp').jqxNumberInput(spinstate); - $('#sparge_volume').jqxNumberInput(spinstate); - $('#sparge_ph').jqxNumberInput(spinstate); - $('#sparge_source').jqxDropDownList(onval); - $('#sparge_acid_type').jqxDropDownList(onval); - $('#sparge_acid_perc').jqxNumberInput(spinstate); } function en_stage_afterprimary(istate) { @@ -3415,324 +3176,19 @@ function calcInit() { + console.log('** calcInit() start'); calcMashEfficiency(); calcEfficiencyBeforeBoil(); calcEfficiencyAfterBoil(); - - $('#calc_acid').on('checked', function(event) { - dataRecord.calc_acid = 1; - calcWater(); - }); - $('#calc_acid').on('unchecked', function(event) { - dataRecord.calc_acid = 0; - calcWater(); - }); - $('#w1_name').jqxDropDownList('selectItem', dataRecord.w1_name); - $('#w2_name').jqxDropDownList('selectItem', dataRecord.w2_name); - // Fix tap water if zero using mash infuse amount. -console.log("mash_infuse: " + mash_infuse + " w1: " + parseFloat($('#w1_amount').jqxNumberInput('decimal')) + " " + dataRecord.w1_amount); - if (parseFloat($('#w1_amount').jqxNumberInput('decimal')) == 0 && mash_infuse > 0) { - $('#w1_amount').val(mash_infuse); - dataRecord.w1_amount = mash_infuse; - $('#wg_amount').val(mash_infuse); - $('#w2_amount').val(0); - dataRecord.w2_amount = 0; - } calcWater(); - $('#w2_amount').on('change', function(event) { - var newval = parseFloat(event.args.value); - if (newval > parseFloat($('#wg_amount').jqxNumberInput('decimal'))) { - $('#w2_amount').val(dataRecord.w2_amount); - return; - } - dataRecord.w1_amount = parseFloat($('#wg_amount').jqxNumberInput('decimal')) - newval; - $('#w1_amount').val(dataRecord.w1_amount); - dataRecord.w2_amount = newval; - console.log('new: ' + event.args.value + ' w1: ' + dataRecord.w1_amount + ' w2: ' + dataRecord.w2_amount); - calcWater(); - }); - $('#wa_cacl2').on('change', function(event) { - if (event.args) { - setWaterAgent('CaCl2', 0); // This prevents double entries. - setWaterAgent('CaCl2', event.args.value); - calcWater(); - } - }); - $('#wa_caso4').on('change', function(event) { - if (event.args) { - setWaterAgent('CaSO4', 0); - setWaterAgent('CaSO4', event.args.value); - calcWater(); - } - }); - $('#wa_mgso4').on('change', function(event) { - if (event.args) { - setWaterAgent('MgSO4', 0); - setWaterAgent('MgSO4', event.args.value); - calcWater(); - } - }); - $('#wa_nacl').on('change', function(event) { - if (event.args) { - setWaterAgent('NaCl', 0); - setWaterAgent('NaCl', event.args.value); - calcWater(); - } - }); - $('#wa_mgcl2').on('change', function(event) { - if (event.args) { - setWaterAgent('MgCl2', 0); - setWaterAgent('MgCl2', event.args.value); - calcWater(); - } - }); - $('#wa_nahco3').on('change', function(event) { - if (event.args) { - setWaterAgent('NaHCO3', 0); - setWaterAgent('NaHCO3', event.args.value); - calcWater(); - } - }); - $('#wa_caco3').on('change', function(event) { - if (event.args) { - setWaterAgent('CaCO3', 0); - setWaterAgent('CaCO3', event.args.value); - calcWater(); - } - }); - $('#wa_acid_name').on('select', function(event) { - if (event.args) { - var index = event.args.index; - console.log('wa_acid_name ' + index + ' last_acid: ' + last_acid); - setWaterAgent(last_acid, 0); - last_acid = AcidTypeData[index].nl; - dataRecord.wa_acid_name = index; - dataRecord.wa_acid_perc = AcidTypeData[index].AcidPrc; - $('#wa_acid_perc').val(dataRecord.wa_acid_perc); - calcWater(); - setWaterAgent(last_acid, parseFloat($('#wa_acid').jqxNumberInput('decimal'))); - } - }); - $('#wa_acid').on('change', function(event) { - var name = AcidTypeData[dataRecord.wa_acid_name].nl; - setWaterAgent(name, parseFloat(event.args.value)); - calcWater(); - }); - $('#wa_acid_perc').on('change', function(event) { - dataRecord.wa_acid_perc = parseFloat(event.args.value); - calcWater(); - }); - - $('#sparge_ph').on('change', function(event) { - dataRecord.sparge_ph = parseFloat(event.args.value); - calcSparge(); - }); - $('#sparge_volume').on('change', function(event) { - dataRecord.sparge_volume = parseFloat(event.args.value); - $('#brew_sparge_volume').val(dataRecord.sparge_volume); - calcSparge(); - }); - $('#sparge_temp').on('change', function(event) { - dataRecord.sparge_temp = parseFloat(event.args.value); - $('#brew_sparge_temperature').val(dataRecord.sparge_temp); - }); - $('#sparge_source').on('select', function(event) { - if (event.args) { - dataRecord.sparge_source = event.args.index; - calcSparge(); - } - }); - $('#sparge_acid_type').on('select', function(event) { - if (event.args) { - dataRecord.sparge_acid_type = event.args.index; - console.log('new sparge_acid_type: ' + dataRecord.sparge_acid_type); - dataRecord.sparge_acid_perc = AcidTypeData[event.args.index].AcidPrc; - $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); - calcSparge(); - } - }); - $('#sparge_acid_perc').on('change', function(event) { - dataRecord.sparge_acid_perc = parseFloat(event.args.value); - calcSparge(); - }); - calcFermentation(); - calcCarbonation(); - $('#package_volume').on('change', function(event) { - var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount; - dataRecord.package_volume = parseFloat(event.args.value); - if (dataRecord.package_volume > dataRecord.brew_fermenter_volume) { - dataRecord.package_volume = dataRecord.brew_fermenter_volume; - $('#package_volume').val(dataRecord.package_volume); - } - tnew = dataRecord.package_volume + dataRecord.package_infuse_amount; - diff = Round(tnew - told, 3); - if (told > 0) { - dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3); - dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3); - } else { - dataRecord.bottle_amount = tnew; - dataRecord.keg_amount = 0; - } - $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount)); - $('#keg_amount').val(parseFloat(dataRecord.keg_amount)); - calcCarbonation(); - }); - $('#package_infuse_amount').on('change', function(event) { - var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount; - dataRecord.package_infuse_amount = parseFloat(event.args.value); - tnew = dataRecord.package_volume + dataRecord.package_infuse_amount; - diff = Round(tnew - told, 3); - if (told > 0) { - dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3); - dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3); - } else { - dataRecord.bottle_amount = tnew; - dataRecord.keg_amount = 0; - } - $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount)); - $('#keg_amount').val(parseFloat(dataRecord.keg_amount)); - calcCarbonation(); - }); - $('#package_infuse_abv').on('change', function(event) { - dataRecord.package_infuse_abv = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#bottle_amount').on('change', function(event) { - var vtot, vnew = parseFloat(event.args.value); - vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.keg_amount, 3); - if (vnew > vtot) - vnew = vtot; - dataRecord.bottle_amount = Round(vnew, 3); - $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount)); - console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount); - calcCarbonation(); - }); - $('#bottle_priming_water').on('change', function(event) { - dataRecord.bottle_priming_water = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#keg_amount').on('change', function(event) { - var vtot, vnew = parseFloat(event.args.value); - vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.bottle_amount, 3); - if (vnew > vtot) - vnew = vtot; - dataRecord.keg_amount = Round(vnew, 3); - $('#keg_amount').val(parseFloat(dataRecord.keg_amount)); - console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount); - calcCarbonation(); - }); - $('#keg_priming_water').on('change', function(event) { - dataRecord.keg_priming_water = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#bottle_carbonation').on('change', function(event) { - dataRecord.bottle_carbonation = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#bottle_carbonation_temp').on('change', function(event) { - dataRecord.bottle_carbonation_temp = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#keg_carbonation').on('change', function(event) { - dataRecord.keg_carbonation = parseFloat(event.args.value); - calcCarbonation(); - }); - $('#keg_forced_carb').on('checked', function(event) { - dataRecord.keg_forced_carb = 1; - calcCarbonation(); - }); - $('#keg_forced_carb').on('unchecked', function(event) { - dataRecord.keg_forced_carb = 0; - calcCarbonation(); - }); - $('#keg_carbonation_temp').on('change', function(event) { - dataRecord.keg_carbonation_temp = parseFloat(event.args.value); - calcCarbonation(); - }); - - $('#brew_fermenter_extrawater').on('change', function(event) { - dataRecord.brew_fermenter_extrawater = parseFloat(event.args.value); - calcFermentables(); - calcIBUs(); - calcYeast(); - }); - $('#brew_fermenter_tcloss').on('change', function(event) { - dataRecord.brew_fermenter_tcloss = parseFloat(event.args.value); - calcFermentables(); - calcIBUs(); - calcYeast(); - }); - $('#primary_end_sg').on('change', function(event) { - dataRecord.primary_end_sg = parseFloat(event.args.value); - calcFermentation(); - }); - $('#primary_end_brix').on('change', function(event) { - var OBrix, FBrix, FG; - if (dataRecord.brew_fermenter_sg >= 1.020) { - OBrix = sg_to_plato(dataRecord.brew_fermenter_sg); - FBrix = parseFloat(event.args.value); - FG = brix_to_fg(OBrix, FBrix); - if (FBrix > 0.05) { - $('#primary_end_sg').val(FG); - dataRecord.primary_end_sg = FG; - } - calcFermentation(); - } - }); - $('#secondary_end_sg').on('change', function(event) { - dataRecord.secondary_end_sg = parseFloat(event.args.value); - calcFermentation(); - }); - $('#secondary_end_brix').on('change', function(event) { - var OBrix, FBrix, FG; - if (dataRecord.brew_fermenter_sg >= 1.020) { - OBrix = sg_to_plato(dataRecord.brew_fermenter_sg); - FBrix = parseFloat(event.args.value); - FG = brix_to_fg(OBrix, FBrix); - if (FBrix > 0.05) { - $('#secondary_end_sg').val(FG); - dataRecord.secondary_end_sg = FG; - } - calcFermentation(); - } - }); - $('#final_brix').on('change', function(event) { - var OBrix, FBrix, FG; - if (dataRecord.brew_fermenter_sg >= 1.020) { - OBrix = sg_to_plato(dataRecord.brew_fermenter_sg); - FBrix = parseFloat(event.args.value); - FG = brix_to_fg(OBrix, FBrix); - if (FBrix > 0.05) { - $('#fg').val(FG); - dataRecord.fg = FG; - } - calcFermentation(); - } - }); - $('#fg').on('change', function(event) { - dataRecord.fg = parseFloat(event.args.value); - calcFermentation(); - }); - $('#brew_whirlpool9').on('valueChanged', function(event) { - dataRecord.brew_whirlpool9 = event.args.value; - whirlpoolHops(); - calcIBUs(); - }); - $('#brew_whirlpool7').on('valueChanged', function(event) { - dataRecord.brew_whirlpool7 = event.args.value; - whirlpoolHops(); - calcIBUs(); - }); - $('#brew_whirlpool6').on('valueChanged', function(event) { - dataRecord.brew_whirlpool6 = event.args.value; - whirlpoolHops(); - calcIBUs(); - }); +// calcCarbonation(); + calcIBUs(); $('#BLog').jqxButton({ disabled: (dataRecord.log_brew) ? false : true}); $('#FLog').jqxButton({ disabled: (dataRecord.log_fermentation) ? false : true}); $('#ILog').jqxButton({ disabled: (dataRecord.log_ispindel) ? false : true}); $('#CLog').jqxButton({ disabled: (dataRecord.log_co2pressure) ? false : true}); + console.log('** calcInit() ready'); } @@ -3947,410 +3403,113 @@ // Tab 7, Mashing $('#mash_name').jqxTooltip({ content: 'De omschrijving van dit maisch profiel.' }); $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 }); - $('#mash_select').jqxDropDownList({ - placeHolder: 'Kies schema:', - theme: theme, - source: mashlist, - displayMember: 'name', - width: 250, - height: 23, - dropDownWidth: 500, - dropDownHeight: 500, - dropDownHorizontalAlignment: 'right' - }); - $('#mash_select').on('select', function(event) { - if (event.args) { - var infused = 0, data, datarecord, rowIDs, rows, i, row, index = event.args.index; - // First delete all current steps - rowIDs = new Array(); - rows = $('#mashGrid').jqxGrid('getdisplayrows'); - for (i = 0; i < rows.length; i++) { - row = rows[i]; - rowIDs.push(row.uid); - } - $('#mashGrid').jqxGrid('deleterow', rowIDs); - // Then add the new steps - datarecord = mashlist.records[index]; - $('#mash_name').val(datarecord.name); - for (i = 0; i < datarecord.steps.length; i++) { - data = datarecord.steps[i]; - row = {}; - row['step_name'] = data.step_name; - row['step_type'] = parseInt(data.step_type); - row['step_temp'] = parseFloat(data.step_temp); - row['end_temp'] = parseFloat(data.end_temp); - row['step_time'] = parseFloat(data.step_time); - row['ramp_time'] = parseFloat(data.ramp_time); - row['step_infuse_temp'] = 0.0; - row['step_infuse_amount'] = 0.0; - if (mash_infuse == 0 && dataRecord.wg_amount > 0) - mash_infuse = dataRecord.wg_amount; - if (data.step_type == 0) { // Infusion - if (i == 0) { - row['step_infuse_amount'] = parseFloat(mash_infuse); - } else { - row['step_infuse_temp'] = 99.0; - } - } - row['step_ph'] = 0.0; - row['step_sg'] = 0.0; - //console.log(i + ' type: ' + row['step_type'] + ' start infusion: ' + parseFloat(row['step_infuse_amount']) + ' mash_infuse: ' + mash_infuse); - infused += parseFloat(row['step_infuse_amount']); - row['step_volume'] = infused; - if (mashkg > 0) - row['step_wg_ratio'] = Round(parseFloat(mash_infuse / mashkg), 6); - else - row['step_wg_ratio'] = 0.0; - $('#mashGrid').jqxGrid('addrow', null, row); - } - calcMash(); - } - }); $('#est_mashvol').jqxTooltip({ content: 'Het totale volume van het maishwater en de mout in de maish pan.' }); $('#est_mashvol').jqxNumberInput(Show1dec); $('#est_mashtime').jqxTooltip({ content: 'De totale tijdsduur van het maischen.' }); $('#est_mashtime').jqxInput({ theme: theme, width: 70, height: 23 }); - $('#MashReady').jqxButton({ template: 'success', width: '90px', theme: theme }); - $('#MashReady').click(function() { - calcFermentables(); - calcWater(); - calcSparge(); - calcMash(); - }); - $('#wstep_name').jqxInput({ theme: theme, width: 320, height: 23 }); - $('#wstep_name').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_name = $('#wstep_name').val(); - }); - $('#wstep_type').jqxDropDownList({ - theme: theme, - source: MashStepTypeAdapter, - valueMember: 'id', - displayMember: 'nl', - width: 180, - height: 23, - autoDropDownHeight: true - }); - $('#wstep_type').on('select', function(event) { - if (event.args) { - var rowdata, i, rows, row, index = event.args.index; - rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - if (rowdata.step_type != index) { - rowdata.step_type = index; - $('#wstep_infuse_amount').hide(); - $('#wstep_infuse_temp').hide(); - $('#wstep_pmpt_amount').hide(); - $('#wstep_pmpt_temp').hide(); - if (index == 0) { // Infusion - if (mashRow == 0) { - $('#wstep_infuse_amount').show(); - $('#wstep_pmpt_amount').show(); - } else { - $('#wstep_infuse_temp').show(); - $('#wstep_pmpt_temp').show(); - } - } - if (index == 1) { // Temperature - if (mashRow > 0) - rowdata.step_infuse_amount = 0; - rowdata.step_infuse_temp = 0; - } - if (index == 2) { // Decoction - var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1); - rowdata.step_infuse_temp = 99; - rowdata.step_infuse_amount = decoctionVol(rowdata.step_volume, rowdata.step_temp, rowprev.end_temp); - console.log('decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp); - } - $('#mashGrid').jqxGrid('updaterow', mashRow, rowdata); - mash_infuse = 0; - rows = $('#mashGrid').jqxGrid('getrows'); - for (i = 0; i < rows.length; i++) { - row = rows[i]; - if (row.step_type == 0) // Infusion - mash_infuse += parseFloat(row.step_infuse_amount); - } - calcMash(); - } - } - }); - $('#wstep_temp').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - if (rowdata.step_type == 2) { // Decoction - var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1); - var a = (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + rowdata.step_volume * SpecificHeatWater) * - (parseFloat(event.args.value) - rowprev.end_temp); - var b = SpecificHeatWater * (99 - parseFloat(event.args.value)); - if (b > 0) { - rowdata.step_temp = parseFloat(event.args.value); - rowdata.step_infuse_amount = Round(a / b, 2); - } else - rowdata.step_infuse_amount = 0; - console.log('change temp ' + rowdata.step_temp + ' decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp); - } else { - rowdata.step_temp = parseFloat(event.args.value); - } - }); - $('#wstep_temp,#wend_temp,#wstep_infuse_amount,#wstep_infuse_temp').jqxNumberInput(Spin1dec); - $('#wend_temp').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.end_temp = parseFloat(event.args.value); - }); - $('#wstep_time,#wramp_time').jqxNumberInput(PosInt); - $('#wstep_time').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_time = parseFloat(event.args.value); - calcMash(); - }); - $('#wstep_ph').jqxNumberInput(Spin2pH); - $('#wstep_ph').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_ph = parseFloat(event.args.value); - }); - $('#wstep_sg').jqxNumberInput(SGopts); - $('#wstep_sg').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_sg = parseFloat(event.args.value); - }); - $('#wstep_brix').jqxNumberInput(Spin1dec); - $('#wstep_brix').on('change', function(event) { - /* Use plato_to_sg at this stage */ - var sg = Round(plato_to_sg(parseFloat(event.args.value)), 4); -console.log('brix: ' + parseFloat(event.args.value) + ' sg: ' + sg); - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - if (sg <= 1.005) { - sg = 0.0; - } - rowdata.step_sg = sg; - $('#wstep_sg').val(sg); - }); - $('#wramp_time').on('change', function(event) { - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.ramp_time = parseFloat(event.args.value); - calcMash(); - }); - $('#wstep_infuse_amount').on('change', function(event) { - var row, i, rows, rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_infuse_amount = parseFloat(event.args.value); - if (mashRow == 0) { - rowdata.step_infuse_amount = parseFloat(event.args.value); - mash_infuse = 0; - rows = $('#mashGrid').jqxGrid('getrows'); - for (i = 0; i < rows.length; i++) { - row = rows[i]; - if (row.step_type == 0) // Infusion - mash_infuse += parseFloat(row.step_infuse_amount); - } - if (dataRecord.w2_amount == 0) { - dataRecord.w1_amount = mash_infuse; - $('#w1_amount').val(mash_infuse); - } else { - var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse; - var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse; - dataRecord.w1_amount = Round(w1_amount, 3); - dataRecord.w2_amount = Round(w2_amount, 3); - $('#w1_amount').val(dataRecord.w1_amount); - $('#w2_amount').val(dataRecord.w2_amount); - } - $('#wg_amount').val(mash_infuse); - console.log('new infuse amount: ' + mash_infuse); - calcWater(); - calcMash(); - } - }); - $('#wstep_infuse_temp').on('change', function(event) { - var prevdata = $('#mashGrid').jqxGrid('getrowdata', mashRow-1); - var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow); - rowdata.step_infuse_temp = parseFloat(event.args.value); - var vol = infusionVol(prevdata.step_volume, mashkg, rowdata.step_infuse_temp, rowdata.step_temp, prevdata.end_temp); - console.log('new vol: ' + vol); - rowdata.step_infuse_amount = vol; - $('#wstep_infuse_amount').val(vol); - }); // Tab 8, Water $('#tgt_bu').jqxNumberInput(Show2wat); $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat); + $('#preboil_ph').jqxNumberInput(Show2wat); // Water source 1 - $('#w1_name').jqxDropDownList({ - placeHolder: 'Kies hoofd water:', - theme: theme, - source: waterlist, - displayMember: 'name', - width: 200, - height: 27, - dropDownWidth: 400, - dropDownHeight: 400 - }); - $('#w1_name').on('select', function(event) { - if (event.args) { - var datarecord, index = event.args.index; - datarecord = waterlist.records[index]; - dataRecord.w1_name = datarecord.name; - $('#w1_calcium').val(datarecord.calcium); - dataRecord.w1_calcium = datarecord.calcium; - $('#w1_sulfate').val(datarecord.sulfate); - dataRecord.w1_sulfate = datarecord.sulfate; - $('#w1_chloride').val(datarecord.chloride); - dataRecord.w1_chloride = datarecord.chloride; - $('#w1_sodium').val(datarecord.sodium); - dataRecord.w1_sodium = datarecord.sodium; - $('#w1_magnesium').val(datarecord.magnesium); - dataRecord.w1_magnesium = datarecord.magnesium; - $('#w1_total_alkalinity').val(datarecord.total_alkalinity); - $('#w1_bicarbonate').val(datarecord.total_alkalinity * 1.22); - dataRecord.w1_total_alkalinity = datarecord.total_alkalinity; - $('#w1_ph').val(datarecord.ph); - dataRecord.w1_ph = datarecord.ph; - $('#w1_cost').val(datarecord.cost); - dataRecord.w1_cost = datarecord.cost; - calcWater(); - } - }); + $('#w1_name').jqxInput({ theme: theme, width: 200, height: 23 }); + $('#w1_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); $('#w1_amount,#w1_calcium,#w1_magnesium,#w1_sodium,#w1_bicarbonate,#w1_total_alkalinity,#w1_chloride,#w1_sulfate').jqxNumberInput(Show1wat); $('#w1_ph').jqxNumberInput(Show2wat); + $('#w1_hardness').jqxNumberInput(Show1wat); + $('#w1_ra').jqxNumberInput(Show1wat); // Water source 2 - $('#w2_name').jqxDropDownList({ - placeHolder: 'Kies meng water:', - theme: theme, - source: water2list, - displayMember: 'name', - width: 200, - height: 27, - dropDownWidth: 400, - dropDownHeight: 400 - }); - $('#w2_name').on('select', function(event) { - if (event.args) { - var datarecord, index = event.args.index; - datarecord = water2list.records[index]; - if (index == 0) { - dataRecord.w2_amount = 0; - $('#w2_amount').val(0); - dataRecord.w1_amount = mash_infuse; - $('#w1_amount').val(mash_infuse); - } - dataRecord.w2_name = datarecord.name; - $('#w2_calcium').val(datarecord.calcium); - dataRecord.w2_calcium = datarecord.calcium; - $('#w2_sulfate').val(datarecord.sulfate); - dataRecord.w2_sulfate = datarecord.sulfate; - $('#w2_chloride').val(datarecord.chloride); - dataRecord.w2_chloride = datarecord.chloride; - $('#w2_sodium').val(datarecord.sodium); - dataRecord.w2_sodium = datarecord.sodium; - $('#w2_magnesium').val(datarecord.magnesium); - dataRecord.w2_magnesium = datarecord.magnesium; - $('#w2_total_alkalinity').val(datarecord.total_alkalinity); - $('#w2_bicarbonate').val(datarecord.total_alkalinity * 1.22); - dataRecord.w2_total_alkalinity = datarecord.total_alkalinity; - $('#w2_ph').val(datarecord.ph); - dataRecord.w2_ph = datarecord.ph; - $('#w2_cost').val(datarecord.cost); - dataRecord.w2_cost = datarecord.cost; - $('#w2_amount').jqxNumberInput({ max: 100000, readOnly: false }); // Set high max to enable the spinbuttons. - calcWater(); - } - }); - $('#w2_amount').jqxTooltip({ content: 'De verdeling van het hoofd en meng water. Het totale maisch water volume blijft gelijk.'}); - $('#w2_amount').jqxNumberInput({ - inputMode: 'simple', spinMode: 'simple', theme: theme, width: 94, height: 23, min: 0, max: 0, decimalDigits: 1, - spinButtons: true, spinButtonsStep: 0.1, readOnly: true - }); + $('#w2_name').jqxInput({ theme: theme, width: 200, height: 23 }); + $('#w2_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); + $('#w2_amount').jqxNumberInput(Show1wat); $('#w2_calcium,#w2_magnesium,#w2_sodium,#w2_bicarbonate,#w2_total_alkalinity,#w2_chloride,#w2_sulfate').jqxNumberInput(Show1wat); $('#w2_ph').jqxNumberInput(Show2wat); + $('#w2_hardness').jqxNumberInput(Show1wat); + $('#w2_ra').jqxNumberInput(Show1wat); // Water mixed + $('#wg_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true }); $('#wg_amount,#wg_calcium,#wg_magnesium,#wg_sodium,#wg_bicarbonate,#wg_total_alkalinity,#wg_chloride,#wg_sulfate').jqxNumberInput(Show1wat); $('#wg_ph').jqxNumberInput(Show2wat); + $('#wg_hardness').jqxNumberInput(Show1wat); + $('#wg_ra').jqxNumberInput(Show1wat); // Water treated $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'}); + $('#wb_calcium').jqxNumberInput(Show1wat); $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'}); + $('#wb_magnesium').jqxNumberInput(Show1wat); $('#wb_sodium').jqxTooltip({ content: 'De ideale hoeveelheid Natrium is lager dan 150.'}); + $('#wb_sodium').jqxNumberInput(Show1wat); $('#wb_chloride').jqxTooltip({ content: 'De ideale hoeveelheid Chloride is tussen 50 en 150. Samen met Sulfaat minder dan 500.'}); + $('#wb_chloride').jqxNumberInput(Show1wat); $('#wb_sulfate').jqxTooltip({ content: 'De ideale hoeveelheid Sulfaat is tussen 50 en 400. Samen met Chloride minder dan 500.'}); + $('#wb_sulfate').jqxNumberInput(Show1wat); $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'}); - $('#wb_calcium,#wb_magnesium,#wb_sodium,#wb_bicarbonate,#wb_total_alkalinity,#wb_chloride,#wb_sulfate').jqxNumberInput(Show1wat); + $('#wb_bicarbonate').jqxNumberInput(Show1wat); $('#wb_ph').jqxNumberInput(Show2wat); - // Water target profile - $('#pr_name').jqxDropDownList({ - placeHolder: 'Kies doel profiel:', - theme: theme, - source: waterprofiles, - displayMember: 'name', - width: 200, - height: 27, - dropDownWidth: 400, - dropDownHeight: 300 - }); - $('#pr_name').on('select', function(event) { - if (event.args) { - var datarecord, index = event.args.index; - datarecord = waterprofiles.records[index]; - $('#pr_calcium').val(datarecord.calcium); - $('#pr_sulfate').val(datarecord.sulfate); - $('#pr_chloride').val(datarecord.chloride); - $('#pr_sodium').val(datarecord.sodium); - $('#pr_magnesium').val(datarecord.magnesium); - $('#pr_total_alkalinity').val(datarecord.total_alkalinity); - $('#pr_bicarbonate').val(datarecord.total_alkalinity * 1.22); - calcWater(); - } - }); - $('#pr_calcium,#pr_magnesium,#pr_sodium,#pr_bicarbonate,#pr_total_alkalinity,#pr_chloride,#pr_sulfate').jqxNumberInput(Show1wat); + $('#wb_hardness').jqxNumberInput(Show1wat); + $('#wb_ra').jqxNumberInput(Show1wat); + // Sparge water + $('#sw_amount').jqxNumberInput(Show1wat); + $('#sw_calcium').jqxNumberInput(Show1wat); + $('#sw_magnesium').jqxNumberInput(Show1wat); + $('#sw_sodium').jqxNumberInput(Show1wat); + $('#sw_bicarbonate').jqxNumberInput(Show1wat); + $('#sw_total_alkalinity').jqxNumberInput(Show1wat); + $('#sw_chloride').jqxNumberInput(Show1wat); + $('#sw_sulfate').jqxNumberInput(Show1wat); + $('#sw_ph').jqxNumberInput(Show2wat); + $('#sw_hardness').jqxNumberInput(Show1wat); + $('#sw_ra').jqxNumberInput(Show1wat); // Water agents $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.' }); + $('#wa_cacl2').jqxNumberInput(Show2wat); + $('#ss_cacl2').jqxNumberInput(Show2wat); + $('#wa_caso4').jqxTooltip({ content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.' }); + $('#wa_caso4').jqxNumberInput(Show2wat); + $('#ss_caso4').jqxNumberInput(Show2wat); + $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!' }); + $('#wa_mgso4').jqxNumberInput(Show2wat); + $('#ss_mgso4').jqxNumberInput(Show2wat); + $('#wa_nacl').jqxTooltip({ content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' + 'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.' }); + $('#wa_nacl').jqxNumberInput(Show2wat); + $('#ss_nacl').jqxNumberInput(Show2wat); + $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'}); + $('#wa_mgcl2').jqxNumberInput(Show2wat); + $('#ss_mgcl2').jqxNumberInput(Show2wat); + $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'}); $('#wa_caco3').jqxTooltip({ content: 'Kalk'}); - $('#wa_cacl2,#wa_caso4,#wa_mgso4,#wa_nacl,#wa_mgcl2,#wa_nahco3,#wa_caco3').jqxNumberInput(Spin1dec); + $('#wa_nahco3,#wa_caco3').jqxNumberInput(Show2wat); + $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'}); - $('#mash_ph').jqxNumberInput(SpinpH); - $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23 }); - $('#wa_acid').jqxNumberInput(Spin2dec); - $('#wa_acid_name').jqxDropDownList({ - theme: theme, - source: AcidTypeAdapter, - valueMember: 'id', - displayMember: 'nl', - width: 130, - height: 23, - autoDropDownHeight: true - }); + $('#mash_ph').jqxNumberInput(Show2dec); + + $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23, disabled: true }); + + $('#wa_acid_name').jqxInput({ theme: theme, width: 130, height: 23 }); + $('#wa_acid').jqxNumberInput(Show2dec); $('#wa_acid').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' }); - $('#wa_acid_perc,#sparge_acid_perc').jqxNumberInput(Perc0); - $('#wa_acid_perc').jqxNumberInput({ width: 70, symbol: '%', symbolPosition: 'right' }); + $('#wa_acid_perc').jqxNumberInput(Show0dec); + $('#wa_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' }); + // Sparge water - $('#sparge_temp,#sparge_volume').jqxNumberInput(Spin1dec); - $('#sparge_ph').jqxNumberInput(SpinpH); - $('#sparge_source').jqxDropDownList({ - theme: theme, - source: SpargeSourceAdapter, - valueMember: 'id', - displayMember: 'nl', - width: 110, - height: 23, - autoDropDownHeight: true - }); - $('#sparge_acid_amount').jqxNumberInput(Spin2dec); - $('#sparge_acid_amount').jqxNumberInput({ spinButtons: false, readOnly: true, symbol: ' ml', symbolPosition: 'right' }); - $('#sparge_acid_type').jqxDropDownList({ - theme: theme, - source: AcidTypeAdapter, - valueMember: 'id', - displayMember: 'nl', - width: 110, - height: 23, - autoDropDownHeight: true - }); + $('#sparge_ph').jqxNumberInput(Show2dec); + $('#sparge_acid_amount').jqxNumberInput(Show2dec); + $('#sparge_acid_amount').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' }); + $('#sparge_acid_type').jqxInput({ theme: theme, width: 130, height: 23 }); + $('#sparge_acid_perc').jqxNumberInput(Show0dec); $('#sparge_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' }); // Tab 9, Brewday @@ -4385,12 +3544,6 @@ calcEfficiencyBeforeBoil(); }); $('#brew_mash_sg,#brew_preboil_sg,#brew_aboil_sg').jqxNumberInput(SGopts); - $('#brew_aboil_sg').on('valueChanged', function(event) { - dataRecord.brew_aboil_sg = event.args.value; - calcEfficiencyAfterBoil(); - calcFermentables(); - calcIBUs(); - }); $('#est_mash_sg,#est_pre_sg,#est_og3').jqxNumberInput(Show3wat); $('#brew_mash_efficiency').jqxNumberInput(Show1dec); $('#brew_preboil_volume').on('valueChanged', function(event) { @@ -4398,19 +3551,8 @@ calcEfficiencyBeforeBoil(); }); $('#brew_preboil_volume,#brew_aboil_volume').jqxNumberInput(Spin1dec); - $('#brew_aboil_volume').on('valueChanged', function(event) { - dataRecord.brew_aboil_volume = event.args.value; - calcEfficiencyAfterBoil(); - calcFermentables(); - calcIBUs(); - }); $('#ketel_volume').jqxNumberInput(Show1dec); $('#ketel_cm').jqxNumberInput(Spin1dec); - $('#ketel_cm').on('change', function(event) { - k_cm = parseFloat(event.args.value); - k_vol = kettle_vol(k_cm, dataRecord.eq_kettle_volume, dataRecord.eq_kettle_height); - $('#ketel_volume').val(k_vol); - }); $('#volumeReady').jqxButton({ template: 'success', width: '90px', theme: theme }); $('#volumeReady').click(function() { /* Is it pre or after boil */ @@ -4500,14 +3642,6 @@ $('#primary_end_sg,#secondary_end_sg').jqxNumberInput(SGopts); $('#primary_end_date,#secondary_end_date').jqxDateTimeInput(Dateopts); - $('#primary_end_date').on('close', function(event) { - dataRecord.primary_end_date = $('#primary_end_date').val(); - calcStage(); - }); - $('#secondary_end_date').on('close', function(event) { - dataRecord.secondary_end_date = $('#secondary_end_date').val(); - calcStage(); - }); $('#primary_start_temp,#primary_max_temp,#primary_end_temp,#secondary_temp,#tertiary_temp').jqxNumberInput(YeastT); $('#fg').jqxNumberInput(Spin3dec); $('#brew_fermenter_sg2,#est_fg3').jqxNumberInput(Show3dec); @@ -4543,10 +3677,6 @@ $('#bottle_priming_water,#keg_priming_water').jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' }); $('#bottle_pressure').jqxTooltip({ content: 'De maximaal te verwachten druk tijdens het hergisten.' }); $('#package_date').jqxDateTimeInput(Dateopts); - $('#package_date').on('close', function(event) { - dataRecord.package_date = $('#package_date').val(); - calcStage(); - }); $('#package_infuse_amount').jqxNumberInput(Spin3dec); $('#package_infuse_notes').jqxInput({ theme: theme, width: 640, height: 23 }); $('#package_abv').jqxNumberInput(Show2dec); @@ -4605,7 +3735,7 @@ } else { $('#fermentableGrid').jqxGrid('addrow', null, row); } - calcCarbonation(); +// calcCarbonation(); } }); $('#keg_priming_sugar').jqxDropDownList({ @@ -4658,7 +3788,7 @@ } else { $('#fermentableGrid').jqxGrid('addrow', null, row); } - calcCarbonation(); +// calcCarbonation(); } }); $('#bottle_priming_water,#keg_priming_water').jqxNumberInput(Spin3dec); diff -r 26ffc2fb0eaf -r 8b87ad5bd3c3 www/js/rec_view.js --- a/www/js/rec_view.js Fri Aug 05 20:11:11 2022 +0200 +++ b/www/js/rec_view.js Sat Aug 06 18:44:22 2022 +0200 @@ -1413,7 +1413,7 @@ } //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa); bicarbonate = wg_bicarbonate - protonDeficit * frac / liters; - total_alkalinity = RA * 50 / 61; + total_alkalinity = bicarbonate * 50 / 61; ph = pHa; $('#wb_ph').val(Round(ph, 2)); $('#est_mash_ph').val(Round(ph, 2)); diff -r 26ffc2fb0eaf -r 8b87ad5bd3c3 www/prod_edit.php --- a/www/prod_edit.php Fri Aug 05 20:11:11 2022 +0200 +++ b/www/prod_edit.php Sat Aug 06 18:44:22 2022 +0200 @@ -356,9 +356,7 @@ - - - + @@ -376,26 +374,13 @@
Maischchema:Kies ander schema:
Volume van de maisch L:
- - - - - - - + + + - + - - - - + + + + + + + - + - - - - + + + + + + + - + + + + + - - - + + - + - - - + + + + + + + - - - - - + + + + + + + - - - - + + + + + - - - - + + + + +
- - - - - - - - - -
Bitterheidsindex:
Richtgetal SO4:Cl:
Huidig SO4:Cl:
-
+
- + + @@ -404,10 +389,13 @@ - + + + - + + @@ -416,10 +404,13 @@ - + + + - + + @@ -428,10 +419,13 @@ - + + + - + + @@ -440,10 +434,13 @@ - + + + - + + @@ -452,10 +449,13 @@ - + + + - + + @@ -464,80 +464,102 @@ - - + + + + - - - - - - - - - + + + + + + + + + + + +
Water overzicht
Water profielWater profielSpoel Volume Ca MgNa Cl SO4pHpHHardheidRA
Gemengd water:Gemengd water:
Behandeld water:Behandeld maisch water:
Resultaat:Resultaat:
Behandeld spoelwater:
BrouwzoutenMaischwater pHSpoelwaterBrouwzoutenSpoelwater
Calciumchloride (CaCl2) gr:CaCl2 gr:
Maish pH:
Spoelwater voorraad L:
Bitterheidsindex:
Auto bereken:
Gips (CaSO4) gr:CaSO4 gr:
pH Automatisch:
Spoelwater °C:
Richtgetal SO4:Cl:
Gewenst maish pH:
Epsom zout (MgSO4) gr:MgSO4 gr:
Huidig SO4:Cl:
Aanzuren met:
Spoelwater bron:
Keukenzout (NaCl) gr:NaCl gr:
Spoelwater pH:
Voor koken pH:
Zuur hoeveelheid:
Magnesiumchloride (MgCl2) gr:
Aanzuren met:
MgCl2 gr:
Gewenst spoel pH:
Baksoda (NaHCO3) gr:
Sterkte %:NaHCO3 gr:
Aanzuren met:
Kalk (CaCO3) gr:
Benodigd:CaCO3 gr:
Zuur hoeveelheid:
@@ -913,61 +935,6 @@ -
-
Wijzig maisch stap detail.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Stap naam:
Stap type:
Start temperatuur °C:
Eind temperatuur °C:
Stap tijd minuten:
Opwarm tijd minuten:
Infusie liters:
Infusie temperatuur:
Gemeten pH:
Gemeten SG:
Afgelezen °Brix RI:
- -
-
-
-
Bereken volume in de ketel