www/js/mon_fermenter.js

changeset 679
48f8f3fce7c0
parent 645
3b1510050c9b
child 682
f52b18a2a4d1
equal deleted inserted replaced
678:14322825cb3d 679:48f8f3fce7c0
44 $(document).ready(function() { 44 $(document).ready(function() {
45 45
46 var record = {}, 46 var record = {},
47 blank = {}, 47 blank = {},
48 ppayload = '', 48 ppayload = '',
49 newBase = false,
50 newProduct = false,
51 newSwitch = false,
52 newProfile = false,
53 schedule = 0,
54 yl = 12, // Normal yeast temp range 49 yl = 12, // Normal yeast temp range
55 yh = 24, 50 yh = 24,
56 51
57 productSource = { 52 productSource = {
58 datatype: 'json', 53 datatype: 'json',
83 row = records[i]; 78 row = records[i];
84 data.push(row); 79 data.push(row);
85 } 80 }
86 return data; 81 return data;
87 }, 82 },
88 loadError: function(jqXHR, status, error) { 83 loadError: function(jqXHR, status, error) { console.log(status + ' ' + error); },
89 $('#err').text(status + ' ' + error);
90 },
91 }), 84 }),
92 profileSource = { 85 profileSource = {
93 datatype: 'json', 86 datatype: 'json',
94 cache: false, 87 cache: false,
95 datafields: [ 88 datafields: [
112 empty = {}, i, row; 105 empty = {}, i, row;
113 // Create a dummy profile on top of the list. 106 // Create a dummy profile on top of the list.
114 empty['record'] = -1; 107 empty['record'] = -1;
115 empty['uuid'] = ''; 108 empty['uuid'] = '';
116 empty['name'] = 'Wis profiel'; 109 empty['name'] = 'Wis profiel';
117 empty['inittemp_lo'] = 20; 110 empty['inittemp_lo'] = 20.0;
118 empty['inittemp_hi'] = 20; 111 empty['inittemp_hi'] = 20.2;
119 empty['fridgemode'] = 0; 112 empty['fridgemode'] = 0;
120 empty['totalsteps'] = 0; 113 empty['totalsteps'] = 0;
121 empty['duration'] = 0; 114 empty['duration'] = 0;
122 empty['steps'] = '[]'; 115 empty['steps'] = '[]';
123 data.push(empty); 116 data.push(empty);
218 url: url 211 url: url
219 }, 212 },
220 dataAdapter = new $.jqx.dataAdapter(source, { 213 dataAdapter = new $.jqx.dataAdapter(source, {
221 loadComplete: function(records) { 214 loadComplete: function(records) {
222 record = dataAdapter.records[0]; 215 record = dataAdapter.records[0];
223 var range, oline = (record.online) ? 'On-line' : 'Off-line'; 216 updateScreen();
224 $('#info_uuid').html(record.uuid);
225 $('#info_system').html(record.node + '/' + record.alias);
226 $('#info_online').html(oline);
227 $('#info_beer').html(record.beercode + ' - ' + record.beername);
228 $('#info_mode').jqxDropDownList('selectItem', record.mode);
229 $('#info_stage').jqxDropDownList('selectItem', record.stage);
230 $('#info_profile').html(record.profile_name);
231 blank['name'] = record.alias; 217 blank['name'] = record.alias;
232 blank['code'] = record.alias.toUpperCase(); 218 blank['code'] = record.alias.toUpperCase();
233 blank['uuid'] = record.uuid; 219 blank['uuid'] = record.uuid;
234 if (record.profile_name == '') 220 }
235 $('#info_mode').jqxDropDownList('disableItem', 'PROFILE'); 221 });
236 else 222
237 $('#info_mode').jqxDropDownList('enableItem', 'PROFILE'); 223 function updateScreen() {
238 $('#target_lo').val(record.setpoint_low); 224 $('#info_uuid').html(record.uuid);
239 $('#target_hi').val(record.setpoint_high); 225 $('#info_system').html(record.node + '/' + record.alias);
240 if (record.online && ((record.mode == 'FRIDGE') || (record.mode == 'BEER'))) { 226
241 $('#target_lo').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true }); 227 if (record.online) {
242 $('#target_hi').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true }); 228 $('#info_online').html('On-line');
243 } else { 229 $('#info_beer').html(record.beercode + ' - ' + record.beername);
244 $('#target_lo').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false }); 230 $('#info_mode').jqxDropDownList('selectItem', record.mode);
245 $('#target_hi').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false }); 231 $('#info_stage').jqxDropDownList('selectItem', record.stage);
246 } 232 if (record.door_address) {
247 233 if (record.door_state != '0') {
248 if (record.online && record.door_address && (record.door_state != '0')) { 234 $('#fermenter_doorled').html('<div class="LEDyellow_on"></div>Door');
249 $('#fermenter_doorled').html('<div class="LEDyellow_on"></div>Door'); 235 } else {
250 } else { 236 $('#fermenter_doorled').html('<div class="LEDyellow_off"></div>Door');
251 $('#fermenter_doorled').html('<div class="LEDyellow_off"></div>Door'); 237 }
252 } 238 }
253 if (record.online && record.light_address && (record.light_state != '0')) { 239 if (record.light_address) {
254 $('#fermenter_lightled').html('<div class="LEDyellow_on"></div>Light'); 240 if (record.light_state != '0') {
255 } else { 241 $('#fermenter_lightled').html('<div class="LEDyellow_on"></div>Light');
256 $('#fermenter_lightled').html('<div class="LEDyellow_off"></div>Light'); 242 } else {
257 } 243 $('#fermenter_lightled').html('<div class="LEDyellow_off"></div>Light');
258 244 }
259 if (record.online && (record.mode != 'OFF')) { 245 }
260 $('#fermenter_powerled').html('<div class="LEDblue_on"></div>Power'); 246 if (record.mode != 'OFF') {
261 $('#select_beer').jqxDropDownList({ disabled: true }); 247 $('#fermenter_powerled').html('<div class="LEDblue_on"></div>Power');
262 $('#select_beer').jqxDropDownList('clearSelection'); 248 $('#select_beer').jqxDropDownList({ disabled: true });
263 $('#select_beer').hide(); 249 $('#select_beer').jqxDropDownList('clearSelection');
264 } else { 250 $('#select_beer').hide();
265 $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power'); 251 } else {
266 $('#select_beer').show(); 252 $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
267 $('#select_beer').jqxDropDownList({ disabled: false }); 253 $('#select_beer').show();
268 } 254 $('#select_beer').jqxDropDownList({ disabled: false });
269 if (record.online && (record.alarm != '0')) { 255 }
270 $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm'); 256 if (record.alarm != '0') {
271 } else { 257 $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
272 $('#fermenter_alarmled').html('<div class="LEDred_off"></div>Alarm'); 258 } else {
273 } 259 $('#fermenter_alarmled').html('<div class="LEDred_off"></div>Alarm');
274 260 }
275 if (record.online && (record.heater_state != '0')) { 261
276 $('#fermenter_led1').html('<div class="LEDgreen_on"></div>Heat'); 262 $('#target_lo').val(record.setpoint_low);
277 } else { 263 $('#target_hi').val(record.setpoint_high);
278 $('#fermenter_led1').html('<div class="LEDgreen_off"></div>Heat'); 264 if ((record.mode == 'FRIDGE') || (record.mode == 'BEER')) {
279 } 265 $('#target_lo').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
280 if (record.online && (record.cooler_state != '0')) { 266 $('#target_hi').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
281 $('#fermenter_led2').html('<div class="LEDgreen_on"></div>Cool'); 267 } else {
282 } else { 268 $('#target_lo').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
283 $('#fermenter_led2').html('<div class="LEDgreen_off"></div>Cool'); 269 $('#target_hi').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
284 } 270 }
285 if (record.online && (record.fan_state != '0')) { 271
286 $('#fermenter_led3').html('<div class="LEDgreen_on"></div>Fan'); 272 $('.f_control_leds').show();
287 } else { 273 if (record.heater_state != '0') {
288 $('#fermenter_led3').html('<div class="LEDgreen_off"></div>Fan'); 274 $('#fermenter_led1').html('<div class="LEDgreen_on"></div>Heat');
289 } 275 } else {
290 if (record.online && (record.mode == 'NONE')) { 276 $('#fermenter_led1').html('<div class="LEDgreen_off"></div>Heat');
291 $('#fermenter_toggle1').jqxSwitchButton('enable'); 277 }
292 $('#fermenter_toggle2').jqxSwitchButton('enable'); 278 if (record.cooler_state != '0') {
293 $('#fermenter_toggle3').jqxSwitchButton('enable'); 279 $('#fermenter_led2').html('<div class="LEDgreen_on"></div>Cool');
294 } else { 280 } else {
295 $('#fermenter_toggle1').jqxSwitchButton('disable'); 281 $('#fermenter_led2').html('<div class="LEDgreen_off"></div>Cool');
296 $('#fermenter_toggle2').jqxSwitchButton('disable'); 282 }
297 $('#fermenter_toggle3').jqxSwitchButton('disable'); 283 if (record.fan_state != '0') {
298 $('#fermenter_toggle1').val(record.heater_state != '0'); 284 $('#fermenter_led3').html('<div class="LEDgreen_on"></div>Fan');
299 $('#fermenter_toggle2').val(record.cooler_state != '0'); 285 } else {
300 $('#fermenter_toggle3').val(record.fan_state != '0'); 286 $('#fermenter_led3').html('<div class="LEDgreen_off"></div>Fan');
301 } 287 }
302 288
303 if (record.online && (record.mode == 'PROFILE')) { 289 if (record.mode == 'NONE') {
304 if (record.profile_state == 'OFF') { 290 $('.f_control_switches').show();
291 } else {
292 $('.f_control_switches').hide();
293 }
294 if ((record.heater_state != '0') != $('#fermenter_toggle1').jqxSwitchButton('val'))
295 $('#fermenter_toggle1').val(record.heater_state != '0');
296 if ((record.cooler_state != '0') != $('#fermenter_toggle2').jqxSwitchButton('val'))
297 $('#fermenter_toggle2').val(record.cooler_state != '0');
298 if ((record.fan_state != '0') != $('#fermenter_toggle3').jqxSwitchButton('val'))
299 $('#fermenter_toggle3').val(record.fan_state != '0');
300
301 $('#info_profile').html(record.profile_name);
302 if (record.profile_name == '')
303 $('#info_mode').jqxDropDownList('disableItem', 'PROFILE');
304 else
305 $('#info_mode').jqxDropDownList('enableItem', 'PROFILE');
306
307 if (record.mode == 'PROFILE') {
308 if (record.profile_state == 'OFF') {
309 $('#select_profile').show();
310 $('#select_profile').jqxDropDownList({ disabled: false });
311 $('#info_mode').jqxDropDownList({ disabled: false });
312 $('#Profile1').jqxButton({ template: 'success', value: 'Starten' });
313 $('#Profile1').show();
314 $('#Profile2').hide();
315 $('#status_profile').html('');
316 } else if (record.profile_state == 'RUN') {
317 $('#select_profile').jqxDropDownList({ disabled: true });
318 $('#select_profile').hide();
319 $('#info_mode').jqxDropDownList({ disabled: true });
320 $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
321 $('#Profile2').jqxButton({ template: 'primary', value: 'Pauze' });
322 $('#Profile1').show();
323 $('#Profile2').show();
324 $('#status_profile').html('Profiel actief, ' + record.profile_percent + '% gereed');
325 } else if (record.profile_state == 'PAUSE') {
326 $('#select_profile').jqxDropDownList({ disabled: true });
327 $('#select_profile').hide();
328 $('#info_mode').jqxDropDownList({ disabled: true });
329 $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
330 $('#Profile2').jqxButton({ template: 'success', value: 'Doorgaan' });
331 $('#Profile1').show();
332 $('#Profile2').show();
333 $('#status_profile').html('Profiel pauze, ' + record.profile_percent + '% gereed');
334 } else if (record.profile_state == 'DONE') {
335 $('#select_profile').jqxDropDownList({ disabled: true });
336 $('#select_profile').hide();
337 $('#info_mode').jqxDropDownList({ disabled: true });
338 $('#Profile1').jqxButton({ template: 'primary', value: 'Profiel Ok' });
339 $('#Profile1').show();
340 $('#Profile2').hide();
341 $('#status_profile').html('Profiel is gereed');
342 }
343 } else {
305 $('#select_profile').show(); 344 $('#select_profile').show();
306 $('#select_profile').jqxDropDownList({ disabled: false }); 345 $('#select_profile').jqxDropDownList({ disabled: false });
307 $('#info_mode').jqxDropDownList({ disabled: false }); 346 $('#info_mode').jqxDropDownList({ disabled: false });
308 $('#Profile1').jqxButton({ template: 'success', value: 'Starten' }); 347 $('#Profile1').hide();
309 $('#Profile1').show();
310 $('#Profile2').hide(); 348 $('#Profile2').hide();
311 $('#status_profile').html(''); 349 $('#status_profile').html('');
312 } else if (record.profile_state == 'RUN') { 350 }
313 $('#select_profile').jqxDropDownList({ disabled: true }); 351
314 $('#select_profile').hide(); 352 if (record.webcam_url != '') {
315 $('#info_mode').jqxDropDownList({ disabled: true }); 353 $('#Camera').show();
316 $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' }); 354 } else {
317 $('#Profile2').jqxButton({ template: 'primary', value: 'Pauze' }); 355 $('#Camera').hide();
318 $('#Profile1').show(); 356 }
319 $('#Profile2').show(); 357
320 $('#status_profile').html('Profiel actief, ' + record.profile_percent + '% gereed'); 358 var yl = record.yeast_lo;
321 } else if (record.profile_state == 'PAUSE') { 359 var yh = record.yeast_hi;
322 $('#select_profile').jqxDropDownList({ disabled: true }); 360 var range = { ranges: [{ startValue: 0, endValue: yl, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 },
323 $('#select_profile').hide(); 361 { startValue: yl, endValue: yh, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 },
324 $('#info_mode').jqxDropDownList({ disabled: true }); 362 { startValue: yh, endValue: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }]};
325 $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' }); 363 $('#gaugeContainer_air').jqxGauge(range);
326 $('#Profile2').jqxButton({ template: 'success', value: 'Doorgaan' }); 364 $('#gaugeContainer_beer').jqxGauge(range);
327 $('#Profile1').show(); 365
328 $('#Profile2').show(); 366 $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: ' + record.air_temperature.toFixed(3) }});
329 $('#status_profile').html('Profiel pauze, ' + record.profile_percent + '% gereed'); 367 $('#gaugeContainer_air').jqxGauge({ value: record.air_temperature });
330 } else if (record.profile_state == 'DONE') { 368 if (record.air_state == 'OK') {
331 $('#select_profile').jqxDropDownList({ disabled: true }); 369 $('#gaugeContainer_air').jqxGauge({ disabled: false });
332 $('#select_profile').hide(); 370 } else {
333 $('#info_mode').jqxDropDownList({ disabled: true }); 371 $('#gaugeContainer_air').jqxGauge({ disabled: true });
334 $('#Profile1').jqxButton({ template: 'primary', value: 'Profiel Ok' }); 372 }
335 $('#Profile1').show(); 373 $('#gaugeContainer_beer').jqxGauge({ caption: { value: 'Bier: ' + record.beer_temperature.toFixed(3) }});
336 $('#Profile2').hide(); 374 $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature });
337 $('#status_profile').html('Profiel is gereed'); 375 if (record.beer_state == 'OK') {
338 } 376 $('#gaugeContainer_beer').jqxGauge({ disabled: false });
339 } else { 377 } else {
340 $('#select_profile').show(); 378 $('#gaugeContainer_beer').jqxGauge({ disabled: true });
341 $('#select_profile').jqxDropDownList({ disabled: false }); 379 }
342 $('#info_mode').jqxDropDownList({ disabled: false }); 380 $('#gaugeContainer_chiller').jqxGauge({ value: record.chiller_temperature });
343 $('#Profile1').hide(); 381 if (record.chiller_state == 'OK') {
344 $('#Profile2').hide(); 382 $('#gaugeContainer_chiller').jqxGauge({ disabled: false });
345 $('#status_profile').html(''); 383 } else {
346 } 384 $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
347 if (record.online && (record.webcam_url != '')) { 385 }
348 $('#Camera').show(); 386 } else { // offline
349 } else { 387 $('#info_online').html('Off-line');
388 $('#info_beer').html('');
389 $('#info_mode').hide();
390 $('#info_stage').hide();
391 $('#select_beer').hide();
392 $('#select_profile').hide();
393 $('.f_display,.f_control_switches,.f_control_leds').hide();
394 $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
395 $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
396 $('#gaugeContainer_air').jqxGauge({ disabled: true });
397 $('#gaugeContainer_beer').jqxGauge({ disabled: true });
398 $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
350 $('#Camera').hide(); 399 $('#Camera').hide();
351 } 400 }
352 401 }
353 yl = record.yeast_lo;
354 yh = record.yeast_hi;
355 range = { ranges: [{ startValue: 0, endValue: yl, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 },
356 { startValue: yl, endValue: yh, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 },
357 { startValue: yh, endValue: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }]};
358 $('#gaugeContainer_air').jqxGauge(range);
359 $('#gaugeContainer_beer').jqxGauge(range);
360
361 $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: ' + record.air_temperature.toFixed(3) }});
362 $('#gaugeContainer_air').jqxGauge({ value: record.air_temperature });
363 if (record.air_state == 'OK') {
364 $('#gaugeContainer_air').jqxGauge({ disabled: false });
365 } else {
366 $('#gaugeContainer_air').jqxGauge({ disabled: true });
367 }
368 $('#gaugeContainer_beer').jqxGauge({ caption: { value: 'Bier: ' + record.beer_temperature.toFixed(3) }});
369 $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature });
370 if (record.beer_state == 'OK') {
371 $('#gaugeContainer_beer').jqxGauge({ disabled: false });
372 } else {
373 $('#gaugeContainer_beer').jqxGauge({ disabled: true });
374 }
375 $('#gaugeContainer_chiller').jqxGauge({ value: record.chiller_temperature });
376 if (record.chiller_state == 'OK') {
377 $('#gaugeContainer_chiller').jqxGauge({ disabled: false });
378 } else {
379 $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
380 }
381 }
382 });
383 402
384 $('#select_beer').jqxDropDownList({ 403 $('#select_beer').jqxDropDownList({
385 placeHolder: 'Kies bier:', 404 placeHolder: 'Kies bier:',
386 theme: theme, 405 theme: theme,
387 source: productlist, 406 source: productlist,
427 $('#Profile1').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme }); 446 $('#Profile1').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme });
428 $('#Profile2').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme }); 447 $('#Profile2').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme });
429 $('#Profile1').hide(); // Hide these until they are needed. 448 $('#Profile1').hide(); // Hide these until they are needed.
430 $('#Profile2').hide(); 449 $('#Profile2').hide();
431 450
432 function sendBase(stage, mode, tlo, thi) {
433
434 console.log('sendBase(' + stage + ', ' + mode + ', ' + tlo + ', ' + thi + ')');
435 var data = 'node=' + record.node + '&alias=' + record.alias + '&payload={"stage":"' + stage;
436 data += '","mode":"' + mode + '","setpoint":{"low":' + tlo + ',"high":' + thi + '}}';
437 $.ajax({
438 url: 'cmd_fermenter.php',
439 data: data,
440 type: 'POST',
441 success: function(data) {},
442 error: function(jqXHR, textStatus, errorThrown) { console.log('sendBase() error'); }
443 });
444 }
445
446 function sendSwitch(sw1, sw2, sw3, sw4) {
447
448 console.log('sendSwitch(' + sw1 + ', ' + sw2 + ', ' + sw3 + ', ' + sw4 + ')');
449 var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=';
450 data += '{"heater":{"state":' + sw1 + '},"cooler":{"state":' + sw2 + '},"fan":{"state":' + sw3 + '},"light":{"state":' + sw4 + '}}';
451 $.ajax({
452 url: 'cmd_fermenter.php',
453 data: data,
454 type: 'POST',
455 success: function(data) {},
456 error: function(jqXHR, textStatus, errorThrown) { console.log('sendSwitch() error'); }
457 });
458 }
459
460 function sendProduct(code, name, uuid, yeast_lo, yeast_hi) {
461
462 console.log('sendProduct(' + code + ', ' + name + ', ' + uuid + ', ' + yeast_lo + ', ' + yeast_hi + ')');
463 var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=';
464 data += '{"product":{"code":"' + code + '","name":"' + name + '","uuid":"' + uuid + '","yeast_lo":' + yeast_lo + ',"yeast_hi":' + yeast_hi + '}}';
465 $.ajax({
466 url: 'cmd_fermenter.php',
467 data: data,
468 type: 'POST',
469 success: function(data) {},
470 error: function(jqXHR, textStatus, errorThrown) { console.log('sendProduct() error'); }
471 });
472 }
473
474 function sendProfile(payload) {
475
476 console.log('sendProfile(' + payload + ')');
477 var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=' + payload;
478 $.ajax({
479 url: 'cmd_fermenter.php',
480 data: data,
481 type: 'POST',
482 success: function(data) {},
483 error: function(jqXHR, textStatus, errorThrown) { console.log('sendProfile() error'); }
484 });
485 }
486
487
488 // Get the data immediatly and then at regular intervals to refresh. 451 // Get the data immediatly and then at regular intervals to refresh.
489 dataAdapter.dataBind(); 452 dataAdapter.dataBind();
490 setInterval(function() {
491 var skip = false;
492 if (newBase) {
493 sendBase(record.stage, record.mode, record.setpoint_low, record.setpoint_high);
494 newBase = false;
495 skip = true;
496 }
497 if (newSwitch) {
498 sendSwitch(record.heater_state, record.cooler_state, record.fan_state, record.light_state);
499 newSwitch = false;
500 skip = true;
501 }
502 if (newProduct) {
503 sendProduct(record.beercode, record.beername, record.beeruuid, record.yeast_lo, record.yeast_hi);
504 newProduct = false;
505 skip = true;
506 }
507 if (newProfile) {
508 sendProfile(ppayload);
509 newProfile = false;
510 skip = true;
511 }
512 if (skip) {
513 schedule = 4; // 2 seconds wait to get the results
514 } else {
515 if (schedule > 0)
516 schedule--;
517 }
518
519 if (schedule <= 0) {
520 dataAdapter.dataBind();
521 schedule = 20;
522 }
523 }, 500);
524 453
525 $('#info_mode').on('select', function(event) { 454 $('#info_mode').on('select', function(event) {
526 var args = event.args; 455 if (event.args && event.args.item.value != record.mode) {
527 if (args) { 456 record.mode = event.args.item.value;
528 record.mode = args.item.value; 457 console.log('set mode ' + record.mode);
529 $('#fermenter_toggle1').val(0); 458 var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","mode":"' + record.mode + '"}';
530 $('#fermenter_toggle2').val(0); 459 websocket.send(msg);
531 $('#fermenter_toggle3').val(0); 460 }
532 }
533 newBase = true;
534 }); 461 });
535 $('#info_stage').on('select', function(event) { 462 $('#info_stage').on('select', function(event) {
536 var args = event.args; 463 if (event.args && event.args.item.value != record.stage) {
537 if (args) 464 record.stage = event.args.item.value;
538 record.stage = args.item.value; 465 console.log('set stage ' + record.stage);
539 newBase = true; 466 var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","stage":"' + record.stage + '"}';
467 websocket.send(msg);
468 }
540 }); 469 });
541 $('#select_beer').on('select', function(event) { 470 $('#select_beer').on('select', function(event) {
542 if (event.args) { 471 if (event.args) {
543 var index = event.args.index, 472 var index = event.args.index,
544 datarecord = productlist.records[index]; 473 datarecord = productlist.records[index];
545 record.beercode = datarecord.code; 474 record.beercode = datarecord.code;
546 record.beername = datarecord.name; 475 record.beername = datarecord.name;
547 record.beeruuid = datarecord.uuid; 476 record.beeruuid = datarecord.uuid;
548 record.yeast_lo = datarecord.yeast_lo; 477 record.yeast_lo = datarecord.yeast_lo;
549 record.yeast_hi = datarecord.yeast_hi; 478 record.yeast_hi = datarecord.yeast_hi;
550 newProduct = true; 479 console.log('set beer ' + record.beercode + ' ' + record.beername);
480 var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
481 '","beeruuid":"' + record.beeruuid + '","beercode":"' + record.beercode + '","beername":"' + record.beername +
482 '","yeast_lo":' + record.yeast_lo + ',"yeast_hi":' + record.yeast_hi + '}';
483 websocket.send(msg);
551 } 484 }
552 }); 485 });
553 $('#select_profile').on('select', function(event) { 486 $('#select_profile').on('select', function(event) {
554 if (event.args) { 487 if (event.args) {
555 var index = event.args.index, 488 var index = event.args.index,
556 datarecord = profilelist.records[index], 489 datarecord = profilelist.records[index],
557 row, i; 490 row, i;
558 if (datarecord.record == -1) { 491 if (datarecord.record == -1) {
559 ppayload = '{"profile":null}'; 492 ppayload = '","profile":null}';
560 } else { 493 } else {
561 ppayload = '{"profile":{"uuid":"' + datarecord.uuid + '","name":"' + datarecord.name + '",'; 494 ppayload = '","profile":{"uuid":"' + datarecord.uuid + '","name":"' + datarecord.name + '",';
562 ppayload += '"inittemp":{"low":' + datarecord.inittemp_lo + ',"high":' + datarecord.inittemp_hi + '},'; 495 ppayload += '"inittemp":{"low":' + datarecord.inittemp_lo + ',"high":' + datarecord.inittemp_hi + '},';
563 ppayload += '"fridgemode":' + datarecord.fridgemode + ',"steps":['; 496 ppayload += '"fridgemode":' + datarecord.fridgemode + ',"steps":[';
564 for (i = 0; i < datarecord.steps.length; i++) { 497 for (i = 0; i < datarecord.steps.length; i++) {
565 row = datarecord.steps[i]; 498 row = datarecord.steps[i];
566 if (i > 0) 499 if (i > 0)
569 ppayload += ',"target_lo":' + row['target_lo'] + ',"target_hi":' + row['target_hi']; 502 ppayload += ',"target_lo":' + row['target_lo'] + ',"target_hi":' + row['target_hi'];
570 ppayload += ',"fridgemode":' + row['fridgemode'] + ',"name":"' + row['name'] + '"}'; 503 ppayload += ',"fridgemode":' + row['fridgemode'] + ',"name":"' + row['name'] + '"}';
571 } 504 }
572 ppayload += ']}}'; 505 ppayload += ']}}';
573 } 506 }
574 newProfile = true; 507 var msg = '{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + ppayload;
508 websocket.send(msg);
575 } 509 }
576 }); 510 });
577 511
578 $('#target_lo').on('change', function(event) { 512 $('#target_lo').on('change', function(event) {
579 record.setpoint_low = parseFloat(event.args.value); 513 record.setpoint_low = parseFloat(event.args.value);
580 // Keep the high target above the low. 514 // Keep the high target above the low.
581 if (record.setpoint_low > record.setpoint_high) { 515 if (record.setpoint_low > record.setpoint_high) {
582 record.setpoint_high = record.setpoint_low; 516 record.setpoint_high = record.setpoint_low;
583 $('#target_hi').val(record.setpoint_high); 517 $('#target_hi').val(record.setpoint_high);
584 } 518 }
585 newBase = true; 519 console.log('set setpoints ' + record.setpoint_low + ' ' + record.setpoint_high);
520 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
521 '","setpoint_low":' + record.setpoint_low + ',"setpoint_high":' + record.setpoint_high + '}');
586 }); 522 });
587 $('#target_hi').on('change', function(event) { 523 $('#target_hi').on('change', function(event) {
588 record.setpoint_high = parseFloat(event.args.value); 524 record.setpoint_high = parseFloat(event.args.value);
589 // Keep the low target below the high. 525 // Keep the low target below the high.
590 if (record.setpoint_high < record.setpoint_low) { 526 if (record.setpoint_high < record.setpoint_low) {
591 record.setpoint_low = record.setpoint_high; 527 record.setpoint_low = record.setpoint_high;
592 $('#target_lo').val(record.setpoint_low); 528 $('#target_lo').val(record.setpoint_low);
593 } 529 }
594 newBase = true; 530 console.log('set setpoints ' + record.setpoint_low + ' ' + record.setpoint_high);
531 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias +
532 '","setpoint_low":' + record.setpoint_low + ',"setpoint_high":' + record.setpoint_high + '}');
595 }); 533 });
596 534
597 $('#fermenter_toggle1').on('checked', function(event) { 535 $('#fermenter_toggle1').on('checked', function(event) {
598 if (record.mode == 'NONE') { 536 if (record.mode == 'NONE' && record.heater_state != 0) {
599 record.heater_state = 0; 537 console.log('set heater ' + $("#fermenter_toggle1").jqxSwitchButton('val'));
600 newSwitch = true; 538 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","heater_state":0}');
601 } 539 }
602 }); 540 });
603 $('#fermenter_toggle1').on('unchecked', function(event) { 541 $('#fermenter_toggle1').on('unchecked', function(event) {
604 if (record.mode == 'NONE') { 542 if (record.mode == 'NONE' && record.heater_state == 0) {
605 record.heater_state = 100; 543 console.log('set heater ' + $("#fermenter_toggle1").jqxSwitchButton('val'));
606 record.cooler_state = 0; 544 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","heater_state":100,"cooler_state":0}');
607 $('#fermenter_toggle2').val(0);
608 newSwitch = true;
609 } 545 }
610 }); 546 });
611 $('#fermenter_toggle2').on('checked', function(event) { 547 $('#fermenter_toggle2').on('checked', function(event) {
612 if (record.mode == 'NONE') { 548 if (record.mode == 'NONE' && record.cooler_state != 0) {
613 record.cooler_state = 0; 549 console.log('set cooler ' + $("#fermenter_toggle2").jqxSwitchButton('val'));
614 newSwitch = true; 550 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","cooler_state":0}');
615 } 551 }
616 }); 552 });
617 $('#fermenter_toggle2').on('unchecked', function(event) { 553 $('#fermenter_toggle2').on('unchecked', function(event) {
618 if (record.mode == 'NONE') { 554 if (record.mode == 'NONE' & record.cooler_state == 0) {
619 record.cooler_state = 100; 555 console.log('set cooler ' + $("#fermenter_toggle2").jqxSwitchButton('val'));
620 record.heater_state = 0; 556 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","cooler_state":100,"heater_state":0}');
621 $('#fermenter_toggle1').val(0);
622 newSwitch = true;
623 } 557 }
624 }); 558 });
625 $('#fermenter_toggle3').on('checked', function(event) { 559 $('#fermenter_toggle3').on('checked', function(event) {
626 if (record.mode == 'NONE') { 560 if (record.mode == 'NONE' && record.fan_state != 0) {
627 record.fan_state = 0; 561 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","fan_state":0}');
628 newSwitch = true;
629 } 562 }
630 }); 563 });
631 $('#fermenter_toggle3').on('unchecked', function(event) { 564 $('#fermenter_toggle3').on('unchecked', function(event) {
632 if (record.mode == 'NONE') { 565 if (record.mode == 'NONE' && record.fan_state == 0) {
633 record.fan_state = 100; 566 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","fan_state":100}');
634 newSwitch = true;
635 } 567 }
636 }); 568 });
637 $('#Profile1').click(function() { 569 $('#Profile1').click(function() {
638 if (record.mode == 'PROFILE') { 570 if (record.mode == 'PROFILE') {
639 if (record.profile_state == 'OFF') { 571 if (record.profile_state == 'OFF') {
640 ppayload = '{"profile":{"command":"start"}}'; 572 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"start"}}');
641 newProfile = true;
642 } else if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) { 573 } else if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
643 // Open a popup to confirm this action. 574 // Open a popup to confirm this action.
644 $('#eventWindow').jqxWindow('open'); 575 $('#eventWindow').jqxWindow('open');
645 $('#delOk').click(function() { 576 $('#delOk').click(function() {
646 ppayload = '{"profile":{"command":"abort"}}'; 577 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"abort"}}');
647 newProfile = true;
648 }); 578 });
649 } else if (record.profile_state == 'DONE') { 579 } else if (record.profile_state == 'DONE') {
650 ppayload = '{"profile":{"command":"done"}}'; 580 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"done"}}');
651 newProfile = true;
652 } 581 }
653 } 582 }
654 }); 583 });
655 $('#Profile2').click(function() { 584 $('#Profile2').click(function() {
656 if (record.mode == 'PROFILE') { 585 if (record.mode == 'PROFILE') {
657 if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) { 586 if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
658 ppayload = '{"profile":{"command":"pause"}}'; 587 websocket.send('{"device":"fermenters","node":"' + record.node + '","unit":"' + record.alias + '","profile":{"command":"pause"}}');
659 newProfile = true;
660 } 588 }
661 } 589 }
662 }); 590 });
663 591
664 // The chart button. 592 // The chart button.
667 window.open('log_fermentation.php?code=' + record.beercode + '&name=' + record.beername); 595 window.open('log_fermentation.php?code=' + record.beercode + '&name=' + record.beername);
668 }); 596 });
669 $('#Camera').jqxButton({ template: 'primary', width: '150px', theme: theme }); 597 $('#Camera').jqxButton({ template: 'primary', width: '150px', theme: theme });
670 $('#Camera').click(function() { 598 $('#Camera').click(function() {
671 record.light_state = 100; 599 record.light_state = 100;
672 newSwitch = true;
673 window.open(record.webcam_url); 600 window.open(record.webcam_url);
674 }); 601 });
675 createAbortElements(); 602 createAbortElements();
603
604 websocket.onmessage = function(evt) {
605 var msg = evt.data;
606 var obj = JSON.parse(msg);
607
608 if (obj.device == "fermenters" && obj.node == record.node && obj.unit == record.alias) {
609 console.log('ws got this device ' + msg);
610 record.online = obj.online;
611 if (obj.online) {
612 record.beeruuid = obj.beeruuid;
613 record.beercode = obj.beercode;
614 record.beername = obj.beername;
615 record.yeast_lo = obj.yeast_lo;
616 record.yeast_hi = obj.yeast_hi;
617 record.air_state = obj.air_state;
618 record.air_temperature = obj.air_temperature;
619 record.beer_state = obj.beer_state;
620 record.beer_temperature = obj.beer_temperature;
621 record.chiller_state = obj.chiller_state;
622 record.chiller_temperature = obj.chiller_temperature;
623 record.heater_state = obj.heater_state;
624 record.cooler_state = obj.cooler_state;
625 record.fan_state = obj.fan_state;
626 if (obj.door_address)
627 record.door_state = obj.door_state;
628 if (obj.light_address)
629 record.light_state = obj.light_state;
630 if (obj.psu_address)
631 record.psu_state = obj.psu_state;
632 record.mode = obj.mode;
633 record.stage = obj.stage;
634 record.alarm = obj.alarm;
635 record.setpoint_low = obj.setpoint_low;
636 record.setpoint_high = obj.setpoint_high;
637 record.webcam_url = obj.webcam_url;
638 record.webcam_light = obj.webcam_light;
639 if (obj.profile_name) {
640 record.profile_uuid = obj.profile_uuid;
641 record.profile_name = obj.profile_name;
642 record.profile_state = obj.profile_state;
643 record.profile_percent = obj.profile_percent;
644 record.profile_inittemp_high = obj.profile_inittemp_high;
645 record.profile_inittemp_low = obj.profile_inittemp_low;
646 } else {
647 record.profile_uuid = '';
648 record.profile_name = '';
649 record.profile_state = '';
650 record.profile_percent = 0;
651 }
652 }
653 updateScreen();
654 }
655 ws_global(msg);
656 }
676 }); 657 });

mercurial