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.

Wed, 27 Feb 2019 22:13:07 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Wed, 27 Feb 2019 22:13:07 +0100
changeset 299
047ead629d4a
parent 298
307640ba6ab6
child 300
920419721942

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.

README.design file | annotate | diff | comparison | revisions
bmsd/bms.h file | annotate | diff | comparison | revisions
bmsd/fermenters.c file | annotate | diff | comparison | revisions
bmsd/mysql.c file | annotate | diff | comparison | revisions
configure file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
www/includes/db_product.php file | annotate | diff | comparison | revisions
www/js/mon_fermenter.js file | annotate | diff | comparison | revisions
www/upl_brew.php file | annotate | diff | comparison | revisions
--- 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.
 
--- 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;
 
 
--- 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);
--- 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);
 
--- 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"
 
--- 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)
--- 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");
--- 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;
 		}
 	});
--- 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"]). "<br />";
 } else {
-	echo "Fout 4: er gieng iets fout met de upload.";
+	echo "Fout 4: er ging iets fout met de upload.";
 	exit;
 }
 

mercurial