# Climate regulator hub
Centralny hub regulatora klimatu - agreguje wymagania ogrzewania lub chłodzenia ze strefowych regulatorów klimatu i decyduje, które powinny być włączone.
Climate regulator hub
TD1
TD2
TD3
TD4
H
C
H1
C1
H2
C2
H3
C3
H4
C4
# Wejścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
temp_dev_zone_1 | TD1 | Odchylenie temp., strefa 1 | NUMBER | 0 | Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 1 |
temp_dev_zone_2 | TD2 | Odchylenie temp., strefa 2 | NUMBER | 0 | Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 2 |
temp_dev_zone_3 | TD3 | Odchylenie temp., strefa 3 | NUMBER | 0 | Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 3 |
temp_dev_zone_4 | TD4 | Odchylenie temp., strefa 4 | NUMBER | 0 | Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 4 |
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
heating_0 | H | Ogrzewanie | BOOLEAN | false | Wyjście ogrzewania, centralne |
cooling_0 | C | Chłodzenie | BOOLEAN | false | Wyjście chłodzenia, centralne |
heating_1 | H1 | Ogrzewanie, strefa 1 | BOOLEAN | false | Wyjście ogrzewania, strefa 1 |
cooling_1 | C1 | Chłodzenie, strefa 1 | BOOLEAN | false | Wyjście chłodzenia, strefa 1 |
heating_2 | H2 | Ogrzewanie, strefa 2 | BOOLEAN | false | Wyjście ogrzewania, strefa 2 |
cooling_2 | C2 | Chłodzenie, strefa 2 | BOOLEAN | false | Wyjście chłodzenia, strefa 2 |
heating_3 | H3 | Ogrzewanie, strefa 3 | BOOLEAN | false | Wyjście ogrzewania, strefa 3 |
cooling_3 | C3 | Chłodzenie, strefa 3 | BOOLEAN | false | Wyjście chłodzenia, strefa 3 |
heating_4 | H4 | Ogrzewanie, strefa 4 | BOOLEAN | false | Wyjście ogrzewania, strefa 4 |
cooling_4 | C4 | Chłodzenie, strefa 4 | BOOLEAN | false | Wyjście chłodzenia, strefa 4 |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
act_threshold_single | Próg aktywacji - pojedynczy | NUMBER | 1.0 | Próg pojedynczego odchylenia temperatury poniżej którego blok pozostaje w stanie bezczynności Szczegóły: ≥ 0 | |
act_threshold_sum | Próg aktywacji - suma | NUMBER | 2.0 | Próg sumy wszystkich wejść odchylenia temperatury poniżej którego blok pozostaje w stanie bezczynności Szczegóły: ≥ 0 |
# Kod źródłowy
Pokaż kod Volang
zones = 4
heating_was_active = output::get("heating_0")
cooling_was_active = output::get("cooling_0")
was_active = heating_was_active or cooling_was_active
act_threshold_single = config::get("act_threshold_single")
act_threshold_sum = config::get("act_threshold_sum")
fn heating(zone) {
output::set(str::fmt("heating_{}", zone), true)
output::set(str::fmt("cooling_{}", zone), false)
}
fn cooling(zone) {
output::set(str::fmt("heating_{}", zone), false)
output::set(str::fmt("cooling_{}", zone), true)
}
fn idle(zone) {
output::set(str::fmt("heating_{}", zone), false)
output::set(str::fmt("cooling_{}", zone), false)
}
fn round2dec(value) {
return math::round(100 * value) / 100.0
}
fn abs(value) {
if (value < 0) {
return -value
}
return value
}
zone = 0
dev_sum = 0.0
dev_sum_heat = 0.0
dev_sum_cool = 0.0
mode = 0 // 0=idle, 1=heating, 2=cooling
while (zone < zones) {
zonal_temp_dev = input::get(str::fmt("temp_dev_zone_{}", zone + 1))
dev_sum += zonal_temp_dev
if (zonal_temp_dev > 0) {
dev_sum_heat += zonal_temp_dev
}
if (zonal_temp_dev < 0) {
dev_sum_cool -= zonal_temp_dev
}
zone += 1
}
dev_sum = round2dec(dev_sum)
dev_sum_heat = round2dec(dev_sum_heat)
dev_sum_cool = round2dec(dev_sum_cool)
if (was_active) {
// switch off all outputs when reached the heating or cooling target
if ((heating_was_active and dev_sum_heat == 0.0) or (cooling_was_active and dev_sum_cool == 0.0)) {
zone = 0
while (zone <= zones) {
idle(zone)
zone += 1
}
return
}
if (heating_was_active) {
mode = 1
} else {
mode = 2
}
} else {
// was in an idle mode - we need to decide on heating or cooling mode
if (dev_sum > 0) {
mode = 1
} else if (dev_sum < 0) {
mode = 2
} else {
if (dev_sum_heat > 0) {
// this covers unlikely case of inputs like +1, -1, +2, -2
// chosing heating as a preference
mode = 1
} else {
mode = 0
}
}
}
zone = 0
dev_sum = 0.0
single_input_threshold_exceeded = false
while (zone < zones) {
zonal_temp_dev = input::get(str::fmt("temp_dev_zone_{}", zone + 1))
if (mode == 1 and zonal_temp_dev > 0) {
if (zonal_temp_dev >= act_threshold_single) {
single_input_threshold_exceeded = true
}
dev_sum += zonal_temp_dev
}
if (mode == 2 and zonal_temp_dev < 0) {
if (-zonal_temp_dev >= act_threshold_single) {
single_input_threshold_exceeded = true
}
dev_sum -= zonal_temp_dev
}
zone += 1
}
sum_threshold_exceeded = dev_sum >= act_threshold_sum
any_threshold_exceeded = single_input_threshold_exceeded or sum_threshold_exceeded
if (any_threshold_exceeded or was_active) {
if (mode == 1) {
heating(0)
} else if (mode == 2) {
cooling(0)
} else {
idle(0)
}
} else {
idle(0)
}
zone = 1
while (zone <= zones) {
if (any_threshold_exceeded or was_active) {
zonal_temp_dev = input::get(str::fmt("temp_dev_zone_{}", zone))
if (zonal_temp_dev > 0 and mode == 1) {
heating(zone)
} else if (zonal_temp_dev < 0 and mode == 2) {
cooling(zone)
} else {
idle(zone)
}
} else {
idle(zone)
}
zone += 1
}
