www/js/mon_ispindel.js

Wed, 06 Dec 2023 20:26:00 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Wed, 06 Dec 2023 20:26:00 +0100
changeset 855
2d328a2a4025
parent 848
542bdc7f6522
permissions
-rw-r--r--

Fixed init scripts names in Makefile. Update crontasks to use the database to check the log entries for products.

/*****************************************************************************
 * Copyright (C) 2019-2023
 *
 * Michiel Broek <mbroek at mbse dot eu>
 *
 * This file is part of BMS
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * Brewery Management System istributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ThermFerm; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/


$(document).ready(function() {

 var record = {},
 blank = {},

 productSource = {
  datatype: 'json',
  cache: false,
  datafields: [
   { name: 'code', type: 'string' },
   { name: 'name', type: 'string' },
   { name: 'uuid', type: 'string' }
  ],
  id: 'code',
  url: 'includes/db_product.php?select=ferment'
 },
 productlist = new $.jqx.dataAdapter(productSource, {
  beforeLoadComplete: function(records) {
   var row, i, data = new Array();
   // Create a dummy beer on top to store in idle meters.
   blank['code'] = 'Free';  // Will override this later.
   blank['name'] = 'Dummy';
   blank['uuid'] = '66ecccbf-e942-4a35-af49-8b02314561a5';
   data.push(blank);
   for (i = 0; i < records.length; i++) {
    row = records[i];
    data.push(row);
   }
   return data;
  },
  loadError: function(jqXHR, status, error) { console.log(status + ' ' + error); },
 }),
 gaugeoptionst = {
  min: 10, max: 40, width: 375, height: 375,
  ranges: [{ startValue: 10, endValue: 20, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 },
           { startValue: 20, endValue: 28, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 },
           { startValue: 28, endValue: 40, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }],
  ticksMinor: { interval: 1, size: '5%' },
  ticksMajor: { interval: 5, size: '9%' },
  labels: { interval: 5 },
  style: { fill: '#eeeeee', stroke: '#666666' },
  value: 0,
  colorScheme: 'scheme05'
 },
 gaugeoptionsg = {
  orientation: 'vertical',
  labels: { position: 'near', interval: 10 },
  ticksMinor: { size: '5%', interval: 2 },
  ticksMajor: { size: '9%', interval: 10 },
  ticksPosition: 'near',
  min: 0990, max: 1150, width: 120, height: 375,
  value: 1000,
  pointer: { pointerType: 'arrow', size: '15%', visible: true, offset: 0 },
  colorScheme: 'scheme05',
  showRanges: false
 },
 url = 'getispindel.php?uuid="' + my_uuid + '"',
 source = {
  datatype: 'json',
  datafields: [
   { name: 'record', type: 'int' },
   { name: 'uuid', type: 'string' },
   { name: 'alias', type: 'string' },
   { name: 'node', type: 'string' },
   { name: 'online', type: 'int' },
   { name: 'beercode', type: 'string' },
   { name: 'beername', type: 'string' },
   { name: 'beeruuid', type: 'string' },
   { name: 'alarm', type: 'int' },
   { name: 'angle', type: 'float' },
   { name: 'temperature', type: 'float' },
   { name: 'battery', type: 'float' },
   { name: 'gravity', type: 'float' },
   { name: 'up_interval', type: 'int' },
   { name: 'mode', type: 'string' },
   { name: 'og_gravity', type: 'float' }
  ],
  id: 'record',
  url: url
 },
 dataAdapter = new $.jqx.dataAdapter(source, {
  loadComplete: function(records) {
   record = dataAdapter.records[0];
   updateScreen();
   blank['name'] = record.alias;
   blank['code'] = record.alias.toUpperCase();
   blank['uuid'] = record.uuid;
  }
 });

 function updateScreen() {

  $('#info_uuid').html(record.uuid);
  $('#info_system').html(record.node + '/' + record.alias);
  $('#info_beer').html(record.beercode + ' - ' + record.beername);
  $('#info_mode').jqxDropDownList('selectItem', record.mode);

  if (record.mode != 'OFF') {
   $('#select_beer').jqxDropDownList({ disabled: true });
   $('#select_beer').jqxDropDownList('clearSelection');
   $('#select_beer').hide();
  } else {
   $('#select_beer').show();
   $('#select_beer').jqxDropDownList({ disabled: false });
  }

  if (record.online) {
   $('#info_online').html('On-line');
   if (record.mode != 'OFF') {
    $('#ispindel_powerled').html('<div class="LEDblue_on"></div>Power');
   } else {
    $('#ispindel_powerled').html('<div class="LEDblue_off"></div>Power');
   }
   if (record.online && (record.alarm != '0')) {
    $('#ispindel_alarmled').html('<div class="LEDred_on"></div>Alarm');
   } else {
    $('#ispindel_alarmled').html('<div class="LEDred_off"></div>Alarm');
   }

   $('#gaugeContainer_temperature').jqxGauge({ disabled: false });
   $('#gaugeContainer_gravity').jqxLinearGauge({ disabled: false })

   var sg = plato_to_sg(record.gravity);
   $('#info_battery').val(record.battery);
   $('#info_tilt').val(record.angle);
   $('#info_plato').val(record.gravity);
   $('#info_sg').val(sg);

   if (record.og_gravity) {
    var og = plato_to_sg(record.og_gravity);
    var svg = calc_svg(og, sg);
    var max = Math.ceil(og * 100, 0) * 10;
    var gravity = sg * 1000;

    console.log ('set max ' + max);
    $('#gaugeContainer_gravity').jqxLinearGauge({ max: max });
    $('#vg_og1').html(og.toFixed(4));
    $('#vg_og2').html(record.og_gravity.toFixed(3) + '&deg;P');
    $('#vg_sg1').html(sg.toFixed(4));
    $('#vg_sg2').html(record.gravity.toFixed(3) + '&deg;P');
    $('#vg_svg').html(svg.toFixed(1) + '%');
    $('#vg_abv').html(abvol(og, sg).toFixed(2) + '%');
   } else {
    $('#gaugeContainer_gravity').jqxLinearGauge({ max: 1150 });
    $('#vg_og1').html('');
    $('#vg_og2').html('');
    $('#vg_sg1').html('');
    $('#vg_sg2').html('');
    $('#vg_svg').html('');
    $('#vg_abv').html('');
   }

   var battery_max = 4.13;
   var battery_min = 3.43;
   var batt = Math.round(((record.battery - battery_min) / (battery_max - battery_min)) * 1000) / 10;
   if (batt < 0)
    batt = 0;
   if (batt > 100)
    batt = 100;
   $('#vg_batt').html(batt + '%');

   $('#gaugeContainer_temperature').jqxGauge({ caption: { value: record.temperature.toFixed(3) + '°C' }});
   $('#gaugeContainer_temperature').jqxGauge({ value: record.temperature });
   $('#gaugeContainer_gravity').jqxLinearGauge({ value: gravity });

  } else { // offline
   $('#info_online').html('Off-line');
   $('#ispindel_powerled').html('<div class="LEDblue_off"></div>Power');
   $('#ispindel_alarmled').html('<div class="LEDred_on"></div>Alarm');
   $('#gaugeContainer_temperature').jqxGauge({ disabled: true });
   $('#gaugeContainer_gravity').jqxLinearGauge({ disabled: true });
  }
 }

 $('#select_beer').jqxDropDownList({
  placeHolder: 'Kies bier:',
  theme: theme,
  source: productlist,
  displayMember: 'code',
  width: 150,
  height: 24,
  dropDownWidth: 500,
  autoDropDownHeight: true,
  renderer: function(index, label, value) {
   var datarecord = productlist.records[index];
   return datarecord.code + ' - ' + datarecord.name;
  }
 });

 $('#info_battery').jqxNumberInput(Show3dec);
 $('#info_tilt').jqxNumberInput(Show5dec);
 $('#info_plato').jqxNumberInput(Show3dec);
 $('#info_sg').jqxNumberInput(Show4dec);

 $('#gaugeContainer_temperature').jqxGauge(gaugeoptionst);
 $('#gaugeContainer_temperature').jqxGauge({ caption: { value: '0.000°C' }});
 $('#gaugeContainer_gravity').jqxLinearGauge(gaugeoptionsg);

 srcMode = ['OFF', 'ON'];
 $('#info_mode').jqxDropDownList({ theme: theme, source: srcMode, width: 100, height: 24, dropDownHeight: 65 });

 // Get the data immediatly.
 dataAdapter.dataBind();

 $('#select_beer').on('select', function(event) {
  if (event.args) {
   var index = event.args.index,
   datarecord = productlist.records[index];
   record.beercode = datarecord.code;
   record.beername = datarecord.name;
   record.beeruuid = datarecord.uuid;
   console.log('Select beer ' + record.beercode + ', ' + record.beername);
   websocket.send('{"device":"ispindels","node":"' + record.node + '","unit":"' + record.alias +
             '","beeruuid":"' + record.beeruuid + '","beercode":"' + record.beercode + '","beername":"' + record.beername + '"}');
  }
 });
 $('#info_mode').on('select', function(event) {
  if (event.args && event.args.item.value != record.mode) {
   record.mode = event.args.item.value;
   websocket.send('{"device":"ispindels","node":"' + record.node + '","unit":"' + record.alias + '","mode":"' + record.mode + '"}');
  }
 });

 // The chart button.
 $('#VLog').jqxButton({ template: 'primary', width: '150px', theme: theme });
 $('#VLog').click(function() {
  window.open('log_ispindel.php?code=' + record.beercode + '&name=' + record.beername);
 });

 websocket.onmessage = function(evt) {
  var msg = evt.data;
  var obj = JSON.parse(msg);
  if (obj.device == "ispindels" && obj.node == record.node) {
   console.log('ws got this device ' + msg);
   record.online = obj.online;
   if (obj.online) {
    record.beeruuid = obj.beeruuid;
    record.beercode = obj.beercode;
    record.beername = obj.beername;
    record.mode = obj.mode;
    record.alarm = obj.alarm;
    record.angle = obj.angle;
    record.temperature = obj.temperature;
    record.battery = obj.battery;
    record.gravity = obj.gravity;
    record.up_interval = obj.up_interval;
    record.og_gravity = obj.og_gravity;
   }
   updateScreen();
  }
 }
});

mercurial