www/js/mon_fermenter.js

changeset 679
48f8f3fce7c0
parent 645
3b1510050c9b
child 682
f52b18a2a4d1
--- a/www/js/mon_fermenter.js	Thu May 14 14:38:20 2020 +0200
+++ b/www/js/mon_fermenter.js	Mon May 18 11:00:59 2020 +0200
@@ -46,11 +46,6 @@
  var record = {},
  blank = {},
  ppayload = '',
- newBase = false,
- newProduct = false,
- newSwitch = false,
- newProfile = false,
- schedule = 0,
  yl = 12, // Normal yeast temp range
  yh = 24,
 
@@ -85,9 +80,7 @@
    }
    return data;
   },
-  loadError: function(jqXHR, status, error) {
-   $('#err').text(status + ' ' + error);
-  },
+  loadError: function(jqXHR, status, error) { console.log(status + ' ' + error); },
  }),
  profileSource = {
   datatype: 'json',
@@ -114,8 +107,8 @@
    empty['record'] = -1;
    empty['uuid'] = '';
    empty['name'] = 'Wis profiel';
-   empty['inittemp_lo'] = 20;
-   empty['inittemp_hi'] = 20;
+   empty['inittemp_lo'] = 20.0;
+   empty['inittemp_hi'] = 20.2;
    empty['fridgemode'] = 0;
    empty['totalsteps'] = 0;
    empty['duration'] = 0;
@@ -220,166 +213,192 @@
  dataAdapter = new $.jqx.dataAdapter(source, {
   loadComplete: function(records) {
    record = dataAdapter.records[0];
-   var range, oline = (record.online) ? 'On-line' : 'Off-line';
-   $('#info_uuid').html(record.uuid);
-   $('#info_system').html(record.node + '/' + record.alias);
-   $('#info_online').html(oline);
-   $('#info_beer').html(record.beercode + ' - ' + record.beername);
-   $('#info_mode').jqxDropDownList('selectItem', record.mode);
-   $('#info_stage').jqxDropDownList('selectItem', record.stage);
-   $('#info_profile').html(record.profile_name);
+   updateScreen();
    blank['name'] = record.alias;
    blank['code'] = record.alias.toUpperCase();
    blank['uuid'] = record.uuid;
-   if (record.profile_name == '')
-    $('#info_mode').jqxDropDownList('disableItem', 'PROFILE');
-   else
-    $('#info_mode').jqxDropDownList('enableItem', 'PROFILE');
-   $('#target_lo').val(record.setpoint_low);
-   $('#target_hi').val(record.setpoint_high);
-   if (record.online && ((record.mode == 'FRIDGE') || (record.mode == 'BEER'))) {
-    $('#target_lo').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
-    $('#target_hi').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
-   } else {
-    $('#target_lo').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
-    $('#target_hi').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
-   }
+  }
+ });
+
+ function updateScreen() {
+   $('#info_uuid').html(record.uuid);
+   $('#info_system').html(record.node + '/' + record.alias);
 
-   if (record.online && record.door_address && (record.door_state != '0')) {
-    $('#fermenter_doorled').html('<div class="LEDyellow_on"></div>Door');
-   } else {
-    $('#fermenter_doorled').html('<div class="LEDyellow_off"></div>Door');
-   }
-   if (record.online && record.light_address && (record.light_state != '0')) {
-    $('#fermenter_lightled').html('<div class="LEDyellow_on"></div>Light');
-   } else {
-    $('#fermenter_lightled').html('<div class="LEDyellow_off"></div>Light');
-   }
+   if (record.online) {
+    $('#info_online').html('On-line');
+    $('#info_beer').html(record.beercode + ' - ' + record.beername);
+    $('#info_mode').jqxDropDownList('selectItem', record.mode);
+    $('#info_stage').jqxDropDownList('selectItem', record.stage);
+    if (record.door_address) {
+     if (record.door_state != '0') {
+      $('#fermenter_doorled').html('<div class="LEDyellow_on"></div>Door');
+     } else {
+      $('#fermenter_doorled').html('<div class="LEDyellow_off"></div>Door');
+     }
+    }
+    if (record.light_address) {
+     if (record.light_state != '0') {
+      $('#fermenter_lightled').html('<div class="LEDyellow_on"></div>Light');
+     } else {
+      $('#fermenter_lightled').html('<div class="LEDyellow_off"></div>Light');
+     }
+    }
+    if (record.mode != 'OFF') {
+     $('#fermenter_powerled').html('<div class="LEDblue_on"></div>Power');
+     $('#select_beer').jqxDropDownList({ disabled: true });
+     $('#select_beer').jqxDropDownList('clearSelection');
+     $('#select_beer').hide();
+    } else {
+     $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
+     $('#select_beer').show();
+     $('#select_beer').jqxDropDownList({ disabled: false });
+    }
+    if (record.alarm != '0') {
+     $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
+    } else {
+     $('#fermenter_alarmled').html('<div class="LEDred_off"></div>Alarm');
+    }
+
+    $('#target_lo').val(record.setpoint_low);
+    $('#target_hi').val(record.setpoint_high);
+    if ((record.mode == 'FRIDGE') || (record.mode == 'BEER')) {
+     $('#target_lo').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
+     $('#target_hi').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
+    } else {
+     $('#target_lo').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
+     $('#target_hi').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
+    }
 
-   if (record.online && (record.mode != 'OFF')) {
-    $('#fermenter_powerled').html('<div class="LEDblue_on"></div>Power');
-    $('#select_beer').jqxDropDownList({ disabled: true });
-    $('#select_beer').jqxDropDownList('clearSelection');
-    $('#select_beer').hide();
-   } else {
-    $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
-    $('#select_beer').show();
-    $('#select_beer').jqxDropDownList({ disabled: false });
-   }
-   if (record.online && (record.alarm != '0')) {
-    $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
-   } else {
-    $('#fermenter_alarmled').html('<div class="LEDred_off"></div>Alarm');
-   }
+    $('.f_control_leds').show();
+    if (record.heater_state != '0') {
+     $('#fermenter_led1').html('<div class="LEDgreen_on"></div>Heat');
+    } else {
+     $('#fermenter_led1').html('<div class="LEDgreen_off"></div>Heat');
+    }
+    if (record.cooler_state != '0') {
+     $('#fermenter_led2').html('<div class="LEDgreen_on"></div>Cool');
+    } else {
+     $('#fermenter_led2').html('<div class="LEDgreen_off"></div>Cool');
+    }
+    if (record.fan_state != '0') {
+     $('#fermenter_led3').html('<div class="LEDgreen_on"></div>Fan');
+    } else {
+     $('#fermenter_led3').html('<div class="LEDgreen_off"></div>Fan');
+    }
+
+    if (record.mode == 'NONE') {
+     $('.f_control_switches').show();
+    } else {
+     $('.f_control_switches').hide();
+    }
+    if ((record.heater_state != '0') != $('#fermenter_toggle1').jqxSwitchButton('val'))
+     $('#fermenter_toggle1').val(record.heater_state != '0');
+    if ((record.cooler_state != '0') != $('#fermenter_toggle2').jqxSwitchButton('val'))
+     $('#fermenter_toggle2').val(record.cooler_state != '0');
+    if ((record.fan_state != '0') != $('#fermenter_toggle3').jqxSwitchButton('val'))
+     $('#fermenter_toggle3').val(record.fan_state != '0');
+
+    $('#info_profile').html(record.profile_name);
+    if (record.profile_name == '')
+     $('#info_mode').jqxDropDownList('disableItem', 'PROFILE');
+    else
+     $('#info_mode').jqxDropDownList('enableItem', 'PROFILE');
 
-   if (record.online && (record.heater_state != '0')) {
-    $('#fermenter_led1').html('<div class="LEDgreen_on"></div>Heat');
-   } else {
-    $('#fermenter_led1').html('<div class="LEDgreen_off"></div>Heat');
-   }
-   if (record.online && (record.cooler_state != '0')) {
-    $('#fermenter_led2').html('<div class="LEDgreen_on"></div>Cool');
-   } else {
-    $('#fermenter_led2').html('<div class="LEDgreen_off"></div>Cool');
-   }
-   if (record.online && (record.fan_state != '0')) {
-    $('#fermenter_led3').html('<div class="LEDgreen_on"></div>Fan');
-   } else {
-    $('#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');
-   }
-
-   if (record.online && (record.mode == 'PROFILE')) {
-    if (record.profile_state == 'OFF') {
+    if (record.mode == 'PROFILE') {
+     if (record.profile_state == 'OFF') {
+      $('#select_profile').show();
+      $('#select_profile').jqxDropDownList({ disabled: false });
+      $('#info_mode').jqxDropDownList({ disabled: false });
+      $('#Profile1').jqxButton({ template: 'success', value: 'Starten' });
+      $('#Profile1').show();
+      $('#Profile2').hide();
+      $('#status_profile').html('');
+     } else if (record.profile_state == 'RUN') {
+      $('#select_profile').jqxDropDownList({ disabled: true });
+      $('#select_profile').hide();
+      $('#info_mode').jqxDropDownList({ disabled: true });
+      $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
+      $('#Profile2').jqxButton({ template: 'primary', value: 'Pauze' });
+      $('#Profile1').show();
+      $('#Profile2').show();
+      $('#status_profile').html('Profiel actief, ' + record.profile_percent + '% gereed');
+     } else if (record.profile_state == 'PAUSE') {
+      $('#select_profile').jqxDropDownList({ disabled: true });
+      $('#select_profile').hide();
+      $('#info_mode').jqxDropDownList({ disabled: true });
+      $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
+      $('#Profile2').jqxButton({ template: 'success', value: 'Doorgaan' });
+      $('#Profile1').show();
+      $('#Profile2').show();
+      $('#status_profile').html('Profiel pauze, ' + record.profile_percent + '% gereed');
+     } else if (record.profile_state == 'DONE') {
+      $('#select_profile').jqxDropDownList({ disabled: true });
+      $('#select_profile').hide();
+      $('#info_mode').jqxDropDownList({ disabled: true });
+      $('#Profile1').jqxButton({ template: 'primary', value: 'Profiel Ok' });
+      $('#Profile1').show();
+      $('#Profile2').hide();
+      $('#status_profile').html('Profiel is gereed');
+     }
+    } else {
      $('#select_profile').show();
      $('#select_profile').jqxDropDownList({ disabled: false });
      $('#info_mode').jqxDropDownList({ disabled: false });
-     $('#Profile1').jqxButton({ template: 'success', value: 'Starten' });
-     $('#Profile1').show();
+     $('#Profile1').hide();
      $('#Profile2').hide();
      $('#status_profile').html('');
-    } else if (record.profile_state == 'RUN') {
-     $('#select_profile').jqxDropDownList({ disabled: true });
-     $('#select_profile').hide();
-     $('#info_mode').jqxDropDownList({ disabled: true });
-     $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
-     $('#Profile2').jqxButton({ template: 'primary', value: 'Pauze' });
-     $('#Profile1').show();
-     $('#Profile2').show();
-     $('#status_profile').html('Profiel actief, ' + record.profile_percent + '% gereed');
-    } else if (record.profile_state == 'PAUSE') {
-     $('#select_profile').jqxDropDownList({ disabled: true });
-     $('#select_profile').hide();
-     $('#info_mode').jqxDropDownList({ disabled: true });
-     $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
-     $('#Profile2').jqxButton({ template: 'success', value: 'Doorgaan' });
-     $('#Profile1').show();
-     $('#Profile2').show();
-     $('#status_profile').html('Profiel pauze, ' + record.profile_percent + '% gereed');
-    } else if (record.profile_state == 'DONE') {
-     $('#select_profile').jqxDropDownList({ disabled: true });
-     $('#select_profile').hide();
-     $('#info_mode').jqxDropDownList({ disabled: true });
-     $('#Profile1').jqxButton({ template: 'primary', value: 'Profiel Ok' });
-     $('#Profile1').show();
-     $('#Profile2').hide();
-     $('#status_profile').html('Profiel is gereed');
+    }
+
+    if (record.webcam_url != '') {
+     $('#Camera').show();
+    } else {
+     $('#Camera').hide();
+    }
+
+    var yl = record.yeast_lo;
+    var 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: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }]};
+    $('#gaugeContainer_air').jqxGauge(range);
+    $('#gaugeContainer_beer').jqxGauge(range);
+
+    $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: ' + 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 });
     }
-   } else {
-    $('#select_profile').show();
-    $('#select_profile').jqxDropDownList({ disabled: false });
-    $('#info_mode').jqxDropDownList({ disabled: false });
-    $('#Profile1').hide();
-    $('#Profile2').hide();
-    $('#status_profile').html('');
-   }
-   if (record.online && (record.webcam_url != '')) {
-    $('#Camera').show();
-   } else {
+    $('#gaugeContainer_beer').jqxGauge({ caption: { value: 'Bier: ' + record.beer_temperature.toFixed(3) }});
+    $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature });
+    if (record.beer_state == 'OK') {
+     $('#gaugeContainer_beer').jqxGauge({ disabled: false });
+    } else {
+     $('#gaugeContainer_beer').jqxGauge({ disabled: true });
+    }
+    $('#gaugeContainer_chiller').jqxGauge({ value: record.chiller_temperature });
+    if (record.chiller_state == 'OK') {
+     $('#gaugeContainer_chiller').jqxGauge({ disabled: false });
+    } else {
+     $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
+    }
+   } else { // offline
+    $('#info_online').html('Off-line');
+    $('#info_beer').html('');
+    $('#info_mode').hide();
+    $('#info_stage').hide();
+    $('#select_beer').hide();
+    $('#select_profile').hide();
+    $('.f_display,.f_control_switches,.f_control_leds').hide();
+    $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
+    $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
+    $('#gaugeContainer_air').jqxGauge({ disabled: true });
+    $('#gaugeContainer_beer').jqxGauge({ disabled: true });
+    $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
     $('#Camera').hide();
    }
