www/rec_forum.php

Mon, 18 May 2020 11:00:59 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 18 May 2020 11:00:59 +0200
changeset 679
48f8f3fce7c0
parent 666
029e65ca3678
permissions
-rw-r--r--

Added reconnecting-websocket.js to automatic reconnect the websocket if the connection is lost. Usefull for mobile devices that go to sleep after a while. Changed mon_fermenters to use websockets instead of polling. Fixed wrong temperature color ranges on the fermenter monior. Increased the websocket receive buffer to 2048. In cannot overflow, but larger messages are chunked and the application does not handle these split messages. Needs termferm 0.9.9 or newer.

<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/global.inc.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/constants.php');


$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
if (! $link) {
	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
}
if (! mysqli_set_charset($link, "utf8" )) {
	echo "error";
	return 1;
}

setlocale ( LC_ALL, 'nl_NL.UTF-8');
$record = $_GET["record"];
$result = mysqli_query($link, "SELECT * FROM recipes WHERE record='".$record."'");
$row = mysqli_fetch_array($result);

$preboil_sg = 0;
date_default_timezone_set('Europe/Amsterdam');
$prdate = date(DATE_RFC2822);

/*
 * Generate the output in a string.
 */
$tabus = '[tabular]';
$tabue = '[/tabular]';
$heads = '[head]';
$heade = '[/head]';
$rows  = '[row]';
$rowe  = '[/row]';
$datas = '[data]';
$datae = '[/data]';

$memo  = "[u][b]BMS v".$my_version." - Datum export: ".$prdate.'[/b][/u]'.PHP_EOL;
$memo .= PHP_EOL;
$memo .= PHP_EOL;
$memo .= '[u][b]Basis[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Omschrijving'.$heade.$heads.'Waarde'.$heade.PHP_EOL;
$memo .= $rows.$datas.'Bier naam'.$datae.$datas.$row['name'].$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Bier stijl'.$datae.$datas.$row['st_name'].$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Recept type'.$datae.$datas.$recipetype[$row['type']].$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Batch grootte'.$datae.$datas.$row['batch_size'].' liter'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Kooktijd'.$datae.$datas.$row['boil_time'].' minuten'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Brouwzaal rendement'.$datae.$datas.$row['efficiency'].' %'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Geschatte begin densiteit'.$datae.$datas.sprintf("%.3f",$row['est_og']).' SG/ '.sprintf("%.1f", sg_to_plato($row['est_og'])).'°P'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Geschatte eind densiteit'.$datae.$datas.sprintf("%.3f",$row['est_fg']).' SG/ '.sprintf("%.1f", sg_to_plato($row['est_fg'])).'°P'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Geschat alcohol'.$datae.$datas.sprintf("%.1f",$row['est_abv']).'% vol'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Kleur ('.$colormethod[$row['color_method']].')'.$datae.$datas.$row['est_color'].' EBC'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Bitterheid ('.$ibumethod[$row['ibu_method']].')'.$datae.$datas.$row['est_ibu'].' IBU'.$datae.$rowe.PHP_EOL;
if ($row['divide_parts'])
    $memo .= $rows.$datas.'Split batch (' .$splitat[$row['divide_type']].')'.$datae.$datas.($row['divide_part'] + 1)." van ".($row['divide_parts'] + 1).$datae.$rowe.PHP_EOL;
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$sugarsm = 0;
$grainabsorbtion = 0;
$mashwater = 0;

$memo .= '[u][b]Vergistbare ingrediënten[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Mout, granen en suikers'.$heade.$heads.'EBC'. $heade.$heads.'Gewicht kg'.$heade.$heads.'%'.$heade.$heads.'Gebruik tijdens'.$heade.PHP_EOL;

$arr = json_decode($row['json_fermentables'], true);
foreach($arr as $item) {
	$name = $item['f_name']." (".$item['f_supplier'].")";
	$amount   = floatval($item['f_amount']);
	$d = $amount * (floatval($item['f_yield']) / 100) * (1 - floatval($item['f_moisture']) / 100);
        if ($item['f_added']  == 0) {
        	$d = floatval($row['efficiency']) / 100 * $d;
                $sugarsm += $d;
		$grainabsorbtion += $item['f_amount'];
        }
	$pct = '';
        if ($item['f_added']  < 4)
                $pct = sprintf("%.1f", floatval($item['f_percentage']));

	$memo .= $rows.$datas.$name.$datae.$datas.sprintf("%.0f", floatval($item['f_color'])).$datae.$datas;
        $memo .= sprintf("%.3f", $amount).$datae.$datas.$pct.$datae.$datas;
        $memo .= $added[$item['f_added']].$datae.$rowe .PHP_EOL;
}
$preboil_sg = estimate_sg($sugarsm, floatval($row['boil_size']));
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$memo .= '[u][b]Hop[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Hop'.$heade.$heads.'Vorm'.$heade.$heads.'Alpha'.$heade.$heads.'IBU'.$heade.$heads.'Gram'.$heade.$heads.'Toevoegen moment'.$heade.PHP_EOL;

