added workaround for default ventilation

This commit is contained in:
Luis Aleixo 2023-03-13 17:09:38 +01:00
parent 0019d19799
commit 1f6b3dd96e
2 changed files with 18 additions and 10 deletions

View file

@ -211,18 +211,21 @@ class CO2Application(Controller):
)
self.add_scenario('Scenario 1')
def build_new_model(self) -> state.DataclassInstanceState[models.CO2ConcentrationModel]:
default_model = state.DataclassInstanceState(
def build_new_model(self, vent: str) -> state.DataclassInstanceState[models.CO2ConcentrationModel]:
new_model = state.DataclassInstanceState(
models.CO2ConcentrationModel,
state_builder=CAIMIRACO2StateBuilder(),
state_builder=CAIMIRACO2StateBuilder(selected_ventilation=vent)
)
default_model.dcs_update_from(baseline_model)
return default_model
return new_model
def add_scenario(self, name, copy_from_model: typing.Optional[state.DataclassInstanceState] = None):
model = self.build_new_model()
if copy_from_model is not None:
model = self.build_new_model(vent=copy_from_model.ventilation._selected)
model.dcs_update_from(copy_from_model.dcs_instance())
else:
model = self.build_new_model(vent='HVACMechanical') # Default
model.dcs_update_from(baseline_model)
self._model_scenarios.append((name, model))
self._active_scenario = len(self._model_scenarios) - 1
model.dcs_observe(self.notify_model_values_changed)
@ -604,7 +607,7 @@ class ModelWidgets(View):
def _build_mechanical(self, node):
mechanical_widgets = {
'HVACMechanical': self._build_q_air_mech(node),
'HVACMechanical': self._build_q_air_mech(node._states['HVACMechanical']),
'AirChange': self._build_ach(node._states['AirChange']),
}
@ -733,6 +736,9 @@ class MultiModelView(View):
class CAIMIRACO2StateBuilder(CAIMIRAStateBuilder):
def __init__(self, selected_ventilation: str):
self.selected_ventilation = selected_ventilation
def build_type__VentilationBase(self, _: dataclasses.Field):
s: state.DataclassStateNamed = state.DataclassStateNamed(
@ -743,8 +749,10 @@ class CAIMIRACO2StateBuilder(CAIMIRAStateBuilder):
'AirChange': self.build_generic(models.AirChange),
'Hinged window': self.build_generic(models.WindowOpening),
},
base_type=self.selected_ventilation,
state_builder=self,
)
s._states['HVACMechanical'].dcs_update_from(baseline_model.ventilation)
#Initialise the "Sliding window" state
s._states['Sliding window'].dcs_update_from(
models.SlidingWindow(active=models.PeriodicInterval(period=120, duration=15, start=8-(15/60)),

View file

@ -319,18 +319,18 @@ class DataclassStateNamed(DataclassState[Datamodel_T]):
"""
def __init__(self,
states: typing.Dict[str, DataclassState[Datamodel_T]],
base_type: str,
**kwargs
):
# TODO: This is effectively a container type. We shouldn't use the standard constructor for this.
enabled = list(states.keys())[0]
super().__init__(**kwargs)
with self._object_setattr():
self._states = states.copy()
self._selected: str = None # type: ignore
# Pick the first choice until we know otherwise.
self.dcs_select(enabled)
self.dcs_select(base_type)
def __getattr__(self, name):
try: