Added cmd_fermenter.php which interfaces http POST commands to MQTT using mosquitto_pub in a shell. Several chnges to the monitor fermenter screen.

Tue, 08 Jan 2019 21:54:19 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Tue, 08 Jan 2019 21:54:19 +0100
changeset 183
a810539dc218
parent 182
58618d93c0fb
child 184
3dbe1d2265ed

Added cmd_fermenter.php which interfaces http POST commands to MQTT using mosquitto_pub in a shell. Several chnges to the monitor fermenter screen.

.hgignore file | annotate | diff | comparison | revisions
www/Makefile file | annotate | diff | comparison | revisions
www/cmd_fermenter.php file | annotate | diff | comparison | revisions
www/css/style.css file | annotate | diff | comparison | revisions
www/includes/global.inc.php file | annotate | diff | comparison | revisions
www/js/log_fermentation.js file | annotate | diff | comparison | revisions
www/js/mon_fermenter.js file | annotate | diff | comparison | revisions
www/log_fermentation.php file | annotate | diff | comparison | revisions
www/mon_fermenter.php file | annotate | diff | comparison | revisions
--- a/.hgignore	Mon Jan 07 22:35:32 2019 +0100
+++ b/.hgignore	Tue Jan 08 21:54:19 2019 +0100
@@ -9,6 +9,7 @@
 doc/bms.pdf
 www/version.php
 www/config.php
+www/run/sequence
 
 syntax: glob
 *.o
--- a/www/Makefile	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/Makefile	Tue Jan 08 21:54:19 2019 +0100
@@ -3,7 +3,7 @@
 
 include ../Makefile.global
 
-SRC		= config.php.dist favicon.ico gen_about.php getfermentablesources.php \
+SRC		= cmd_fermenter.php config.php.dist favicon.ico gen_about.php getfermentablesources.php \
 		  getfermenter.php getfermentlog.php gethopsources.php getmiscsources.php \
 		  getnode.php getwatersources.php getyeastsources.php index.php \
 		  inv_equipments.php inv_fermentables.php inv_hops.php inv_instock.php \
@@ -31,6 +31,7 @@
 install:
 		${INSTALL} -d -g 314 -o 314 ${PREFIX} ${WWWDIR} ${WWWDIR}/css \
 			${WWWDIR}/jqwidgets ${WWWDIR}/js ${WWWDIR}/images/ ${WWWDIR}/includes/
+		${INSTALL} -d -g 314 -o 314 -m 0777 ${WWWDIR}/run
 		${INSTALL} -g 314 -o 314 ${SRC} ${WWWDIR}/
 		${INSTALL} -g 314 -o 314 version.php ${WWWDIR}/
 		${INSTALL} -g 314 -o 314 css/* ${WWWDIR}/css/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/cmd_fermenter.php	Tue Jan 08 21:54:19 2019 +0100
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * Sequence number file. Must be mode 666 in directory mode 777
+ */
+$sfile = "run/sequence";
+if (fopen($sfile, "r")) {
+	$data = file_get_contents($sfile);
+	$nr = intval($data);
+} else {
+	$nr = 1;
+}
+$nr++;
+if ($fp = fopen($sfile, "w")) {
+	file_put_contents($sfile, $nr);
+	fclose($fp);
+}
+
+
+if (isset($_POST['node'])) {
+	$node = $_POST['node'];
+} else {
+	return 1;
+}
+if (isset($_POST['alias'])) {
+	$alias = $_POST['alias'];
+} else {
+	return 1;
+}
+if (isset($_POST['payload'])) {
+	$payload = $_POST['payload'];
+} else {
+	return 1;
+}
+
+
+/*
+ * topic:    mbv1.0/fermenters/DCMD/$node/$alias
+ * payload:  {"timestamp":1546956819,"seq":688,"metric":$payload}
+ * $payload: {"product":{"code":"HUP001","name":"Hop Hup"}}
+ *           {"stage":"PRIMARY","mode":"FRIDGE","setpoint":{"low":17.8,"high":18.2}}
+ *           {"heater":{"state":0},"cooler":{"state":0},"fan":{"state":0}}
+ *           {"profile":{"uuid":"...","name":"profielnaam","inittemp":{"low":18.2,"high":20.5},"fridgemode":0,
+ *              "steps":[{"resttime":12,"steptime":36,"target":{"low":20.8,"high":23.1},"fridgemode":0},
+ *              	 {"resttime":48,"steptime":48,"target":{"low":27.5,"high":28.0},"fridgemode":0}]}}
+ */
+$topic = "mbv1.0/fermenters/DCMD/" . $node . "/" . $alias;
+$payload = '\'{"timestamp":' . time() . ',"seq":' . $nr . ',"metric":' . $payload . '}\'';
+
+syslog(LOG_NOTICE, $topic . ' ' . $payload);
+shell_exec('mosquitto_pub -h seaport -q 0 -t '.$topic.' -m '.$payload);
+
+?>
--- a/www/css/style.css	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/css/style.css	Tue Jan 08 21:54:19 2019 +0100
@@ -127,7 +127,7 @@
  * |                               |
  * +-------------------------------+
  */
