Source code for ecoengine.objects.components.heating.Controls
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from ecoengine.objects.components.storage.StorageTank import StorageTank
[docs]
class Controls:
"""
Setpoints for one operating mode of a WaterHeater.
A WaterHeater carries a control_schedule (24-length list of int) and a
control_map (dict[int, Controls]) so that different Controls objects can
be active at different hours of the day. Each Controls object represents
a single mode's setpoints — there is no load-shift scheduling logic here.
Sensor position convention
--------------------------
ON sensor (upper, on_sensor_fract >= off_sensor_fract):
Heater turns ON when this sensor drops below on_trigger_t_f.
OFF sensor (lower):
Heater turns OFF when this sensor rises above off_trigger_t_f.
"""
[docs]
def __init__(
self,
on_sensor_fract: float,
on_trigger_t_f: float,
off_sensor_fract: float,
off_trigger_t_f: float,
outlet_temp_f: float,
) -> None:
"""
Parameters
----------
on_sensor_fract : float
Fractional tank height of the ON (upper) temperature sensor
(0 = bottom, 1 = top). Must be >= off_sensor_fract.
on_trigger_t_f : float
Temperature at on_sensor_fract that triggers the heater ON [°F].
off_sensor_fract : float
Fractional tank height of the OFF (lower) temperature sensor
(0 = bottom, 1 = top). Must be <= on_sensor_fract.
off_trigger_t_f : float
Temperature at off_sensor_fract that triggers the heater OFF [°F].
outlet_temp_f : float
Target hot-water outlet temperature for this operating mode [°F].
Typically equal to storage_temp_f for normal operation, but may
differ for load-up or other modes.
"""
self.on_sensor_fract = on_sensor_fract
self.on_trigger_t_f = on_trigger_t_f
self.off_sensor_fract = off_sensor_fract
self.off_trigger_t_f = off_trigger_t_f
self.outlet_temp_f = outlet_temp_f
[docs]
def should_turn_on(self, storage_tank: StorageTank) -> bool:
"""
Return True if the heater should turn on given the current tank state.
The heater turns ON when the upper (on) sensor drops below
``on_trigger_t_f``.
Parameters
----------
storage_tank : StorageTank
Returns
-------
bool
"""
temp = storage_tank.get_temperature_at_fraction(self.on_sensor_fract)
return temp < self.on_trigger_t_f
[docs]
def should_turn_off(self, storage_tank: StorageTank) -> bool:
"""
Return True if the heater should turn off given the current tank state.
The heater turns OFF when the lower (off) sensor rises to or above
``off_trigger_t_f``.
Parameters
----------
storage_tank : StorageTank
Returns
-------
bool
"""
temp = storage_tank.get_temperature_at_fraction(self.off_sensor_fract)
return temp >= self.off_trigger_t_f