$arr = json_decode($row['json_hops'], true);
foreach($arr as $item) {
	$name   = $item['h_name']." (".$item['h_origin'].")";
	$amount = floatval($item['h_amount']) * 1000;
	$time   = floatval($item['h_time']);
        $alpha  = floatval($item['h_alpha']);
	$ibu    = calc_IBU($item['h_useat'], $item['h_form'], $preboil_sg, floatval($row['batch_size']), $amount, $time, $alpha,
		$row['ibu_method'], $row['brew_whirlpool9'], $row['brew_whirlpool7'], $row['brew_whirlpool6']);
	$moment = $hopuse[$item['h_useat']];
        if (($item['h_useat'] == 2) || ($item['h_useat'] == 4)) {    // Boil or Whirlpool
        	$moment = $hopuse[$item['h_useat']].' '.$time." minuten";
	} else if ($item['h_useat'] == 5) {	// Dryhop
		$moment = $hopuse[$item['h_useat']].' '.sprintf("%.0f", $time / 1440).' dagen';
        }

	$memo .= $rows.$datas.$name.$datae.$datas.$hopform[$item['h_form']].$datae.$datas.sprintf("%.1f", $alpha).'%'.$datae.$datas;
        $memo .= sprintf("%.1f", $ibu).$datae.$datas.sprintf("%.1f", $amount).$datae.$datas.$moment.$datae.$rowe.PHP_EOL;
}
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$memo .= '[u][b]Diversen[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Specerij, kruid, brouwzout'.$heade.$heads.'Type grondstof'.$heade.$heads.'Gebruik tijdens'.$heade.$heads.'Hoeveel'.$heade.PHP_EOL;

$arr = json_decode($row['json_miscs'], true);
foreach($arr as $item) {
	$use_use = $item['m_use_use'];
	$time    = floatval($item['m_time']);

	if ($use_use == 2)      // Boil
        	$gebruik = sprintf("%s %d min",$miscuse[$use_use],$time);
        else
        	$gebruik = $miscuse[$use_use];
	$hoeveel = sprintf("%.2f %s",floatval($item['m_amount']) * 1000,$item['m_amount_is_weight'] ? "gr":"ml");

	$memo .= $rows.$datas.$item['m_name'].$datae.$datas.$misctype[$item['m_type']].$datae.$datas;
        $memo .= $gebruik.$datae.$datas.$hoeveel.$datae.$rowe.PHP_EOL;
}
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$memo .= '[u][b]Gist[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Gistlab en code'.$heade.$heads.'Omschrijving'.$heade.$heads.'Gebruik'.$heade.$heads.'Vorm'.$heade.$heads.'Hoeveel'.$heade.PHP_EOL;

$arr = json_decode($row['json_yeasts'], true);
foreach($arr as $item) {
	$product = $item['y_laboratory']." ".$item['y_product_id'];

	if ($item['y_form'] == 0)       // Liquid
                $amount = sprintf("%.0f",floatval($item['y_amount']))." pak";
        else if ($item['y_form'] == 1 || $item['y_form'] == 6)  // Dry
                $amount = sprintf("%.1f",floatval($item['y_amount'])*1000)." gr";
        else
                $amount = sprintf("%.0f",floatval($item['y_amount'])*1000)." ml";

	$memo .= $rows.$datas.$product.$datae.$datas.$item['y_name'].$datae.$datas.$yeastuse[$item['y_use']].$datae.$datas;
        $memo .= $yeastform[$item['y_form']].$datae.$datas.$amount.$datae.$rowe.PHP_EOL;
}
$memo .= $tabue.PHP_EOL;
if ($row['starter_enable'] && $row['prop1_volume']) {
	$sv = 0;
	for ($i = 1; $i < 5; $i++) {
		$pv = "prop".$i."_volume";
		if (floatval($row[$pv]) && (floatval($row[$pv]) > $sv)) {
			$sv = floatval($row[$pv]);
		}
	}
	$memo .= "Maak een giststarter van ".sprintf("%.1f", $sv)." liter.".PHP_EOL;
}
$memo .= PHP_EOL;

if ($row['w1_name'])
	$mashwater += floatval($row['w1_amount']);
if ($row['w2_name'])
	$mashwater += floatval($row['w2_amount']);

