|
@@ -11,7 +11,10 @@ from sqlalchemy.orm import Session
|
|
|
|
|
|
from app.controllers.equipment.controller import EquipmentController
|
|
|
from app.crud.space.weight import get_weights_by_vav
|
|
|
-from app.models.domain.devices import ACATVAInstructionsRequest
|
|
|
+from app.models.domain.devices import (
|
|
|
+ ACATVAInstructionsRequest,
|
|
|
+ ACATVAInstructionsRequestV2,
|
|
|
+)
|
|
|
from app.schemas.equipment import VAVBox, FCU
|
|
|
from app.schemas.instructions import ACATVAInstructions
|
|
|
from app.schemas.sapce_weight import SpaceWeight
|
|
@@ -274,6 +277,32 @@ class VAVControllerV3(VAVControllerV2):
|
|
|
self.equipment.virtual_target_temperature = virtual_target
|
|
|
|
|
|
|
|
|
+class VAVControllerV4(VAVControllerV3):
|
|
|
+ def __init__(self, vav_params: VAVBox, season: Season, return_air_temp: float):
|
|
|
+ super().__init__(vav_params, season)
|
|
|
+ self.return_air_temp = return_air_temp
|
|
|
+
|
|
|
+ def get_next_temp_set(
|
|
|
+ self, virtual_realtime_temp: float, virtual_target_temp: float
|
|
|
+ ) -> float:
|
|
|
+ if np.isnan(virtual_realtime_temp) or np.isnan(virtual_target_temp):
|
|
|
+ next_temp_set = np.NAN
|
|
|
+ else:
|
|
|
+ next_temp_set = (
|
|
|
+ virtual_target_temp + self.return_air_temp - virtual_realtime_temp
|
|
|
+ )
|
|
|
+
|
|
|
+ self.equipment.setting_temperature = next_temp_set
|
|
|
+
|
|
|
+ return next_temp_set
|
|
|
+
|
|
|
+ async def run(self) -> None:
|
|
|
+ await self.build_virtual_temperature()
|
|
|
+ temperature_set, temperature_realtime = await self.rectify()
|
|
|
+ self.get_next_temp_set(temperature_set, temperature_realtime)
|
|
|
+ self.equipment.running_status = True
|
|
|
+
|
|
|
+
|
|
|
async def fetch_vav_control_params(project_id: str, equipment_id: str) -> Dict:
|
|
|
async with AsyncClient() as client:
|
|
|
duo_duo = Duoduo(client, project_id)
|
|
@@ -396,3 +425,41 @@ async def build_acatva_instructions(
|
|
|
)
|
|
|
|
|
|
return instructions
|
|
|
+
|
|
|
+
|
|
|
+@logger.catch()
|
|
|
+async def build_acatva_instructions_for_JM(
|
|
|
+ params: ACATVAInstructionsRequestV2,
|
|
|
+) -> float:
|
|
|
+ # Control logic for Jiaming.
|
|
|
+
|
|
|
+ space_params = []
|
|
|
+ for sp in params.spaces:
|
|
|
+ temp_sp = Space(**sp.dict())
|
|
|
+ if temp_sp.temperature_target:
|
|
|
+ temp_sp.diff = temp_sp.temperature_target - temp_sp.realtime_temperature
|
|
|
+ else:
|
|
|
+ temp_sp.diff = 0.0
|
|
|
+ space_params.append(temp_sp)
|
|
|
+
|
|
|
+ vav_params = VAVBox(spaces=space_params)
|
|
|
+ return_air_temp = (
|
|
|
+ np.NAN if params.return_air_temp == -1.0 else params.return_air_temp
|
|
|
+ )
|
|
|
+
|
|
|
+ controller = VAVControllerV4(
|
|
|
+ vav_params=vav_params,
|
|
|
+ season=Season(params.season),
|
|
|
+ return_air_temp=return_air_temp,
|
|
|
+ )
|
|
|
+ await controller.run()
|
|
|
+ regulated_vav = controller.get_results()
|
|
|
+
|
|
|
+ next_temp_set = regulated_vav.setting_temperature
|
|
|
+ if next_temp_set:
|
|
|
+ if np.isnan(next_temp_set):
|
|
|
+ next_temp_set = -1.0
|
|
|
+ else:
|
|
|
+ next_temp_set = -1.0
|
|
|
+
|
|
|
+ return next_temp_set
|