-
-   yl = record.yeast_lo;
-   yh = record.yeast_hi;
-   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: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }]};
-   $('#gaugeContainer_air').jqxGauge(range);
-   $('#gaugeContainer_beer').jqxGauge(range);
-
-   $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: ' + 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: 'Bier: ' + record.beer_temperature.toFixed(3) }});
-   $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature });
-   if (record.beer_state == 'OK') {
-    $('#gaugeContainer_beer').jqxGauge({ disabled: false });
-   } else {
-    $('#gaugeContainer_beer').jqxGauge({ disabled: true });
-   }
-   $('#gaugeContainer_chiller').jqxGauge({ value: record.chiller_temperature });
-   if (record.chiller_state == 'OK') {
-    $('#gaugeContainer_chiller').jqxGauge({ disabled: false });
-   } else {
-    $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
-   }
-  }
- });
+ }
 
  $('#select_beer').jqxDropDownList({
   placeHolder: 'Kies bier:',
@@ -429,114 +448,24 @@
  $('#Profile1').hide(); // Hide these until they are needed.
  $('#Profile2').hide();
 
- function sendBase(stage, mode, tlo, thi) {
-
-  console.log('sendBase(' + stage + ', ' + mode + ', ' + tlo + ', ' + thi + ')');
-  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload={"stage":"' + stage;
-  data += '","mode":"' + mode + '","setpoint":{"low":' + tlo + ',"high":' + thi + '}}';
-  $.ajax({
-   url: 'cmd_fermenter.php',
-   data: data,
-   type: 'POST',
-   success: function(data) {},
-   error: function(jqXHR, textStatus, errorThrown) { console.log('sendBase() error'); }
-  });
- }
-
- function sendSwitch(sw1, sw2, sw3, sw4) {
-
-  console.log('sendSwitch(' + sw1 + ', ' + sw2 + ', ' + sw3 + ', ' + sw4 + ')');
-  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=';
-  data += '{"heater":{"state":' + sw1 + '},"cooler":{"state":' + sw2 + '},"fan":{"state":' + sw3 + '},"light":{"state":' + sw4 + '}}';
-  $.ajax({
-   url: 'cmd_fermenter.php',
-   data: data,
-   type: 'POST',
-   success: function(data) {},
-   error: function(jqXHR, textStatus, errorThrown) { console.log('sendSwitch() error'); }
-  });
- }
-
- function sendProduct(code, name, uuid, yeast_lo, yeast_hi) {
-
-  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 + '","yeast_lo":' + yeast_lo + ',"yeast_hi":' + yeast_hi + '}}';
-  $.ajax({
-   url: 'cmd_fermenter.php',
-   data: data,
-   type: 'POST',
-   success: function(data) {},
-   error: function(jqXHR, textStatus, errorThrown) { console.log('sendProduct() error'); }
-  });
- }
-
- function sendProfile(payload) {
-
-  console.log('sendProfile(' + payload + ')');
-  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=' + payload;
-  $.ajax({
-   url: 'cmd_fermenter.php',
-   data: data,
-   type: 'POST',
-   success: function(data) {},
-   error: function(jqXHR, textStatus, errorThrown) { console.log('sendProfile() error'); }
-  });
- }
-
-
  // Get the data immediatly and then at regular intervals to refresh.
  dataAdapter.dataBind();
- setInterval(function() {
-  var skip = false;
-  if (newBase) {
-   sendBase(record.stage, record.mode, record.setpoint_low, record.setpoint_high);
-   newBase = false;
-   skip = true;
-  }
-  if (newSwitch) {
-   sendSwitch(record.heater_state, record.cooler_state, record.fan_state, record.light_state);
-   newSwitch = false;
-   skip = true;
-  }
-  if (newProduct) {
-   sendProduct(record.beercode, record.beername, record.beeruuid, record.yeast_lo, record.yeast_hi);
-   newProduct = false;
-   skip = true;
-  }
-  if (newProfile) {
-   sendProfile(ppayload);
-   newProfile = false;
-   skip = true;
-  }
-  if (skip) {
-   schedule = 4; // 2 seconds wait to get the results
-  } else {
-   if (schedule > 0)
-    schedule--;
-  }
-
-  if (schedule <= 0) {
-   dataAdapter.dataBind();
-   schedule = 20;
-  }
- }, 500);
 
  $('#info_mode').on('select', function(event) {
-  var args = event.args;
-  if (args) {
-   record.mode = args.item.value;
-   $('#fermenter_toggle1').val(0);
-   $('#fermenter_toggle2').val(0);
-   $('#fermenter_toggle3').val(0);
+  if (event.args && event.args.item.value != record.mode) {
+   record.mode = event.args.item.value;
+   console.log('set mode ' + record.mode);
+   var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","mode":"' + record.mode + '"}';
+   websocket.send(msg);
   }
-  newBase = true;
  });
  $('#info_stage').on('select', function(event) {
-  var args = event.args;
-  if (args)
-   record.stage = args.item.value;
-  newBase = true;
+  if (event.args && event.args.item.value != record.stage) {
+   record.stage = event.args.item.value;
+   console.log('set stage ' + record.stage);
+   var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","stage":"' + record.stage + '"}';
+   websocket.send(msg);
+  }
  });
  $('#select_beer').on('select', function(event) {
   if (event.args) {
@@ -547,7 +476,11 @@
    record.beeruuid = datarecord.uuid;
    record.yeast_lo = datarecord.yeast_lo;
    record.yeast_hi = datarecord.yeast_hi;
-   newProduct = true;
+   console.log('set beer ' + record.beercode + ' ' + record.beername);
+   var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
+             '","beeruuid":"' + record.beeruuid + '","beercode":"' + record.beercode + '","beername":"' + record.beername +
+             '","yeast_lo":' + record.yeast_lo + ',"yeast_hi":' + record.yeast_hi + '}';
+   websocket.send(msg);
   }
  });
  $('#select_profile').on('select', function(event) {
@@ -556,9 +489,9 @@
    datarecord = profilelist.records[index],
    row, i;
    if (datarecord.record == -1) {
-    ppayload = '{"profile":null}';
+    ppayload = '","profile":null}';
    } else {
-    ppayload = '{"profile":{"uuid":"' + datarecord.uuid + '","name":"' + datarecord.name + '",';
+    ppayload = '","profile":{"uuid":"' + datarecord.uuid + '","name":"' + datarecord.name + '",';
     ppayload += '"inittemp":{"low":' + datarecord.inittemp_lo + ',"high":' + datarecord.inittemp_hi + '},';
     ppayload += '"fridgemode":' + datarecord.fridgemode + ',"steps":[';
     for (i = 0; i < datarecord.steps.length; i++) {
@@ -571,7 +504,8 @@
     }
     ppayload += ']}}';
    }
-   newProfile = true;
+   var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + ppayload;
+   websocket.send(msg);
   }
  });
 
@@ -582,7 +516,9 @@
    record.setpoint_high = record.setpoint_low;
    $('#target_hi').val(record.setpoint_high);
   }
-  newBase = true;
+  console.log('set setpoints ' + record.setpoint_low + ' ' + record.setpoint_high);
+  websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
+            '","setpoint_low":' + record.setpoint_low + ',"setpoint_high":' + record.setpoint_high + '}');
  });
  $('#target_hi').on('change', function(event) {
   record.setpoint_high = parseFloat(event.args.value);
@@ -591,72 +527,64 @@
    record.setpoint_low = record.setpoint_high;
    $('#target_lo').val(record.setpoint_low);
   }
-  newBase = true;
+  console.log('set setpoints ' + record.setpoint_low + ' ' + record.setpoint_high);
+  websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
+            '","setpoint_low":' + record.setpoint_low + ',"setpoint_high":' + record.setpoint_high + '}');
  });
 
  $('#fermenter_toggle1').on('checked', function(event) {
-  if (record.mode == 'NONE') {
-   record.heater_state = 0;
-   newSwitch = true;
+  if (record.mode == 'NONE' && record.heater_state != 0) {
+   console.log('set heater ' + $("#fermenter_toggle1").jqxSwitchButton('val'));
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","heater_state":0}');
   }
  });
  $('#fermenter_toggle1').on('unchecked', function(event) {
-  if (record.mode == 'NONE') {
-   record.heater_state = 100;
-   record.cooler_state = 0;
-   $('#fermenter_toggle2').val(0);
-   newSwitch = true;
+  if (record.mode == 'NONE' && record.heater_state == 0) {
+   console.log('set heater ' + $("#fermenter_toggle1").jqxSwitchButton('val'));
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","heater_state":100,"cooler_state":0}');
   }
  });
  $('#fermenter_toggle2').on('checked', function(event) {
-  if (record.mode == 'NONE') {
-   record.cooler_state = 0;
-   newSwitch = true;
+  if (record.mode == 'NONE' && record.cooler_state != 0) {
+   console.log('set cooler ' + $("#fermenter_toggle2").jqxSwitchButton('val'));
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","cooler_state":0}');
   }
  });
  $('#fermenter_toggle2').on('unchecked', function(event) {
-  if (record.mode == 'NONE') {
-   record.cooler_state = 100;
-   record.heater_state = 0;
-   $('#fermenter_toggle1').val(0);
-   newSwitch = true;
+  if (record.mode == 'NONE' & record.cooler_state == 0) {
+   console.log('set cooler ' + $("#fermenter_toggle2").jqxSwitchButton('val'));
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","cooler_state":100,"heater_state":0}');
   }
  });
  $('#fermenter_toggle3').on('checked', function(event) {
-  if (record.mode == 'NONE') {
-   record.fan_state = 0;
-   newSwitch = true;
+  if (record.mode == 'NONE' && record.fan_state != 0) {
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","fan_state":0}');
   }
  });
  $('#fermenter_toggle3').on('unchecked', function(event) {
-  if (record.mode == 'NONE') {
-   record.fan_state = 100;
-   newSwitch = true;
+  if (record.mode == 'NONE' && record.fan_state == 0) {
+   websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","fan_state":100}');
   }
  });
  $('#Profile1').click(function() {
   if (record.mode == 'PROFILE') {
    if (record.profile_state == 'OFF') {
-    ppayload = '{"profile":{"command":"start"}}';
-    newProfile = true;
+    websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"start"}}');
    } else if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
     // Open a popup to confirm this action.
     $('#eventWindow').jqxWindow('open');
     $('#delOk').click(function() {
-     ppayload = '{"profile":{"command":"abort"}}';
-     newProfile = true;
+     websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"abort"}}');
     });
    } else if (record.profile_state == 'DONE') {
-    ppayload = '{"profile":{"command":"done"}}';
-    newProfile = true;
+    websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"done"}}');
    }
   }
  });
  $('#Profile2').click(function() {
   if (record.mode == 'PROFILE') {
    if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
-    ppayload = '{"profile":{"command":"pause"}}';
-    newProfile = true;
+    websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"pause"}}');
    }
   }
  });