-#fermentor_panel_top {
+#fermenter_panel_top {
   width: 280px;
   height: 200px;
   float: right;
@@ -138,18 +138,14 @@
   border-radius: 5px 5px 5px 5px;
 }
 
-#fermentor_selector {
+#fermenter_selector {
   width: 100px;
   height: 198px;
+  margin-top: 3px;
   float: left;
 }
 
-input.select {
-  margin-left: 10px;
-  margin-top: 13px;
-}
-
-#fermentor_alarmled {
+#fermenter_alarmled {
 width: 50px;
 height: 30px;
 float: left;
@@ -158,7 +154,7 @@
 margin-left: 20px;
 }
 
-#fermentor_powerled {
+#fermenter_powerled {
 width: 50px;
 height: 30px;
 float: left;
@@ -167,7 +163,7 @@
 margin-left: 42px;
 }
 
-#fermentor_mode_control {
+#fermenter_mode_control {
 width: 148px;
 height: 110px;
 float: left;
@@ -175,7 +171,7 @@
 background-color: #ddd;
 }
 
-#fermentor_panel_display {
+#fermenter_panel_display {
   width: 280px;
   height: 80px;
   float: right;
@@ -187,7 +183,7 @@
   margin-bottom: 3px;
 }
 
-#fermentor_display1 {
+#fermenter_display1 {
 width: 93px;
 height: 76px;
 float: left;
@@ -195,7 +191,7 @@
 margin-top: 7px;
 }
 
-#fermentor_display2 {
+#fermenter_display2 {
 width: 93px;
 height: 76px;
 float: left;
@@ -203,7 +199,7 @@
 margin-top: 7px;
 }
 
-#fermentor_display3 {
+#fermenter_display3 {
 width: 93px;
 height: 76px;
 float: left;
@@ -226,9 +222,9 @@
   color: red;
 }
 
-#fermentor_panel_control {
+#fermenter_panel_control {
   width: 280px;
-  height: 120px;
+  height: 140px;
   float: right;
   margin: 5px;
   background-color: #252526;
@@ -238,56 +234,31 @@
   margin-bottom: 3px;
 }
 
-#fermentor_led1 {
-width: 93px;
-height: 30px;
-float: left;
-text-align: center;
-margin-top: 8px;
-}
-
-#fermentor_led2 {
-width: 93px;
-height: 30px;
-float: left;
-text-align: center;
-margin-top: 8px;
+#fermenter_led1,
+#fermenter_led2,
+#fermenter_led3 {
+  width: 93px;
+  height: 30px;
+  float: left;
+  text-align: center;
+  margin-top: 8px;
 }
 
