# HG changeset patch # User Michiel Broek # Date 1551301987 -3600 # Node ID 047ead629d4aa52b43f319b7383c2f05964d4203 # Parent 307640ba6ab63deb31d9b5e1f3e1efcb84972884 Accept yeast temperature limits from thermferm via MQTT. Send yeat temperature ranges to thermferm together with the beer parameters. Store yeast temperature limits in the mon_fermenters database table. The monitor fermenters screen adjusts the temperature color ranges. diff -r 307640ba6ab6 -r 047ead629d4a README.design --- a/README.design Wed Feb 27 14:40:05 2019 +0100 +++ b/README.design Wed Feb 27 22:13:07 2019 +0100 @@ -142,8 +142,6 @@ TODO: Copieren recepten tussen products en recipes, maar ook dupliceren. Import. -Download gist temperatuur grenzen naar thermferm zodat die opgevraagd kunnen -worden door de monitor. Die kan dan de kleuren op de thermometers aanpassen. Import van ingredienten vanuit xml bestanden zoals die van brouwhulp. Export ingredienten naar xml. diff -r 307640ba6ab6 -r 047ead629d4a bmsd/bms.h --- a/bmsd/bms.h Wed Feb 27 14:40:05 2019 +0100 +++ b/bmsd/bms.h Wed Feb 27 22:13:07 2019 +0100 @@ -199,6 +199,8 @@ float profile_inittemp_high; ///< Profile init temp high float profile_inittemp_low; ///< Profile init temp low char *profile_steps; ///< Profile steps in JSON + float yeast_lo; ///< Yeast minimum temperature + float yeast_hi; ///< Yeast maximum temperature } sys_fermenter_list; diff -r 307640ba6ab6 -r 047ead629d4a bmsd/fermenters.c --- a/bmsd/fermenters.c Wed Feb 27 14:40:05 2019 +0100 +++ b/bmsd/fermenters.c Wed Feb 27 22:13:07 2019 +0100 @@ -131,6 +131,12 @@ free(fermenter->beeruuid); fermenter->beeruuid = xstrcpy((char *)json_object_get_string(val)); } + if (json_object_object_get_ex(sensor, "yeast_lo", &val)) { + fermenter->yeast_lo = json_object_get_double(val); + } + if (json_object_object_get_ex(sensor, "yeast_hi", &val)) { + fermenter->yeast_hi = json_object_get_double(val); + } } if (json_object_object_get_ex(jobj, "air", &sensor)) { if (json_object_object_get_ex(sensor, "address", &val)) { @@ -306,6 +312,8 @@ fermenter->profile_uuid = fermenter->profile_name = fermenter->profile_state = fermenter->profile_steps = NULL; fermenter->profile_percent = 0; fermenter->profile_inittemp_high = fermenter->profile_inittemp_low = 0.0; + fermenter->yeast_lo = 12; + fermenter->yeast_hi = 24; } } json_object_put(jobj); diff -r 307640ba6ab6 -r 047ead629d4a bmsd/mysql.c --- a/bmsd/mysql.c Wed Feb 27 14:40:05 2019 +0100 +++ b/bmsd/mysql.c Wed Feb 27 22:13:07 2019 +0100 @@ -205,6 +205,8 @@ fermenter->profile_steps = xstrcpy(row[42]); } fermenter->stage = xstrcpy(row[43]); + fermenter->yeast_lo = atof(row[45]); + fermenter->yeast_hi = atof(row[46]); if (fermenters == NULL) { fermenters = fermenter; @@ -418,7 +420,8 @@ "psu_address='%s', psu_state='%d', " \ "mode='%s', alarm='%d', setpoint_high='%.3f', setpoint_low='%.3f', " \ "profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \ - "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s'", + "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s', " \ + "yeast_lo='%.1f', yeast_hi='%.1f'", fermenter->uuid, fermenter->alias, fermenter->node, fermenter->online ? "Y":"N", fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "", fermenter->beeruuid ? fermenter->beeruuid : "", @@ -435,7 +438,7 @@ fermenter->profile_uuid ? fermenter->profile_uuid : "", fermenter->profile_name ? fermenter->profile_name : "", fermenter->profile_state ? fermenter->profile_state : "", fermenter->profile_percent, fermenter->profile_inittemp_high, fermenter->profile_inittemp_low, - fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage); + fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->yeast_lo, fermenter->yeast_hi); // printf("%s\n", query); @@ -466,7 +469,8 @@ "psu_address='%s', psu_state='%d', " \ "mode='%s', alarm='%d', setpoint_high='%.3f', setpoint_low='%.3f', " \ "profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \ - "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s' WHERE uuid='%s'", + "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s', " \ + "yeast_lo='%.1f', yeast_hi='%.1f' WHERE uuid='%s'", fermenter->online ? "Y":"N", fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "", fermenter->beeruuid ? fermenter->beeruuid : "", fermenter->air_address ? fermenter->air_address : "", fermenter->air_state ? fermenter->air_state : "", fermenter->air_temperature, @@ -482,7 +486,7 @@ fermenter->profile_uuid ? fermenter->profile_uuid : "", fermenter->profile_name ? fermenter->profile_name : "", fermenter->profile_state ? fermenter->profile_state : "", fermenter->profile_percent, fermenter->profile_inittemp_high, fermenter->profile_inittemp_low, - fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->uuid); + fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->yeast_lo, fermenter->yeast_hi, fermenter->uuid); // printf("%s\n", query); diff -r 307640ba6ab6 -r 047ead629d4a configure --- a/configure Wed Feb 27 14:40:05 2019 +0100 +++ b/configure Wed Feb 27 22:13:07 2019 +0100 @@ -2031,7 +2031,7 @@ PACKAGE="bms" -VERSION="0.1.0" +VERSION="0.1.1" COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved" CYEARS="2016-2019" diff -r 307640ba6ab6 -r 047ead629d4a configure.ac --- a/configure.ac Wed Feb 27 14:40:05 2019 +0100 +++ b/configure.ac Wed Feb 27 22:13:07 2019 +0100 @@ -8,7 +8,7 @@ dnl General settings dnl After changeing the version number, run autoconf! PACKAGE="bms" -VERSION="0.1.0" +VERSION="0.1.1" COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved" CYEARS="2016-2019" AC_SUBST(PACKAGE) diff -r 307640ba6ab6 -r 047ead629d4a www/includes/db_product.php --- a/www/includes/db_product.php Wed Feb 27 14:40:05 2019 +0100 +++ b/www/includes/db_product.php Wed Feb 27 22:13:07 2019 +0100 @@ -502,15 +502,28 @@ * SELECT, produce a list of products that can be fermented. */ if (isset($_GET['select']) && ($_GET['select'] == "ferment")) { - $query = "SELECT code,name,uuid,stage FROM products WHERE "; + $query = "SELECT code,name,uuid,stage,json_yeasts FROM products WHERE "; $query .= "stage='1' OR stage='2' OR stage='3' OR stage='4' OR stage='5' OR stage='6' ORDER BY code;"; $result = mysqli_query($connect, $query) or die("SQL Error 1: " . mysqli_error($connect)); while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { + $yl = 0; + $yh = 40; + $yeasts = json_decode($row['json_yeasts'], true); + for ($i = 0; $i < count($yeasts); $i++) { + if ($yeasts[$i]['y_use'] == 0) { // Primary + if (floatval($yeasts[$i]['y_min_temperature']) > $yl) + $yl = floatval($yeasts[$i]['y_min_temperature']); + if (floatval($yeasts[$i]['y_max_temperature']) < $yh) + $yh = floatval($yeasts[$i]['y_max_temperature']); + } + } $brews[] = array( 'code' => $row['code'], 'name' => $row['name'], 'uuid' => $row['uuid'], - 'stage' => $row['stage'] + 'stage' => $row['stage'], + 'yeast_lo' => $yl, + 'yeast_hi' => $yh ); } header("Content-type: application/json"); diff -r 307640ba6ab6 -r 047ead629d4a www/js/mon_fermenter.js --- a/www/js/mon_fermenter.js Wed Feb 27 14:40:05 2019 +0100 +++ b/www/js/mon_fermenter.js Wed Feb 27 22:13:07 2019 +0100 @@ -61,7 +61,9 @@ { name: 'code', type: 'string' }, { name: 'name', type: 'string' }, { name: 'uuid', type: 'string' }, - { name: 'stage', type: 'string' }, + { name: 'stage', type: 'int' }, + { name: 'yeast_lo', type: 'float' }, + { name: 'yeast_hi', type: 'float' } ], id: 'code', url: "includes/db_product.php?select=ferment" @@ -73,7 +75,9 @@ blank['code'] = "Free"; // Will override this later. blank['name'] = 'Dummy'; blank['uuid'] = '66ecccbf-e942-4a35-af49-8b02314561a5'; - blank['stage'] = "Ready"; + blank['stage'] = 10; + blank['yeast_lo'] = 12.0; + blank['yeast_hi'] = 24.0; data.push(blank); for (var i = 0; i < records.length; i++) { var row = records[i]; @@ -249,11 +253,11 @@ }); } - function sendProduct(code, name, uuid) { + function sendProduct(code, name, uuid, yeast_lo, yeast_hi) { - console.log("sendProduct("+code+", "+name+", "+uuid+")"); + console.log("sendProduct("+code+", "+name+", "+uuid+", "+yeast_lo+", "+yeast_hi+")"); var data = 'node='+record.node+'&alias='+record.alias+'&payload='; - data += '{"product":{"code":"'+code+'","name":"'+name+'","uuid":"'+uuid+'"}}'; + data += '{"product":{"code":"'+code+'","name":"'+name+'","uuid":"'+uuid+'","yeast_lo":'+yeast_lo+',"yeast_hi":'+yeast_hi+'}}'; $.ajax({ url: "cmd_fermenter.php", data: data, @@ -292,7 +296,7 @@ { name: 'uuid', type: 'string' }, { name: 'alias', type: 'string' }, { name: 'node', type: 'string' }, - { name: 'online', type: 'bool' }, + { name: 'online', type: 'int' }, { name: 'beercode', type: 'string' }, { name: 'beername', type: 'string' }, { name: 'air_state', type: 'string' }, @@ -325,7 +329,10 @@ { name: 'profile_inittemp_high', type: 'float' }, { name: 'profile_inittemp_low', type: 'float' }, { name: 'profile_steps', type: 'string' }, - { name: 'stage', type: 'string' } + { name: 'stage', type: 'string' }, + { name: 'beeruuid', type: 'string' }, + { name: 'yeast_lo', type: 'float' }, + { name: 'yeast_hi', type: 'float' } ], id: 'record', url: url @@ -459,14 +466,22 @@ $("#status_profile").html(''); } - $("#gaugeContainer_air").jqxGauge( { caption: { value: 'Air: '+record.air_temperature.toFixed(3) }}); + yl = record.yeast_lo; + yh = record.yeast_hi; + var range = { ranges: [{ startValue: 0, endValue: yl, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 }, + { startValue: yl, endValue: yh, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 }, + { startValue: yh, endValue: 40, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }] }; + $("#gaugeContainer_air").jqxGauge( range ); + $("#gaugeContainer_beer").jqxGauge( range ); + + $("#gaugeContainer_air").jqxGauge({ caption: { value: 'Air: '+record.air_temperature.toFixed(3) }}); $('#gaugeContainer_air').jqxGauge({ value: record.air_temperature }); if (record.air_state == "OK") { $("#gaugeContainer_air").jqxGauge({ disabled: false }); } else { $("#gaugeContainer_air").jqxGauge({ disabled: true }); } - $("#gaugeContainer_beer").jqxGauge( { caption: { value: 'Beer: '+record.beer_temperature.toFixed(3) }}); + $("#gaugeContainer_beer").jqxGauge({ caption: { value: 'Beer: '+record.beer_temperature.toFixed(3) }}); $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature }); if (record.beer_state == "OK") { $("#gaugeContainer_beer").jqxGauge({ disabled: false }); @@ -497,7 +512,7 @@ skip = true; } if (newProduct) { - sendProduct(record.beercode, record.beername, record.beeruuid); + sendProduct(record.beercode, record.beername, record.beeruuid, record.yeast_lo, record.yeast_hi); newProduct = false; skip = true; } @@ -537,6 +552,8 @@ record.beercode = datarecord.code; record.beername = datarecord.name; record.beeruuid = datarecord.uuid; + record.yeast_lo = datarecord.yeast_lo; + record.yeast_hi = datarecord.yeast_hi; newProduct = true; } }); diff -r 307640ba6ab6 -r 047ead629d4a www/upl_brew.php --- a/www/upl_brew.php Wed Feb 27 14:40:05 2019 +0100 +++ b/www/upl_brew.php Wed Feb 27 22:13:07 2019 +0100 @@ -29,7 +29,7 @@ if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "Verwerken bestand ". basename( $_FILES["fileToUpload"]["name"]). "
"; } else { - echo "Fout 4: er gieng iets fout met de upload."; + echo "Fout 4: er ging iets fout met de upload."; exit; }