import numpy as np from fastapi import APIRouter, Depends, Query from loguru import logger from sqlalchemy.orm import Session import app.models.domain.devices as domain_devices from app.api.dependencies.db import get_db from app.controllers.equipment.ahu.basic import build_acatah_freq_set from app.controllers.equipment.ahu.supply_air_temperature_set import build_acatah_supply_air_temperature_set from app.controllers.equipment.ahu.supply_air_temperature_set import get_next_supply_air_temperature_set from app.controllers.equipment.ahu.switch import build_acatah_switch_set from app.controllers.equipment.ahu.thermal_mode import get_thermal_mode, build_acatah_thermal_mode_set from app.controllers.equipment.fcu.basic import build_acatfc_instructions from app.controllers.equipment.fcu.early_start import build_acatfc_early_start_prediction from app.controllers.equipment.fcu.early_start import get_recommended_early_start_time from app.controllers.equipment.pau.freq_set import get_next_acatfu_freq_set, build_acatfu_freq_set from app.controllers.equipment.pau.supply_air_temperature_set import build_acatfu_supply_air_temperature from app.controllers.equipment.pau.supply_air_temperature_set import get_next_acatfu_supply_air_temperature_set from app.controllers.equipment.pau.switch import get_switch_action, build_acatfu_switch_set from app.controllers.equipment.vav import build_acatva_instructions from app.controllers.equipment.ventilation_fan.switch import build_acvtsf_switch_set from app.controllers.equipment.vrf.basic import build_acatvi_instructions from app.models.domain.devices import DevicesInstructionsBaseResponse, DevicesEarlyStartTime router = APIRouter() @router.get('/instructions/acatah/thermal-mode-set', response_model=DevicesInstructionsBaseResponse) async def get_acatah_thermal_mode_set( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), device_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId') ): thermal_mode = await get_thermal_mode(project_id, device_id) return { 'projectId': project_id, 'equipId': device_id, 'output': { 'thermalModeSet': thermal_mode } } @router.post('/instructions/acatah/thermal-mode-set', response_model=domain_devices.ACATAHThermalModeSetResponse) async def get_acatah_thermal_mode_set_v2(params: domain_devices.ACATAHThermalModeSetRequest): thermal_mode = build_acatah_thermal_mode_set(params) logger.info(f'{params.device_id}: thermal mode set - {thermal_mode}') resp = {'thermal_mode_set': thermal_mode} return resp @router.get('/instructions/acatah/supply-air-temperature-set', response_model=DevicesInstructionsBaseResponse) async def get_acatah_supply_air_temperature_set( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), device_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId') ): next_supply_air_temperature_set = await get_next_supply_air_temperature_set(project_id, device_id) return { 'projectId': project_id, 'equipId': device_id, 'output': { 'supplyAirTemperatureSet': next_supply_air_temperature_set } } @router.post( '/instructions/acatah/supply-air-temperature-set', response_model=domain_devices.ACATAHSupplyAirTempSetResponse ) async def get_acatah_supply_air_temperature_set_v2(params: domain_devices.ACATAHSupplyAirTempSetRequest): supply_air_temperature_set = build_acatah_supply_air_temperature_set(params) logger.info(supply_air_temperature_set) resp = {'supply_air_temperature_set': supply_air_temperature_set} return resp @router.post('/instructions/acatah/freq-set', response_model=domain_devices.ACATAHFreqSetResponse) async def get_acatah_freq_set(params: domain_devices.ACATAHFreqSetRequest): freq_set = await build_acatah_freq_set(params) logger.info(params) logger.info(f'{params.device_id}: freq set - {freq_set}') resp = {'freq_set': freq_set} return resp @router.post('/instructions/acatah/switch-set', response_model=domain_devices.ACATAHSwitchSetResponse) async def get_acatah_switch_set(params: domain_devices.ACATAHSwitchSetRequest): switch_set = await build_acatah_switch_set(params) logger.info(params) logger.info(f'{params.device_id}: switch set - {switch_set}') resp = {'switch_set': switch_set} return resp @router.post('/instructions/acvtsf/switch-set', response_model=domain_devices.ACVTSFSwitchSetResponse) async def get_acvtsf_switch_set(params: domain_devices.ACVTSFSwitchSetRequest): switch_set = await build_acvtsf_switch_set(params) logger.info(params) logger.info(f'{params.device_id}: switch set - {switch_set}') resp = {'switch_set': switch_set} return resp @router.get('/instructions/acatfu/equip-switch-set', response_model=DevicesInstructionsBaseResponse) async def get_acatfu_equip_switch_set( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), device_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId') ): action = await get_switch_action(project_id, device_id) return { 'projectId': project_id, 'equipId': device_id, 'output': { 'equipSwitchSet': action } } @router.post('/instructions/acatfu/switch-set', response_model=domain_devices.ACATFUSwitchSetResponse) async def get_acatfu_switch_set(params: domain_devices.ACATFUSwitchSetRequest): switch_set = await build_acatfu_switch_set(params) logger.info(params) logger.info(f'{params.device_id}: switch set - {switch_set}') resp = {'switch_set': switch_set} return resp @router.get('/instructions/acatfu/supply-air-temperature-set', response_model=DevicesInstructionsBaseResponse) async def get_acatfu_supply_air_temperature_set( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), device_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId') ): temperature_set = await get_next_acatfu_supply_air_temperature_set(project_id, device_id) return { 'projectId': project_id, 'equipId': device_id, 'output': { 'supplyAirTemperatureSet': temperature_set } } @router.post( '/instructions/acatfu/supply-air-temperature-set', response_model=domain_devices.ACATFUSupplyAirTempSetResponse ) async def get_acatfu_supply_air_temperature_set_v2(params: domain_devices.ACATFUSupplyAirTempSetRequest): supply_air_temperature_set = build_acatfu_supply_air_temperature(params) logger.info(supply_air_temperature_set) resp = {'supply_air_temperature_set': supply_air_temperature_set} return resp @router.get('/instructions/acatfu/freq-set', response_model=DevicesInstructionsBaseResponse) async def get_acatfu_freq_set( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), device_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId') ): freq_set = await get_next_acatfu_freq_set(project_id, device_id) return { 'projectId': project_id, 'equipId': device_id, 'output': { 'fanFreqSet': freq_set } } @router.post('/instruction/acatfu/freq-set', response_model=domain_devices.ACATFUFreqSetResponse) async def get_acatfu_freq_set(params: domain_devices.ACATFUFreqSetRequest): freq_set = build_acatfu_freq_set(params) logger.info(f'{params.device_id} - {freq_set}') resp = {'freq_set': freq_set} return resp @router.get('/early-start/prediction/acatfc', response_model=DevicesEarlyStartTime) async def get_acatfc_early_start_time( project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'), space_id: str = Query(..., max_length=50, regex='^Sp', alias='spaceId'), db: Session = Depends(get_db) ): minutes = await get_recommended_early_start_time(db, project_id, space_id) return { 'projectId': project_id, 'spaceId': space_id, 'minutes': minutes } @router.post('/prediction/acatfc/early-start', response_model=domain_devices.ACATFCEarlyStartPredictionResponse) async def get_acatfc_early_start_prediction( params: domain_devices.ACATFCEarlyStartPredictionRequest, db: Session = Depends(get_db) ): minutes = await build_acatfc_early_start_prediction(params, db) logger.info(params) logger.info(f'{params.space_id} - {minutes}') resp = {'minutes': minutes} return resp @router.post('/instructions/acatvi', response_model=domain_devices.ACATVIInstructionsResponse) async def get_acatvi_instructions(params: domain_devices.ACATVIInstructionsRequest): instructions = await build_acatvi_instructions(params) logger.info(params) logger.info(f'{params.device_id} - {instructions}') return instructions @router.post('/instructions/acatfc', response_model=domain_devices.ACATFCInstructionsResponse) async def get_acatfc_instructions(params: domain_devices.ACATFCInstructionsRequest): instructions = await build_acatfc_instructions(params) logger.info(params) logger.info(f'{params.device_id} - {instructions}') response = domain_devices.ACATFCInstructionsResponse( onOff=instructions.switch_set, speed=instructions.speed_set, temperature=instructions.temperature_set, mode=instructions.switch_set, water=instructions.water_valve_switch_set ) return response @router.post('/instructions/acatva', response_model=domain_devices.ACATVAInstructionsResponse) async def get_acatva_instructions(params: domain_devices.ACATVAInstructionsRequest): instructions = await build_acatva_instructions(params) logger.info(params) logger.info(f'{params.device_id} - {instructions}') resp = dict() if not np.isnan(instructions.supply_air_flow_set): resp.update({'SupplyAirFlowSet': instructions.supply_air_flow_set}) if not np.isnan(instructions.virtual_realtime_temperature): resp.update({'VirtualRealtimeTemperature': instructions.virtual_realtime_temperature}) if not np.isnan(instructions.virtual_temperature_target_set): resp.update({'TargetTemperatureSet': instructions.virtual_temperature_target_set}) return resp