Tue, 08 Jan 2019 21:54:19 +0100
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>