Systemair SAVECare Ventilation unit

Delivered power + energy & Outdoor compensated supply temperature:

Delivered power:
From i got the unit installed late last summer i somehow wondered how much power and energy the unit deliver compared to the power and enrgy it uses. After some googling it seemed like “Sensible heat” is a way of calculating delivered power, after some head scratching/Node Red learning i managed to make the calculations. This is a new area for me so id like to share my findings/way of estimate added power+energy and true added power+energy. I was looking for a estimate of how efficient the unit is, by that i have calculated estimated delivered kW/10s and accumulate kW/10s each 10 sec. To give the “true delivered” energy i just subtracted the energy consumption. Do anyone have the knowledge if “Sensible heat” and “Energy consumption” is comparable?
Code etc. shared further below.
Ref. pictures below: The accumulation was not reset during last night and continued counting from yesterdays value because the Windows host rebooted at about 23:00 yesterday… Thats why the reset failed and there is a straight line in the trends. To be “fixed” by relocating HA to Intel Nuc sometime in the future.

Outdoor compensated supply temperature:
Instead of manually setting the temperature setpoint Id like the supply temperature to be adjusted automatically according to outdoor temperature changes, its probably not gona have much to say with the indoor temperature but it will prevent the heat exchanger from running when it’s not nessecary and maybe extend its lifetime. So i did some plots on the calculator (Stat) and made the calculator find the formula and constants. Then some more head scratching/Node Red learning had to be done. What i want is to have the X and Y plots as temperature setpoints, does anyone know how this is achievable with Node Red?
Code below:

Delivered power:
image
image

// hs := cp*ρ*q*dt   
// Eks.= (1.006 kJ/kg°C) (1.202 kg/m3) (1 m3/s) ((20°C) - (0°C)) 

//hs := sensible heat (kW)
//cp := specific heat of air (1.006 kJ/kg°C)
//p  := density of air (1.202 kg/m3)  or "press/(Rspecific*t)"
//q  := air volume flow (m3/s)
//dt := delta temperature delta [°C]
//press  := absolute pressure (Pa)
//t  := absolute temperature (kelvin)
//Rspecific := specific gas constant for dry air (J/(kg'K)) [Rspec]


var q_pv = flow.get ("vtr300_tilluftsvifte_pv","default");
var t_supply = flow.get ("vtr300_tillufts_temperatur","default");
var t_inlet = flow.get ("vtr300_inntak_temp","default");
var press = 101325;
var t = t_inlet + 273.15;
var Rspec = 287;

// Sjekker for "isNotNumber, ved "isNan" (opretting av Modbus kom./feil sensor data) tidlig "exit" (prøv igjen).
  if (isNaN(q_pv) || isNaN(t_supply) || isNaN(t_inlet) || isNaN(t)) {
    return;
  }

var cp = 1.006;
//var p = 1.202; 
var p = press/(Rspec*t);
var q = (q_pv * 3)/3600;  
var dt = t_supply - t_inlet;
var hs = cp*p*q*dt;

// Lagrer watt og kW til memory for videreberegning av faktisk levert estimert effekt
flow.set("vtr300_tilført_Watt", hs*1000,"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWatt", hs,"default");  // Lagrer tilført kW til "memory/default"

// Estimert levert effekt & energi total
var watt = {payload:(hs*1000).toFixed(0)};
var kW = {payload:(hs).toFixed(2)};
var kW_10s = {payload:(hs/360)}; // kW/10s

// Tilpasser desimaler for attribute visning i HA
flow.set("vtr300_tilført_Watt_formated", (hs*1000).toFixed(0) +' Watt',"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWatt_formated", (hs).toFixed(2) +' kW',"default");  // Lagrer tilført kW til "memory/default"

return [watt,kW,kW_10s];

Delivered energy:
image

// Polles hvert 10s pga. payload = "kW/10s"

var kW_10s = msg.payload;
var Previous_kWh_tot = flow.get ("vtr300_tilført_kWh_cnt_tot","default"); // Total eneregiteller - Flytter siste akkumulerte verdi til forrige verdi
var Previous_kWh_tot_daily = flow.get ("vtr300_tilført_kWh_cnt_tot_daily","default"); // Daglig energi
var Previous_kWh_tot_weekly = flow.get ("vtr300_tilført_kWh_cnt_tot_weekly","default"); // Ukentlig energi
var Previous_kWh_tot_monthly = flow.get ("vtr300_tilført_kWh_cnt_tot_monthly","default"); // Månedlig energi
var Previous_kWh_tot_yearly = flow.get ("vtr300_tilført_kWh_cnt_tot_yearly","default"); // Årlig energi

var kWh_tot;
var kWh_tot_daily;
var kWh_tot_weekly;
var kWh_tot_monthly;
var kWh_tot_yearly;

// Totalteller energi - Initilialiser verdi dersom udefinert/første gang verdi settes
if (Previous_kWh_tot == undefined) { 
  kWh_tot = 0.0;
}
// Totalteller energi - Akkumulerer forrige verdi med ny verdi
else {
  kWh_tot = Previous_kWh_tot + kW_10s;
}

// Daglig energi - Initilialiser verdi dersom udefinert/første gang verdi settes
if (Previous_kWh_tot_daily == undefined) { 
  kWh_tot_daily = 0.0;
}
// Daglig energi - Akkumulerer forrige verdi med ny verdi
else {
  kWh_tot_daily = Previous_kWh_tot_daily + kW_10s;
}

// Ukentlig energi - Initilialiser verdi dersom udefinert/første gang verdi settes
if (Previous_kWh_tot_weekly == undefined) { 
  kWh_tot_weekly = 0.0;
}
// Ukentlig energi - Akkumulerer forrige verdi med ny verdi
else {
  kWh_tot_weekly = Previous_kWh_tot_weekly + kW_10s;
}

// Månedlig energi - Initilialiser verdi dersom udefinert/første gang verdi settes
if (Previous_kWh_tot_monthly == undefined) { 
  kWh_tot_monthly = 0.0;
}
// Månedlig energi - Akkumulerer forrige verdi med ny verdi
else {
  kWh_tot_monthly = Previous_kWh_tot_monthly + kW_10s;
}

// Årlig energi - Initilialiser verdi dersom udefinert/første gang verdi settes
if (Previous_kWh_tot_yearly == undefined) { 
  kWh_tot_yearly = 0.0;
}
// Årlig energi - Akkumulerer forrige verdi med ny verdi
else {
  kWh_tot_yearly = Previous_kWh_tot_yearly + kW_10s;
}

//Oppdaterer med nyeste akkumulerte verdi (Scantid må være 10s pga. mottatt verdi er kW/10s)
flow.set("vtr300_tilført_kWh_cnt_tot", kWh_tot,"default");                 // Total eneregiteller - Akkumulering i "memory/default", restore fra "file"
flow.set("vtr300_tilført_kWh_cnt_tot_daily", kWh_tot_daily,"default");     // Daglig energi - Akkumulert
flow.set("vtr300_tilført_kWh_cnt_tot_weekly", kWh_tot_weekly,"default");   // Ukentlig energi - Akkumulert
flow.set("vtr300_tilført_kWh_cnt_tot_monthly", kWh_tot_monthly,"default"); // Mý�nedlig energi - Akkumulert
flow.set("vtr300_tilført_kWh_cnt_tot_yearly", kWh_tot_yearly,"default");   // Årlig energi - Akkumulert

var kW_10s_out = {payload:kW_10s};
var kWh_tot_daily_out = {payload:(kWh_tot_daily).toFixed(2)};
var kWh_tot_weekly_out = {payload:(kWh_tot_weekly).toFixed(2)};
var kWh_tot_monthly_out = {payload:(kWh_tot_monthly).toFixed(2)};
var kWh_tot_yearly_out = {payload:(kWh_tot_yearly).toFixed(2)};
var kWh_tot_out = {payload:(kWh_tot).toFixed(2)};

// Tilpasser desimaler og benevnelse for attribute visning i HA
flow.set("vtr300_tilført_kWh_cnt_tot_formated", (kWh_tot).toFixed(2) +' kWh',"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWh_cnt_tot_daily_formated", (kWh_tot_daily).toFixed(2) +' kWh',"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWh_cnt_tot_weekly_formated", (kWh_tot_weekly).toFixed(2) +' kWh',"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWh_cnt_tot_monthly_formated", (kWh_tot_monthly).toFixed(2) +' kWh',"default");  // Lagrer tilført kW til "memory/default"
flow.set("vtr300_tilført_kWh_cnt_tot_yearly_formated", (kWh_tot_yearly).toFixed(2) +' kWh',"default");  // Lagrer tilført kW til "memory/default"

//return [kW_10s_out,kWh_tot_daily_out,kWh_tot_weekly_out,kWh_tot_monthly_out,kWh_tot_yearly_out,kWh_tot_out];

True power:

var watts_consumption = msg.payload;
var Watt_delivered = flow.get ("vtr300_tilført_Watt","default");// Tilført effekt Watt estimert
var kWatt_delivered = flow.get ("vtr300_tilført_kWatt","default"); // Tilført effekt kW estimert

// Faktisk effekt produsert (produsert - levert)
var true_produced_Watts = Watt_delivered - watts_consumption;
var true_produced_kW = kWatt_delivered - (watts_consumption/1000);

// Faktisk effekt produsert, tilpasse data ut
var true_produced_Watts_out = {payload:(true_produced_Watts).toFixed(0)};
var true_produced_kW_out = {payload:(true_produced_kW).toFixed(2)};

return [true_produced_Watts_out,true_produced_kW_out];

Outdoor compensated supply temperature:


var x= msg.payload; // utetemp.

// X (ute temp) og Y (ønsket tilluft) plot:
//  X1 :7,5,	Y1 :22,0
//  X2 :10,0,	Y2 :20,0
//  X3 :12,5,	Y3 :18,0
//  X4 :15,0,	Y4 :17,0
//  X5 :17,5,	Y5 :15,0
//  X6 :20,0,	Y6 :15,0

//Fjerdgradslikning for best treff av X og Y plot
//  𝑦=𝑎𝑥^4+𝑏𝑥^3+𝑐𝑥^2+𝑑𝑥+𝑒
// Graf & konstanter ses ved å plotte X & Y på kalkulator med "Stat"->"Grph"->"Gph"->"X^4"

//gitte variable basert på X og Y plot:
var a =	(1.0666e-03);
var b =	(-0.0562962);
var c =	(1.09555555);
var d =	(-9.9465608);
var e =	(55.3809523);
var y; //Ønsket tilluftstemp.

//Nødvendige regler for ønsket funksjosnalitet (pga. avvik utenfor ytterpunker)
if (x <= 7.5) { 
  y = 22.0;
}

else if (x >= 20.0) { 
  y= 15.0;
}

// Beregner plot
else {
  y = (a * Math.pow(x, 4)+b*Math.pow(x, 3)+c*Math.pow(x,2)+d*x+e);
}

msg.payload = parseFloat((y).toFixed(1));
return msg;