File size: 3,731 Bytes
b510d23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Electric cost(Euros) = energy_price(Euros/kWh) * wasted_energy(kWh)
def custo(energy_price_hour, wasted_energy):
    return energy_price_hour * wasted_energy


# caldeira 20 litros
def spent_energy(
    temperatura_inicial_caldeira_t,  # existente na cadeira, t sendo a hora
    temperatura_objetivo_caldeira_t_plus_1,
    outside_temp,
    pressao_caldeira,
    litros_gastos_no_banho=0,
    temperatura_entrada_agua_na_caldeira=15,  # Temperatura ambiente da iNOVA
    capacidade_caldeira=20,  # 20 litros
):
    # E = (4.2 kJ/kgoC) ((90 oC) - (20 oC)) (1000 liter) (1 kg/liter)
    # cp = specific heat of water (kJ/kgoC, Btu/lb oF) (4.2 kJ/kgoC, 1 Btu/lbmoF for water)
    heat_capacity = 4.2
    # Energy =  heat_capacity * (temperatura_saida_agua_na_caldeira - outside_temp) * capacidade_caldeira * 1\
    delta_t = temperatura_objetivo_caldeira_t_plus_1 - temperatura_inicial_caldeira_t

    energy = (
        heat_capacity
        * (delta_t - outside_temp)
        * (capacidade_caldeira - litros_gastos_no_banho)
        * 1
    )  # isto vai ser minimo

    delta_t = (
        temperatura_objetivo_caldeira_t_plus_1 - temperatura_entrada_agua_na_caldeira
    )
    energy_incoming_water = (
        heat_capacity * (delta_t - outside_temp) * litros_gastos_no_banho * 1
    )

    # 20 Litros totais
    # Joao gatou 5 litros
    # Gastar energia em:
    # 15 litros para manter a temperatura da caldeira -> minimo
    # 5 litros para aquecer a agua que entra

    total_energy = energy + energy_incoming_water

    # TODO: Correlação entre pressão e temperatura
    # https://www.engineeringtoolbox.com/boiling-points-water-altitude-d_1344.html
    # https://www.engineeringtoolbox.com/boiling-point-water-d_926.html
    """
    That depends on whether the pressure is held constant during the heating. If there is a relief valve which maintains 
    constant pressure as the water heats, then no, the 2 samples will heat at the same rate. However, if the pressurised sample 
    has no pressure relief, then it will heat faster because the pressure will increase, and that increase in pressure will increase 
    the heat in addition to the heat applied.
    """
    # kJ

    # TODO: FIND WHAT SHOULD BE THE RELATION BETWEEN TEMPERATURE OF OUTGOING WATER AND BOILER TEMPERATURE
    temperatura_saida_agua_na_caldeira = temperatura_objetivo_caldeira_t_plus_1 * 0.87

    return total_energy, temperatura_saida_agua_na_caldeira


def calculate_weights_for_all_hours(
    temperatura_inicial_caldeira,
    temperatura_objetivo_caldeira,
    outside_temp,
    pressao_caldeira,
    litros_gastos_no_banho,
    temperatura_entrada_agua_na_caldeira,
    capacidade_caldeira,
):
    weights = []
    temperatures = []
    for i in range(len(temperatura_inicial_caldeira)):
        energy, temperature_water = spent_energy(
            temperatura_inicial_caldeira_t=temperatura_inicial_caldeira[i],
            temperatura_objetivo_caldeira_t_plus_1=temperatura_objetivo_caldeira,
            outside_temp=outside_temp[i],
            pressao_caldeira=pressao_caldeira[i],
            litros_gastos_no_banho=litros_gastos_no_banho,
            temperatura_entrada_agua_na_caldeira=temperatura_entrada_agua_na_caldeira[
                i
            ],
            capacidade_caldeira=capacidade_caldeira,
        )
        weights.append(energy)
        temperatures.append(temperature_water)
    return weights, temperatures
    # Output energy wasted


def calculate_confort(temperatura_given, temperatura_ideal):
    return abs(temperatura_given - temperatura_ideal)


# create exception for no solution found
class NoSolutionFound(Exception):
    pass

class SoltionFoundWithLargerConfortValue(Exception):
    pass