Bump version to 0.2.10
This commit is contained in:
		@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "@vvzvlad/node-red-contrib-rn-combined-nodes",
 | 
					  "name": "@vvzvlad/node-red-contrib-rn-combined-nodes",
 | 
				
			||||||
  "version": "0.2.9",
 | 
					  "version": "0.2.10",
 | 
				
			||||||
  "description": "",
 | 
					  "description": "",
 | 
				
			||||||
  "main": "index.js",
 | 
					  "main": "index.js",
 | 
				
			||||||
  "keywords": [
 | 
					  "keywords": [
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										104
									
								
								thermostat.js
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								thermostat.js
									
									
									
									
									
								
							@ -12,7 +12,47 @@ module.exports = function(RED) {
 | 
				
			|||||||
        let debug = ""
 | 
					        let debug = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        context.set("pwm_timer", null);
 | 
				
			||||||
 | 
					        context.set("pwm_period", 30*60*1000);
 | 
				
			||||||
 | 
					        context.set("pwm_tick", 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function manage_pwm(duty_cycle_percent) {
 | 
				
			||||||
 | 
					            if (duty_cycle_percent === -1) {
 | 
				
			||||||
 | 
					                const pwm_timer = context.get("pwm_timer");
 | 
				
			||||||
 | 
					                if (pwm_timer !== null) {
 | 
				
			||||||
 | 
					                    clearInterval(pwm_timer);
 | 
				
			||||||
 | 
					                    context.set("pwm_timer", null);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const pwm_duty_cycle = Math.max(0, Math.min(1, duty_cycle_percent / 100));
 | 
				
			||||||
 | 
					            context.set("pwm_duty_cycle", pwm_duty_cycle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (context.get("pwm_timer") === null) {
 | 
				
			||||||
 | 
					                let cycle_start_time = Date.now();
 | 
				
			||||||
 | 
					                const pwm_tick = context.get("pwm_tick");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                const pwm_timer = setInterval(() => {
 | 
				
			||||||
 | 
					                    const pwm_period = context.get("pwm_period");
 | 
				
			||||||
 | 
					                    const elapsed_time = Date.now() - cycle_start_time;
 | 
				
			||||||
 | 
					                    const on_time = pwm_period * pwm_duty_cycle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (elapsed_time >= pwm_period) {
 | 
				
			||||||
 | 
					                        cycle_start_time = Date.now();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (elapsed_time < on_time) {
 | 
				
			||||||
 | 
					                        node.send([null, { payload: 1 }]);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        node.send([null, { payload: 0 }]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }, pwm_tick);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                context.set("pwm_timer", pwm_timer);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function debug_text(text) {
 | 
					        function debug_text(text) {
 | 
				
			||||||
            if (text === "return_debug") {
 | 
					            if (text === "return_debug") {
 | 
				
			||||||
@ -24,29 +64,6 @@ module.exports = function(RED) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function predict_temp_change(current_temp, time_interval) {
 | 
					 | 
				
			||||||
            let last_temp = context.get('last_temp') || null
 | 
					 | 
				
			||||||
            let last_temp_time = context.get('last_temp_time') || null
 | 
					 | 
				
			||||||
            if (last_temp === null || last_temp_time === null) {
 | 
					 | 
				
			||||||
                last_temp = current_temp
 | 
					 | 
				
			||||||
                last_temp_time = new Date().getTime()
 | 
					 | 
				
			||||||
                context.set('last_temp', last_temp)
 | 
					 | 
				
			||||||
                context.set('last_temp_time', last_temp_time)
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            const temp_diff = current_temp - last_temp
 | 
					 | 
				
			||||||
            const time_diff = (new Date().getTime() - last_temp_time) / 1000
 | 
					 | 
				
			||||||
            const rate_of_change = temp_diff / time_diff
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            last_temp = current_temp
 | 
					 | 
				
			||||||
            last_temp_time = new Date().getTime()
 | 
					 | 
				
			||||||
            context.set('last_temp', last_temp)
 | 
					 | 
				
			||||||
            context.set('last_temp_time', last_temp_time)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return current_temp + rate_of_change * time_interval
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        node.on('input', function(msg) {
 | 
					        node.on('input', function(msg) {
 | 
				
			||||||
@ -74,31 +91,6 @@ module.exports = function(RED) {
 | 
				
			|||||||
                    return
 | 
					                    return
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (control_mode === "auto-predict" && current_temp !== null && target_temp !== null) {
 | 
					 | 
				
			||||||
                    const predicted_temp = predict_temp_change(current_temp, 40)
 | 
					 | 
				
			||||||
                    if (window_state === "open" && window_mode === "cool") {
 | 
					 | 
				
			||||||
                        heater_status = 0
 | 
					 | 
				
			||||||
                        debug_text("Heater: w-open-cool/off")
 | 
					 | 
				
			||||||
                        return
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    if (window_state === "open" && window_mode === "heat") {
 | 
					 | 
				
			||||||
                        heater_status = 1
 | 
					 | 
				
			||||||
                        debug_text("Heater: w-open-heat/on")
 | 
					 | 
				
			||||||
                        return
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (window_state === "close") {
 | 
					 | 
				
			||||||
                        if (predicted_temp < target_temp) {
 | 
					 | 
				
			||||||
                            heater_status = 1
 | 
					 | 
				
			||||||
                            debug_text(`Heater: auto-predict/${"on"}`)
 | 
					 | 
				
			||||||
                        } else if (predicted_temp >= target_temp) {
 | 
					 | 
				
			||||||
                            heater_status = 0
 | 
					 | 
				
			||||||
                            debug_text(`Heater: auto-predict/${"off"}`)
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    return
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (control_mode === "auto" && current_temp !== null && target_temp !== null) {
 | 
					                if (control_mode === "auto" && current_temp !== null && target_temp !== null) {
 | 
				
			||||||
                    if (window_state === "open" && window_mode === "cool") {
 | 
					                    if (window_state === "open" && window_mode === "cool") {
 | 
				
			||||||
                        heater_status = 0
 | 
					                        heater_status = 0
 | 
				
			||||||
@ -124,10 +116,12 @@ module.exports = function(RED) {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return
 | 
					                    return
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (control_mode === "pwm" && current_temp !== null && target_temp !== null) {
 | 
				
			||||||
 | 
					                    manage_pwm(context.get("pwm_duty_cycle"))
 | 
				
			||||||
 | 
					                    return
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            debug_text(`W-mode: ${window_mode}`)
 | 
					            debug_text(`W-mode: ${window_mode}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -135,7 +129,7 @@ module.exports = function(RED) {
 | 
				
			|||||||
            let mqtt_control = topic.split('/')
 | 
					            let mqtt_control = topic.split('/')
 | 
				
			||||||
            if (mqtt_control.length === 3 && mqtt_control[0] === 'control') {
 | 
					            if (mqtt_control.length === 3 && mqtt_control[0] === 'control') {
 | 
				
			||||||
                if (mqtt_control[2] === node.zone || mqtt_control[2] === node.zone + "_" + node.room || mqtt_control[2] === "all") {
 | 
					                if (mqtt_control[2] === node.zone || mqtt_control[2] === node.zone + "_" + node.room || mqtt_control[2] === "all") {
 | 
				
			||||||
                    if (mqtt_control[1] === "window_mode_control" || mqtt_control[1] === "heat_mode_control") {
 | 
					                    if (mqtt_control[1] === "window_mode_control" || mqtt_control[1] === "heat_mode_control" || mqtt_control[1] === "pwm_control") {
 | 
				
			||||||
                        topic = mqtt_control[1]
 | 
					                        topic = mqtt_control[1]
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else return
 | 
					                    else return
 | 
				
			||||||
@ -148,11 +142,15 @@ module.exports = function(RED) {
 | 
				
			|||||||
                context.set("window_mode", window_mode)
 | 
					                context.set("window_mode", window_mode)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (topic === "heat_mode_control" && (payload === "on" || payload === "off" || payload === "auto" || payload === "auto-predict")) {
 | 
					            if (topic === "heat_mode_control" && (payload === "on" || payload === "off" || payload === "auto" || payload === "pwm")) {
 | 
				
			||||||
                control_mode = payload
 | 
					                control_mode = payload
 | 
				
			||||||
                context.set("control_mode", control_mode)
 | 
					                context.set("control_mode", control_mode)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (topic === "pwm_control") {
 | 
				
			||||||
 | 
					                context.set("pwm_duty_cycle", payload)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            debug_text(`W-state: ${window_state}`)
 | 
					            debug_text(`W-state: ${window_state}`)
 | 
				
			||||||
            if (topic === "window" && (payload === "open" || payload === "close")) {
 | 
					            if (topic === "window" && (payload === "open" || payload === "close")) {
 | 
				
			||||||
                window_state = payload
 | 
					                window_state = payload
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user