-#fermentor_led3 {
-width: 93px;
-height: 30px;
-float: left;
-text-align: center;
-margin-top: 8px;
+#fermenter_toggle1 {
+  float: left;
+  margin-left: 29px;
+  margin-top: 20px;
 }
 
-#fermentor_toggle1 {
-width: 93px;
-height: 70px;
-float: left;
-text-align: center;
-margin-top: 10px;
-}
-
-#fermentor_toggle2 {
-width: 93px;
-height: 70px;
-float: left;
-text-align: center;
-margin-top: 10px;
-}
-
-#fermentor_toggle3 {
-width: 93px;
-height: 70px;
-float: left;
-text-align: center;
-margin-top: 10px;
+#fermenter_toggle2,
+#fermenter_toggle3 {
+  float: left;
+  margin-left: 57px;
+  margin-top: 20px;
 }
 
 
-#fermentor_panel_buttons {
+#fermenter_panel_buttons {
   width: 280px;
   height: 130px;
   float: right;
@@ -300,19 +271,6 @@
 }
 
 
-#fermenter_tempdigits {
-    width: 145px;
-    height: 120px;
-    float: left;
-    margin-top: 170;
-    background-color: #252526;
-    border: 2px solid;
-    border-color: #59b4d4;
-    border-radius: 5px 5px 5px 5px;
-}
-
-
-
 .LEDred_on {
     margin: 5px auto;
     width: 18px;
--- a/www/includes/global.inc.php	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/includes/global.inc.php	Tue Jan 08 21:54:19 2019 +0100
@@ -154,6 +154,8 @@
   <script src="jqwidgets/jqxinput.js"></script>
   <script src="jqwidgets/jqxeditor.js"></script>
   <script src="jqwidgets/jqxtooltip.js"></script>
+  <script src="jqwidgets/jqxswitchbutton.js"></script>
+  <script src="jqwidgets/jqxradiobutton.js"></script>
   <script src="jqwidgets/jqxcheckbox.js"></script>
   <script src="jqwidgets/jqxdatetimeinput.js"></script>
   <script src="jqwidgets/jqxcalendar.js"></script>
--- a/www/js/log_fermentation.js	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/js/log_fermentation.js	Tue Jan 08 21:54:19 2019 +0100
@@ -118,10 +118,10 @@
 			}
 		 ]
 	};
