Browse Source

add a new logic for ACATVA and fix a bug about ACATFC

highing666 3 years ago
parent
commit
19dffb3d1a
3 changed files with 80 additions and 6 deletions
  1. 8 3
      app/api/routers/devices.py
  2. 68 1
      app/controllers/equipment/vav.py
  3. 4 2
      app/models/domain/devices.py

+ 8 - 3
app/api/routers/devices.py

@@ -20,7 +20,10 @@ from app.controllers.equipment.pau.supply_air_temperature_set import (
     build_acatfu_supply_air_temperature,
 )
 from app.controllers.equipment.pau.switch import build_acatfu_switch_set
-from app.controllers.equipment.vav import build_acatva_instructions
+from app.controllers.equipment.vav import (
+    build_acatva_instructions,
+    build_acatva_instructions_for_JM,
+)
 from app.controllers.equipment.ventilation_fan.switch import build_acvtsf_switch_set
 from app.controllers.equipment.vrf.basic import build_acatvi_instructions
 
@@ -191,7 +194,7 @@ async def get_acatfc_instructions(params: domain_devices.ACATFCInstructionsReque
         onOff=instructions.switch_set,
         speed=instructions.speed_set,
         temperature=instructions.temperature_set,
-        mode=instructions.switch_set,
+        mode=instructions.mode_set,
         water=instructions.water_valve_switch_set,
     )
 
@@ -229,4 +232,6 @@ async def get_acatva_instructions(params: domain_devices.ACATVAInstructionsReque
 async def get_acatva_instructions_v2(
     params: domain_devices.ACATVAInstructionsRequestV2,
 ):
-    pass
+    temp_set = await build_acatva_instructions_for_JM(params)
+
+    return temp_set

+ 68 - 1
app/controllers/equipment/vav.py

@@ -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

+ 4 - 2
app/models/domain/devices.py

@@ -86,11 +86,11 @@ class Space(BaseModel):
 
 
 class ACATVAInstructionsRequestBase(BaseModel):
+    device_id: str
     spaces: List[Space]
 
 
 class ACATVAInstructionsRequest(ACATVAInstructionsRequestBase):
-    device_id: str
     season: str
     supply_air_temperature: Optional[float]
     acatah_supply_air_temperature: Optional[float]
@@ -100,7 +100,9 @@ class ACATVAInstructionsRequest(ACATVAInstructionsRequestBase):
 
 
 class ACATVAInstructionsRequestV2(ACATVAInstructionsRequestBase):
-    pass
+    season: str
+    # temperature_set: float
+    return_air_temp: float
 
 
 class ACATVAInstructionsResponse(BaseModel):