Tab brouwdag automatische berekening rendement voor en na het koken. Bij import worden de kook volumes omgerekend naar 100 graden.

Wed, 06 Feb 2019 19:29:45 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Wed, 06 Feb 2019 19:29:45 +0100
changeset 246
8580a08cbaa7
parent 245
3649c3d31d15
child 247
792b5ba77a1f

Tab brouwdag automatische berekening rendement voor en na het koken. Bij import worden de kook volumes omgerekend naar 100 graden.

www/import/from_brouwhulp.php file | annotate | diff | comparison | revisions
www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/prod_edit.php file | annotate | diff | comparison | revisions
--- a/www/import/from_brouwhulp.php	Wed Feb 06 15:14:41 2019 +0100
+++ b/www/import/from_brouwhulp.php	Wed Feb 06 19:29:45 2019 +0100
@@ -1617,13 +1617,13 @@
 			if ($recipe->VOLUME_HLT)
 				$sql .= "', brew_sparge_volume='" . floatval($recipe->VOLUME_HLT);
 			if ($recipe->VOLUME_BEFORE_BOIL)
-				$sql .= "', brew_preboil_volume='" . floatval($recipe->VOLUME_BEFORE_BOIL);
+				$sql .= "', brew_preboil_volume='" . sprintf("%.5f",floatval($recipe->VOLUME_BEFORE_BOIL) * 1.04);
 			if (floatval($recipe->OG_BEFORE_BOIL) != 1.0)
 				$sql .= "', brew_preboil_sg='" . floatval($recipe->OG_BEFORE_BOIL);
 			if ($recipe->PH_BEFORE_BOIL)
 				$sql .= "', brew_preboil_ph='" . floatval($recipe->PH_BEFORE_BOIL);
 			if ($recipe->VOLUME_AFTER_BOIL)
-				$sql .= "', brew_aboil_volume='" . floatval($recipe->VOLUME_AFTER_BOIL);
+				$sql .= "', brew_aboil_volume='" . sprintf("%.5f",floatval($recipe->VOLUME_AFTER_BOIL) * 1.04);
 			$sql .= "', brew_aboil_sg='" . floatval($recipe->OG);
 			if ($recipe->PH_AFTER_BOIL)
 				$sql .= "', brew_aboil_ph='" . floatval($recipe->PH_AFTER_BOIL);
--- a/www/js/prod_edit.js	Wed Feb 06 15:14:41 2019 +0100
+++ b/www/js/prod_edit.js	Wed Feb 06 19:29:45 2019 +0100
@@ -300,23 +300,20 @@
 		var rows = $('#mashGrid').jqxGrid('getrows');
 		for (var i = 0; i < rows.length; i++) {
 			var row = rows[i];
-//			console.log("step " + i + " " + row.step_name + " " + row.step_type);
 			if (row.step_type == 0)	// Infusion
 				mvol += parseFloat(row.step_infuse_amount);
 		}
 		if (mvol > 0) {
-//			console.log("mash volume: " + mvol);
 			var rows = $('#fermentableGrid').jqxGrid('getrows');
 			for (var i = 0; i < rows.length; i++) {
 			        var row = rows[i];
 				if (row.f_added == 0) {	// Mash
 					var d = row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100);
 					mvol += row.f_amount * row.f_moisture / 100;
-					gs += my_grain_absorbtion * row.f_amount;
+//  TODO: where do I need this		gs += my_grain_absorbtion * row.f_amount;
 					s += d;
 				}
 			}
-//			console.log("mash volume: " + mvol + "  gs: " + gs + "  s: " + s);
 			var v = s / sugardensity + mvol;
 			s = 1000 * s / (v * 10); //deg. Plato
 			est_mash_sg = plato_to_sg(s);
@@ -336,6 +333,58 @@
 			$("#brew_mash_efficiency").val(0);
 	};
 