-	$("#fermentor_chart").jqxChart(settings);
+	$("#fermenter_chart").jqxChart(settings);
 
 	$("#print").click(function () {
-		var content = $("#fermentor_chart")[0].outerHTML;
+		var content = $("#fermenter_chart")[0].outerHTML;
 		var newWindow = window.open("", "", "width=865, height=425"),
 		document = newWindow.document.open(),
 		pageContent =
@@ -141,12 +141,12 @@
 
 
 	$("#pdfButton").click(function () {
-		$("#fermentor_chart").jqxChart("saveAsPDF", "vergisting_"+my_code+".pdf", getExportServer());
+		$("#fermenter_chart").jqxChart("saveAsPDF", "vergisting_"+my_code+".pdf", getExportServer());
 	});
 	$("#pdfButton").jqxButton({ template: "info", width: 125, theme: theme });
 
 	$("#pngButton").click(function () {
-		$("#fermentor_chart").jqxChart("saveAsPNG", "vergisting_"+my_code+".png", getExportServer());
+		$("#fermenter_chart").jqxChart("saveAsPNG", "vergisting_"+my_code+".png", getExportServer());
 	});
 	$("#pngButton").jqxButton({ template: "info", width: 125, theme: theme });
 
--- a/www/js/mon_fermenter.js	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/js/mon_fermenter.js	Tue Jan 08 21:54:19 2019 +0100
@@ -27,6 +27,8 @@
 	var	bcode = '';
 	var	yl = 12;	// Normal yeast temp range
 	var	yh = 24;
+	var	bstage = '';
+	var	bmode = '';
 
 	var gaugeoptions = {
 		min: 0, max: 40, width: 375, height: 375,
@@ -55,12 +57,45 @@
 		animationDuration: 1200,
 		caption: { value: 'Chiller', position: 'bottom', offset: [0, 10] }
 	};
+	var switchoptions = {
+		height: 68,
+		width: 35,
+		theme: theme,
+		thumbSize:'50%',
+		orientation: 'vertical'
+	};
 
+	srcMode = [ "OFF", "NONE", "FRIDGE", "BEER", "PROFILE" ];
+	srcStage = [ "PRIMARY", "SECONDARY", "TERTIARY", "CARBONATION" ];
 	$("#gaugeContainer_air").jqxGauge( gaugeoptions );
 	$("#gaugeContainer_air").jqxGauge( { caption: { value: 'Air', position: 'bottom', offset: [0, 10] }} );
 	$("#gaugeContainer_beer").jqxGauge( gaugeoptions );
 	$("#gaugeContainer_beer").jqxGauge( { caption: { value: 'Beer', position: 'bottom', offset: [0, 10] }} );
 	$("#gaugeContainer_chiller").jqxGauge( gaugeSmalloptions );
+	$("#fermenter_toggle1").jqxSwitchButton( switchoptions );
+	$("#fermenter_toggle2").jqxSwitchButton( switchoptions );
+	$("#fermenter_toggle3").jqxSwitchButton( switchoptions );
+
+	$("#info_mode").jqxDropDownList({ theme: theme, source: srcMode, width: 100, height: 23, dropDownHeight: 156 });
+	$("#info_stage").jqxDropDownList({ theme: theme, source: srcStage, width: 150, height: 23, dropDownHeight: 125 });
+
+	function sendBase(stage, mode) {
+
+		console.log("sendBase("+stage+", "+mode+")");
+		var data  = 'node=rpi01&alias=unit0&payload={"stage":"' + stage;
+		    data += '","mode":"' + mode + '","setpoint":{"low":17.8,"high":18.2}}';
+		$.ajax({
+			url: "cmd_fermenter.php",
+			data: data,
+			type: "POST",
+			success: function(data) {
+				//do something after something is recieved from php
+			},
+			error: function(jqXHR, textStatus, errorThrown) {
+				console.log("sendBase() error");
+			}
+		});
+	}
 
     	var url = "getfermenter.php?uuid='" + my_uuid + "'";
     	var source = {
@@ -110,27 +145,25 @@
 		loadComplete: function (records) {
 			var record = dataAdapter.records[0];
 			var oline = (record.online) ? "On-line" : "Off-line";
-			var html  = "<table style='width: 100%; padding: 10px;'>";
-			    html += "<tr><th colspan=2>Klimaatkast overzicht</th></tr>";
-			    html += "<tr><td>Uuid</td><td>" + record.uuid + "</td></tr>";
-			    html += "<tr><td>Systeem</td><td>" + record.node +  "/" + record.alias + " " + oline + "</td></tr>";
-			    html += "<tr><td>Bier</td><td>" + record.beercode + " - " + record.beername + "</td></tr>";
-			    html += "<tr><td>Werking</td><td>" + record.mode + "</td></tr>";
-			    html += "<tr><td>Fase</td><td>" + record.stage + "</td></tr>"
-			    html += "</<table>";
-			$("#fermenter_info").html(html);
+			$("#info_uuid").html(record.uuid);
+			$("#info_system").html(record.node +  "/" + record.alias + " " + oline);
+			$("#info_beer").html(record.beercode + " - " + record.beername);
 			bcode = record.beercode;
 			bname = record.beername;
+			bstage = record.stage;
+			bmode = record.mode;
+			$("#info_mode").jqxDropDownList('selectItem', record.mode);
+			$("#info_stage").jqxDropDownList('selectItem', record.stage);
 
 			if (record.online && (record.mode != "OFF")) {
-				$("#fermentor_powerled").html('<div class="LEDblue_on"></div>Power');
+				$("#fermenter_powerled").html('<div class="LEDblue_on"></div>Power');
 			} else {
-				$("#fermentor_powerled").html('<div class="LEDblue_off"></div>Power');
+				$("#fermenter_powerled").html('<div class="LEDblue_off"></div>Power');
 			}
 			if (record.online && (record.alarm != "0")) {
-				$("#fermentor_alarmled").html('<div class="LEDred_on"></div>Alarm');
+				$("#fermenter_alarmled").html('<div class="LEDred_on"></div>Alarm');
 			} else {
-				$("#fermentor_alarmled").html('<div class="LEDred_off"></div>Alarm');
+				$("#fermenter_alarmled").html('<div class="LEDred_off"></div>Alarm');
 			}
 
 			$("#target_lo").html(record.setpoint_low.toFixed(1));
@@ -139,21 +172,32 @@
 			$("#load_beer").html(record.beer_temperature.toFixed(3));
 
 			if (record.online && (record.heater_state != "0")) {
-				$("#fermentor_led1").html('<div class="LEDgreen_on"></div>Heat');
+				$("#fermenter_led1").html('<div class="LEDgreen_on"></div>Heat');
 			} else {
-				$("#fermentor_led1").html('<div class="LEDgreen_off"></div>Heat');
+				$("#fermenter_led1").html('<div class="LEDgreen_off"></div>Heat');
 			}
 			if (record.online && (record.cooler_state != "0")) {
-				$("#fermentor_led2").html('<div class="LEDgreen_on"></div>Cool');
+				$("#fermenter_led2").html('<div class="LEDgreen_on"></div>Cool');
 			} else {
-				$("#fermentor_led2").html('<div class="LEDgreen_off"></div>Cool');
+				$("#fermenter_led2").html('<div class="LEDgreen_off"></div>Cool');
 			}
 			if (record.online && (record.fan_state != "0")) {
-				$("#fermentor_led3").html('<div class="LEDgreen_on"></div>Fan');
+				$("#fermenter_led3").html('<div class="LEDgreen_on"></div>Fan');
 			} else {
-				$("#fermentor_led3").html('<div class="LEDgreen_off"></div>Fan');
+				$("#fermenter_led3").html('<div class="LEDgreen_off"></div>Fan');
 			}
-
+			if (record.online && (record.mode == "NONE")) {
+				$("#fermenter_toggle1").jqxSwitchButton( 'enable' );
+				$("#fermenter_toggle2").jqxSwitchButton( 'enable' );
+				$("#fermenter_toggle3").jqxSwitchButton( 'enable' );
+			} else {
+				$("#fermenter_toggle1").jqxSwitchButton( 'disable' );
+				$("#fermenter_toggle2").jqxSwitchButton( 'disable' );
+				$("#fermenter_toggle3").jqxSwitchButton( 'disable' );
+				$("#fermenter_toggle1").val( (record.heater_state != "0") );
+				$("#fermenter_toggle2").val( (record.cooler_state != "0") );
+				$("#fermenter_toggle3").val( (record.fan_state != "0") );
+			}
 
 			$('#gaugeContainer_air').jqxGauge({ value: record.air_temperature });
 			if (record.online && (record.air_state == "OK")) {
@@ -182,6 +226,14 @@
 		dataAdapter.dataBind();
 	}, 10000);
 
+	$('#info_mode').on('change', function (event) {
+		sendBase(bstage, args.item.value);
+	});
+	$('#info_stage').on('change', function (event) {
+		sendBase(args.item.value, bmode);
+	});
+
+
 	// The chart button.
    	$("#FLog").jqxButton({ template: "info", width: '150px', theme: theme });
 	$("#FLog").click(function () {
--- a/www/log_fermentation.php	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/log_fermentation.php	Tue Jan 08 21:54:19 2019 +0100
@@ -5,7 +5,7 @@
 
    <div id="MainPanel">
     <div id="ContentPanel"></div>
-    <div id="fermentor_chart" style="width:1130px; height:610px; float:left; margin-left: 10px; margin-top: 10px;"></div>
+    <div id="fermenter_chart" style="width:1130px; height:610px; float:left; margin-left: 10px; margin-top: 10px;"></div>
     <div style="margin-top: 10px; margin-left: 10px;">
      <input style="float: left; margin-left: 10px;" id="print" type="button" value="Print grafiek" />
      <input style="float: left; margin-left: 10px; margin-top: 10px;" id="pdfButton" type="button" value="Maak PDF" />
--- a/www/mon_fermenter.php	Mon Jan 07 22:35:32 2019 +0100
+++ b/www/mon_fermenter.php	Tue Jan 08 21:54:19 2019 +0100
@@ -7,7 +7,16 @@
 
     <div style="float: left; width: 970px;">
      <div id="fermenter_table">
-      <div id="fermenter_info"></div>
+      <div id="fermenter_info">
+       <table style='width: 100%; padding: 10px;'>
+        <tr><th colspan=2>Klimaatkast overzicht</th></tr>
+        <tr><td>Uuid</td><td><div id="info_uuid"></div></td></tr>
+        <tr><td>Systeem</td><td><div id="info_system"></div></td></tr>
+        <tr><td>Bier</td><td><div id="info_beer"></div></td></tr>
+        <tr><td>Werking</td><td><div id="info_mode"></div></td></tr>
+        <tr><td>Fase</td><td><div id="info_stage"></div></td></tr>
+       </table>
+      </div>
      </div>
      <div id='fermenter_thermometers'>
       <div id="gaugeContainer_air" style='float: left; margin-top: 10px; margin-left: 10px;'></div>
@@ -17,39 +26,38 @@
     </div> <!-- End left side -->
 
     <div style="float: right; width: 295px;  background-color: #ddd;">
-     <div id="fermentor_panel_top">
-      <div id="fermentor_selector">
-
+     <div id="fermenter_panel_top">
+      <div id="fermenter_selector">
       </div>
-      <div id="fermentor_alarmled"></div>
-      <div id="fermentor_powerled"></div>
+      <div id="fermenter_alarmled"></div>
+      <div id="fermenter_powerled"></div>
      </div> <!-- fermenter_panel_top -->
 
-     <div id="fermentor_panel_display">
-      <div id="fermentor_display1">
+     <div id="fermenter_panel_display">
+      <div id="fermenter_display1">
        <div id="target_hi" class="htemp"></div>
        <div id="target_lo" class="ltemp"></div>Sp
       </div>
-      <div id="fermentor_display2">
+      <div id="fermenter_display2">
        <div id="load_air" class="dtemp"></div>Air
       </div>
-      <div id="fermentor_display3">
+      <div id="fermenter_display3">
        <div id="load_beer" class="dtemp"></div>Beer
       </div>
-     </div> <!-- fermentor_panel_display -->
+     </div> <!-- fermenter_panel_display -->
 
-     <div id="fermentor_panel_control">
-      <div id="fermentor_led1"></div>
-      <div id="fermentor_led2"></div>
-      <div id="fermentor_led3"></div>
-      <div id="fermentor_toggle1"></div>
-      <div id="fermentor_toggle2"></div>
-      <div id="fermentor_toggle3"></div>
-     </div> <!-- fermentor_panel_control -->
+     <div id="fermenter_panel_control">
+      <div id="fermenter_led1"></div>
+      <div id="fermenter_led2"></div>
+      <div id="fermenter_led3"></div>
+      <div id="fermenter_toggle1"></div>
+      <div id="fermenter_toggle2"></div>
+      <div id="fermenter_toggle3"></div>
+     </div> <!-- fermenter_panel_control -->
 
-     <div id="fermentor_panel_buttons">
+     <div id="fermenter_panel_buttons">
       <input type="button" id="FLog" value="Vergisting log" />
-     </div> <!-- fermentor_panel_buttons -->
+     </div> <!-- fermenter_panel_buttons -->
     </div> <!-- End right side -->
    </div>
 

mercurial