@@ -669,8 +597,61 @@
  $('#Camera').jqxButton({ template: 'primary', width: '150px', theme: theme });
  $('#Camera').click(function() {
   record.light_state = 100;
-  newSwitch = true;
   window.open(record.webcam_url);
  });
  createAbortElements();
+
+ websocket.onmessage = function(evt) {
+  var msg = evt.data;
+  var obj = JSON.parse(msg);
+
+  if (obj.device == "fermenters" && obj.node == record.node && obj.unit == record.alias) {
+   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.yeast_lo = obj.yeast_lo;
+    record.yeast_hi = obj.yeast_hi;
+    record.air_state = obj.air_state;
+    record.air_temperature = obj.air_temperature;
+    record.beer_state = obj.beer_state;
+    record.beer_temperature = obj.beer_temperature;
+    record.chiller_state = obj.chiller_state;
+    record.chiller_temperature = obj.chiller_temperature;
+    record.heater_state = obj.heater_state;
+    record.cooler_state = obj.cooler_state;
+    record.fan_state = obj.fan_state;
+    if (obj.door_address)
+     record.door_state = obj.door_state;
+    if (obj.light_address)
+     record.light_state = obj.light_state;
+    if (obj.psu_address)
+     record.psu_state = obj.psu_state;
+    record.mode = obj.mode;
+    record.stage = obj.stage;
+    record.alarm = obj.alarm;
+    record.setpoint_low = obj.setpoint_low;
+    record.setpoint_high = obj.setpoint_high;
+    record.webcam_url = obj.webcam_url;
+    record.webcam_light = obj.webcam_light;
+    if (obj.profile_name) {
+     record.profile_uuid = obj.profile_uuid;
+     record.profile_name = obj.profile_name;
+     record.profile_state = obj.profile_state;
+     record.profile_percent = obj.profile_percent;
+     record.profile_inittemp_high = obj.profile_inittemp_high;
+     record.profile_inittemp_low = obj.profile_inittemp_low;
+    } else {
+     record.profile_uuid = '';
+     record.profile_name = '';
+     record.profile_state = '';
+     record.profile_percent = 0;
+    }
+   }
+   updateScreen();
+  }
+  ws_global(msg);
+ }
 });

mercurial