+	function calcEfficiencyBeforeBoil() {
+		var	m = 0;
+		var	rows = {};
+		if (!(rows = $('#fermentableGrid').jqxGrid('getrows'))) {
+			return;	// grid not yet loaded.
+		}
+		for (var i = 0; i < rows.length; i++) {
+			var row = rows[i];
+			if (row.f_added == 0) { // Mash
+				m += row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100);
+			}
+		}
+		var tot = sg_to_plato(dataRecord.brew_preboil_sg) * (dataRecord.brew_preboil_volume / 1.04) * dataRecord.brew_preboil_sg * 10 / 1000;
+		if (m > 0)
+			var result = Math.round((tot / m * 100) * 10) / 10;
+		else
+			var result = 0;
+		if (result < 0)
+			result = 0;
+		//console.log("calcEfficiencyBeforeBoil(): "+result);
+		$("#brew_preboil_efficiency").val(result);
+	}
+
+	function calcEfficiencyAfterBoil() {
+		var	m = 0;	// Sugars added at mash
+		var	b = 0;	// Sugars added at boil
+		var	rows = {};
+		if (!(rows = $('#fermentableGrid').jqxGrid('getrows'))) {
+			return; // grid not yet loaded.
+		}
+		for (var i = 0; i < rows.length; i++) {
+			var row = rows[i];
+			if (row.f_added == 0) { // Mash
+				m += row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100);
+			} else if (row.f_added == 1) { // Boil
+				b += row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100);
+			}
+		}
+		var tot = sg_to_plato(dataRecord.brew_aboil_sg) * (dataRecord.brew_aboil_volume / 1.04) * dataRecord.brew_aboil_sg * 10 / 1000;
+		tot -= b;	// total sugars in wort  minus added sugars.
+		if (m > 0)
+			var result = Math.round((tot / m * 100) * 10) / 10;
+		else
+			var result = 0;
+		if (result < 0)
+			result = 0;
+		//console.log("calcEfficiencyAfterBoil(): "+result);
+		dataRecord.brew_aboil_efficiency = result;
+		$("#brew_aboil_efficiency").val(result);
+
+	}
+
 	function GetBUGU() {
 		var gu = (dataRecord.est_og - 1) * 1000;
 		if (gu > 0)
@@ -1189,6 +1238,8 @@
 
 		calcSGendMash();
 		calcMashEfficiency();
+		calcEfficiencyBeforeBoil();
+		calcEfficiencyAfterBoil();
 
 		$("#calc_acid").on('checked', function (event) {
 			dataRecord.calc_acid = true;
@@ -3899,20 +3950,24 @@
 	$("#est_mash_sg").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 3 });
 	$("#brew_preboil_sg").jqxTooltip({ content: 'Het gemeten SG in de kookketel na het spoelen en voor het koken.' });
 	$("#brew_preboil_sg").jqxNumberInput( SGopts );
+	$("#brew_preboil_sg").on('valueChanged', function (event) { dataRecord.brew_preboil_sg = event.args.value; calcEfficiencyBeforeBoil() });
 	$("#est_pre_sg").jqxTooltip({ content: 'Het berekende SG in de kookketel na het spoelen en voor het koken.' });
 	$("#est_pre_sg").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 3 });
 	$("#brew_aboil_sg").jqxTooltip({ content: 'Het gemeten SG in de kookketel na het koken.' });
 	$("#brew_aboil_sg").jqxNumberInput( SGopts );
+	$("#brew_aboil_sg").on('valueChanged', function (event) { dataRecord.brew_aboil_sg = event.args.value; calcEfficiencyAfterBoil() });
 	$("#est_og3").jqxTooltip({ content: 'Het gewenste SG in de kookketel na het koken.' });
 	$("#est_og3").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 70, height: 23, decimalDigits: 3, readOnly: true });
 	$("#brew_mash_efficiency").jqxTooltip({ content: 'Het behaalde maisch rendement.' });
 	$("#brew_mash_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 1 });
 	$("#brew_preboil_volume").jqxTooltip({ content: 'Het volume van het wort voor het koken.' });
 	$("#brew_preboil_volume").jqxNumberInput( Spin1dec );
+	$("#brew_preboil_volume").on('valueChanged', function (event) { dataRecord.brew_preboil_volume = event.args.value; calcEfficiencyBeforeBoil() });
 	$("#est_pre_vol").jqxTooltip({ content: 'Het berekende volume van het wort voor het koken.' });
 	$("#est_pre_vol").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 });
 	$("#brew_aboil_volume").jqxTooltip({ content: 'Het volume van het wort na het koken.' });
 	$("#brew_aboil_volume").jqxNumberInput( Spin1dec );
+	$("#brew_aboil_volume").on('valueChanged', function (event) { dataRecord.brew_aboil_volume = event.args.value; calcEfficiencyAfterBoil() });
 	$("#est_a_vol").jqxTooltip({ content: 'Het gewenste volume na het koken.' });
 	$("#est_a_vol").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 });
 	$("#brew_preboil_efficiency").jqxTooltip({ content: 'Het berekende rendement voor het koken.' });
--- a/www/prod_edit.php	Wed Feb 06 15:14:41 2019 +0100
+++ b/www/prod_edit.php	Wed Feb 06 19:29:45 2019 +0100
@@ -437,32 +437,32 @@
       <tr>
        <td style="vertical-align: top; float: right;">Maisch pH:</td>
        <td><div style="float: left;" id="brew_mash_ph"></div><div style="float: left; margin-left: 15px;" id="est_mash_ph"></div></td>
-       <td style="vertical-align: top; float: right;">pH voor koken:</td>
+       <td style="vertical-align: top; float: right;">Voor koken pH:</td>
        <td><div id="brew_preboil_ph"></div></td>
