ramp-thermostat.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. module.exports = function(RED) {
  2. "use strict";
  3. function Profile(n) {
  4. RED.nodes.createNode(this,n);
  5. this.name = n.name;
  6. var timei, tempi, arr, minutes;
  7. this.points = {};
  8. var points_str = '{';
  9. for (var i=1; i<=10; i++) {
  10. timei = "time"+i;
  11. tempi = "temp"+i;
  12. if (typeof(n[timei]) !== "undefined" && n[timei] !== "") {
  13. arr = n[timei].split(":");
  14. minutes = parseInt(arr[0])*60 + parseInt(arr[1]);
  15. points_str += '"' + minutes + '":"' + n[tempi] + '",';
  16. }
  17. }
  18. points_str = points_str.slice(0,points_str.length-1);
  19. points_str += '}';
  20. //console.log(points_str);
  21. this.points = JSON.parse(points_str);
  22. }
  23. RED.nodes.registerType("profile",Profile);
  24. function RampThermostat(config) {
  25. RED.nodes.createNode(this,config);
  26. var node = this;
  27. this.profile = RED.nodes.getNode(config.profile);
  28. //node.warn(JSON.stringify(this.profile.points));
  29. this.on('input', function(msg) {
  30. var msg1 = {"topic":"state"};
  31. var msg2 = {"topic":"actual"};
  32. var msg3 = {"topic":"target"};
  33. var point_mins, pre_mins, pre_target, point_target, target, gradient;
  34. var date = new Date();
  35. var actual_mins = date.getHours()*60 + date.getMinutes();
  36. for (var k in this.profile.points) {
  37. point_mins = parseInt(k);
  38. //node.warn("mins " + point_mins + " temp " + this.profile.points[k]);
  39. point_target = parseFloat(this.profile.points[k]);
  40. if (actual_mins < point_mins) {
  41. gradient = (point_target - pre_target) / (point_mins - pre_mins);
  42. target = pre_target + (gradient * (actual_mins - pre_mins));
  43. target = target.toFixed(1);
  44. //node.warn(gradient + " target " + target);
  45. break;
  46. }
  47. pre_mins = point_mins;
  48. pre_target = point_target;
  49. }
  50. //node.warn("actual "+msg.payload+" target "+target);
  51. if (msg.payload < target) {
  52. msg1.payload = true;
  53. this.status({fill:"yellow",shape:"dot",text:msg.payload+" < "+target+" ("+this.profile.name+")"});
  54. } else {
  55. msg1.payload = false;
  56. this.status({fill:"grey",shape:"ring",text:msg.payload+" > "+target+" ("+this.profile.name+")"});
  57. }
  58. msg2.payload = msg.payload;
  59. msg3.payload = target;
  60. node.send([msg1, msg2, msg3]);
  61. });
  62. }
  63. RED.nodes.registerType("ramp-thermostat",RampThermostat);
  64. }