$memo .= '[u][b]Maischschema[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Maisch stap'.$heade.$heads.'Stap type'.$heade.$heads.'Temperatuur'.$heade.$heads.'Rust tijd'.$heade.$heads.'Opwarmen tijd'.$heade.PHP_EOL;

$arr = json_decode($row['json_mashs'], true);
foreach($arr as $item) {
	
	if ($item['step_type'] == 1) {
		$stype = $mashtype[$item['step_type']];
	} else {
		$stype = $mashtype[$item['step_type']].' '.sprintf("%.1f", $item['step_infuse_amount']).' liter';
	}
	$memo .= $rows.$datas.$item['step_name'].$datae.$datas.$stype.$datae.$datas.sprintf("%.1f °C", $item['step_temp']);
        $memo .= $datae.$datas.sprintf("%.0f min.", $item['step_time']).$datae.$datas.sprintf("%.0f min.", $item['ramp_time']);
        $memo .= $datae.$rowe.PHP_EOL;
}
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$memo .= '[u][b]Brouwwater[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Omschrijving'.$heade.$heads.'Waarde'.$heade.PHP_EOL;

if ($row['w1_name'] && $row['w2_name'] && floatval($row['w2_amount']) > 0) {
        $memo .= $rows.$datas.'Maischwater 1'.$datae.$datas.sprintf("%.1f",floatval($row['w1_amount'])).' liter water '.$row['w1_name'].$datae.$rowe.PHP_EOL;
        $memo .= $rows.$datas.'Maischwater 2'.$datae.$datas.sprintf("%.1f",floatval($row['w2_amount'])).' liter water '.$row['w2_name'].$datae.$rowe.PHP_EOL;
} else {
        $memo .= $rows.$datas.'Maischwater'.$datae.$datas.sprintf("%.1f",floatval($row['w1_amount'])).' liter water '.$row['w1_name'].$datae.$rowe.PHP_EOL;
}
$memo .= $rows.$datas.'Maischwater aanzuren tot pH'.$datae.$datas.$row['mash_ph'].' pH'.$datae.$rowe.PHP_EOL;
$spoelw = ($row['boil_size'] - $mashwater + $grainabsorbtion + $row['eq_lauter_deadspace']) * 1.03;     // A small heat correction
$memo .= $rows.$datas.'Spoelwater geschat'.$datae.$datas.sprintf("%.1f",$spoelw)." liter".$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Spoelwater temperatuur'.$datae.$datas.$row['sparge_temp'].' °C'.$datae.$rowe.PHP_EOL;
$memo .= $rows.$datas.'Spoelwater aanzuren tot pH'.$datae.$datas.sprintf("%.1f",$row['sparge_ph']).' pH'.$datae.$rowe.PHP_EOL;
$memo .= $tabue.PHP_EOL;
$memo .= PHP_EOL;

$memo .= '[u][b]Waterprofiel behandeld water[/b][/u]'.PHP_EOL;
$memo .= $tabus.PHP_EOL;
$memo .= $heads.'Ca'.$heade.$heads.'Mg'.$heade.$heads.'Na'.$heade.$heads.'HCO3'.$heade.$heads.'Cl'.$heade.$heads.'SO4'.$heade.PHP_EOL;
$memo .= $rows.$datas.sprintf("%.1f",floatval($row['wb_calcium'])).$datae;
$memo .= $datas.sprintf("%.1f",floatval($row['wb_magnesium'])).$datae;
$memo .= $datas.sprintf("%.1f",floatval($row['wb_sodium'])).$datae;
$memo .= $datas.sprintf("%.1f",floatval($row['wb_total_alkalinity'])*61/50).$datae;
$memo .= $datas.sprintf("%.1f",floatval($row['wb_chloride'])).$datae;
$memo .= $datas.sprintf("%.1f",floatval($row['wb_sulfate'])).$datae.$rowe.PHP_EOL;
$memo .= $tabue.PHP_EOL;

page_header('Recept naar forum', 'rec_forum');
?>
   <script>
    // json_encode() seems to do the right thing.
    var forumstr = <?= json_encode($memo) ?>;
   </script>
   <div id="MainPanel">
    <div class="section">
     <div style="overflow: hidden; margin: 25px;"><br>
      <p>Het recept met alle gegevens staan gereed.</p>
      <p>Zodra je de "Klembord" toets gebruikt zullen deze gegevens naar het klembord gekopieerd<br>
      worden. In het scherm van het forum kun je deze gegevens vervolgens "plakken".</p>
      <p>Na het drukken van de toets wordt dit scherm gesloten.</p>
      <p><input type="button" value="Klembord" id="copytoClipboard" /></p>
     </div>
    </div>
   </div>

<?php
page_footer();
?>

mercurial