-       <td style="vertical-align: top; float: right;">pH na koken:</td>
+       <td style="vertical-align: top; float: right;">Na koken pH:</td>
        <td><div id="brew_aboil_ph"></div></td>
       </tr>
       <tr>
        <td style="vertical-align: top; float: right;">Maisch SG:</td>
        <td><div style="float: left;" id="brew_mash_sg"></div><div style="float: left; margin-left: 15px;" id="est_mash_sg"></div></td>
-       <td style="vertical-align: top; float: right;">SG voor koken:</td>
+       <td style="vertical-align: top; float: right;">Voor koken SG:</td>
        <td><div style="float: left;" id="brew_preboil_sg"></div><div style="float: left; margin-left: 15px;" id="est_pre_sg"></div></td>
-       <td style="vertical-align: top; float: right;">SG na koken:</td>
+       <td style="vertical-align: top; float: right;">Na koken SG:</td>
        <td><div style="float: left;" id="brew_aboil_sg"></div><div style="float: left; margin-left: 15px;" id="est_og3"></div></td>
       </tr>
       <tr>
-       <td style="vertical-align: top; float: right;">Maisch rendement:</td>
+       <td style="vertical-align: top; float: right;">Maisch rendement %:</td>
        <td><div id="brew_mash_efficiency"></div></td>
-       <td style="vertical-align: top; float: right;">Volume voor koken:</td>
+       <td style="vertical-align: top; float: right;">Voor koken vol@100&deg;C:</td>
        <td><div style="float: left;" id="brew_preboil_volume"></div><div style="float: left; margin-left: 15px;" id="est_pre_vol"></div></td>
-       <td style="vertical-align: top; float: right;">Volume na koken:</td>
+       <td style="vertical-align: top; float: right;">Na koken vol@100&deg;C:</td>
        <td><div style="float: left;" id="brew_aboil_volume"></div><div style="float: left; margin-left: 15px;" id="est_a_vol"></div></td>
       </tr>
       <tr>
        <td colspan="2"> </td>
-       <td style="vertical-align: top; float: right;">Rendement voor koken:</td>
+       <td style="vertical-align: top; float: right;">Voor koken rendement %:</td>
        <td><div id="brew_preboil_efficiency"></div></td>
-       <td style="vertical-align: top; float: right;">Rendement na koken:</td>
+       <td style="vertical-align: top; float: right;">Na koken rendement %:</td>
        <td><div id="brew_aboil_efficiency"></div></td>
       </tr>
       <tr>
@@ -470,36 +470,36 @@
        <td colspan="4"> </td>
       </tr>
       <tr>
-       <td style="vertical-align: top; float: right;">Spoelwater temperatuur:</td>
+       <td style="vertical-align: top; float: right;">Spoelwater &deg;C:</td>
        <td><div id="brew_sparge_temperature"></div></td>
        <th style="text-align: center;" colspan="4">Koelen en whirlpoolen</th>
       </tr>
       <tr>
-       <td style="vertical-align: top; float: right;">Spoelwater volume:</td>
+       <td style="vertical-align: top; float: right;">Spoelwater liters:</td>
        <td><div id="brew_sparge_volume"></div></td>
-       <td style="vertical-align: top; float: right;">Whirlpool 85..100&deg;C:</td>
+       <td style="vertical-align: top; float: right;">Whirlpool 85..100&deg;C min:</td>
        <td><div id="brew_whirlpool9"></div></td>
-       <td style="vertical-align: top; float: right;">Koelen tot:</td>
+       <td style="vertical-align: top; float: right;">Koelen tot &deg;C:</td>
        <td><div id="brew_cooling_to"></div></td>
       </tr>
       <tr>
        <td style="vertical-align: top; float: right;">Spoelwater pH:</td>
        <td><div id="brew_sparge_ph"></div></td>
-       <td style="vertical-align: top; float: right;">Whirlpool 72..79&deg;C:</td>
+       <td style="vertical-align: top; float: right;">Whirlpool 72..79&deg;C min:</td>
        <td><div id="brew_whirlpool7"></div></td>
        <td style="vertical-align: top; float: right;">Koelen met:</td>
        <td><div id="brew_cooling_method"></div></td>
       </tr>
       <tr>
        <td colspan="2"></td>
-       <td style="vertical-align: top; float: right;">Whirlpool 60..66&deg;C:</td>
+       <td style="vertical-align: top; float: right;">Whirlpool 60..66&deg;C min:</td>
        <td><div id="brew_whirlpool6"></div></td>
-       <td style="vertical-align: top; float: right;">Koelen tijd:</td>
+       <td style="vertical-align: top; float: right;">Koelen minuten:</td>
        <td><div id="brew_cooling_time"></div></td>
       </tr>
       <tr>
        <th style="text-align: center;" colspan="2">Beluchten</th>
-       <td style="vertical-align: top; float: right;">Whirlpool koud:</td>
+       <td style="vertical-align: top; float: right;">Whirlpool koud min:</td>
        <td><div id="brew_whirlpool2"></div></td>
        <td colspan="2"> </td>
       </tr>

mercurial