# Climate regulator hub

Przetwarzanie

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

IDSkrótNazwaTypDomyślnieOpis
temp_dev_zone_1TD1Odchylenie temp., strefa 1NUMBER0Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 1
temp_dev_zone_2TD2Odchylenie temp., strefa 2NUMBER0Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 2
temp_dev_zone_3TD3Odchylenie temp., strefa 3NUMBER0Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 3
temp_dev_zone_4TD4Odchylenie temp., strefa 4NUMBER0Wejście dla wyjścia odchylenia temperatury strefowego regulatora klimatu - strefa 4

# Wyjścia

IDSkrótNazwaTypDomyślnieOpis
heating_0HOgrzewanieBOOLEANfalseWyjście ogrzewania, centralne
cooling_0CChłodzenieBOOLEANfalseWyjście chłodzenia, centralne
heating_1H1Ogrzewanie, strefa 1BOOLEANfalseWyjście ogrzewania, strefa 1
cooling_1C1Chłodzenie, strefa 1BOOLEANfalseWyjście chłodzenia, strefa 1
heating_2H2Ogrzewanie, strefa 2BOOLEANfalseWyjście ogrzewania, strefa 2
cooling_2C2Chłodzenie, strefa 2BOOLEANfalseWyjście chłodzenia, strefa 2
heating_3H3Ogrzewanie, strefa 3BOOLEANfalseWyjście ogrzewania, strefa 3
cooling_3C3Chłodzenie, strefa 3BOOLEANfalseWyjście chłodzenia, strefa 3
heating_4H4Ogrzewanie, strefa 4BOOLEANfalseWyjście ogrzewania, strefa 4
cooling_4C4Chłodzenie, strefa 4BOOLEANfalseWyjście chłodzenia, strefa 4

# Konfiguracja

IDNazwaTypDomyślnieJednostkaOpis
act_threshold_singlePróg aktywacji - pojedynczyNUMBER1.0Próg pojedynczego odchylenia temperatury poniżej którego blok pozostaje w stanie bezczynności

Szczegóły:

≥ 0
act_threshold_sumPróg aktywacji - sumaNUMBER2.0Pró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
}
Centralny hub regulatora klimatu - agreguje wymagania ogrzewania lub chłodzenia ze strefowych regulatorów klimatu i decyduje, które powinny być włączone.