Bump version to 0.2.10

This commit is contained in:
vvzvlad 2023-10-05 23:21:13 +03:00
parent 9acc55f01e
commit 73c71be853
2 changed files with 52 additions and 54 deletions

View File

@ -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": [

View File

@ -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