thermal_comfort.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from abc import ABC, abstractmethod
  2. from typing import Optional
  3. import numpy as np
  4. from loguru import logger
  5. from app.schemas.diagnosis import FaultCategory
  6. from app.schemas.equipment import FCU, VAVBox, VRF
  7. class DiagnotorBase(ABC):
  8. def __init__(self):
  9. self._result = FaultCategory()
  10. def controller_check(
  11. self,
  12. setting_value: float,
  13. feedback_value: float,
  14. is_categorical: bool = False,
  15. tolerance_pct: float = 0.0
  16. ) -> None:
  17. if is_categorical:
  18. if setting_value != feedback_value:
  19. self._result.controller_err = True
  20. else:
  21. if not setting_value * (1 - tolerance_pct) <= feedback_value <= setting_value * (1 + tolerance_pct):
  22. self._result.controller_err = True
  23. class ThermalComfortDiagnotor(DiagnotorBase):
  24. def __init__(self):
  25. super(ThermalComfortDiagnotor, self).__init__()
  26. class FCUDiagnotor(DiagnotorBase):
  27. def __init__(self, fcu: FCU):
  28. super(FCUDiagnotor, self).__init__()
  29. self._fcu = fcu
  30. def low_in_heating(self) -> None:
  31. if self._fcu.air_valve_speed == 'off':
  32. if self._fcu.speed_limit == 'off':
  33. self._result.over_constrained = True
  34. else:
  35. self._result.control_logic_err = True
  36. else:
  37. if self._fcu.air_valve_speed == self._fcu.recommended_speed:
  38. self.controller_check(self._fcu.air_valve_speed_set, self._fcu.air_valve_speed)
  39. if not self._result.controller_err:
  40. if self._fcu.air_valve_speed_set == 'high':
  41. pass
  42. else:
  43. self._result.control_logic_err = True
  44. else:
  45. if self._fcu.speed_limit == self._fcu.air_valve_speed:
  46. self._result.over_constrained = True
  47. else:
  48. self._result.obj_info_err = True
  49. def low_in_cooling(self) -> None:
  50. pass
  51. def high_in_heating(self) -> None:
  52. pass
  53. def high_in_cooling(self) -> None:
  54. pass
  55. class VAVDiagnotor(DiagnotorBase):
  56. def __init__(self, vav: VAVBox):
  57. super(VAVDiagnotor, self).__init__()
  58. self._vav = vav
  59. class VRFDiagnotor(DiagnotorBase):
  60. def __init__(self, vrf: VRF):
  61. super(VRFDiagnotor, self).__init__()
  62. self._vrf = vrf