api_tempdiag.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # main.py
  2. from fastapi import FastAPI, HTTPException
  3. from fastapi.responses import JSONResponse
  4. from typing import List
  5. from pydantic import BaseModel, model_validator
  6. import uvicorn
  7. from Temp_Diag import MSET_Temp
  8. app = FastAPI(title="Temperature Diagnosis API")
  9. class TemperatureInput(BaseModel):
  10. windCode: str
  11. windTurbineNumberList: List[str]
  12. startTime: str # e.g. "2024-06-08 00:00"
  13. endTime: str # e.g. "2024-06-08 01:00"
  14. @model_validator(mode='before')
  15. def normalize_fields(cls, values):
  16. # 确保 windTurbineNumberList 是列表
  17. raw = values.get('windTurbineNumberList')
  18. if isinstance(raw, str):
  19. values['windTurbineNumberList'] = [raw]
  20. return values
  21. # 阈值分析
  22. @app.post("/temperature/threshold")
  23. async def route_threshold(input_data: TemperatureInput):
  24. """
  25. 阈值分析接口(阈值固定 0.99):
  26. - 输入:
  27. {
  28. "windCode": "WOF01000010",
  29. "windTurbineNumberList": ["WOG00542"],
  30. "startTime": "2023-01-01 00:00",
  31. "endTime": "2023-01-05 12:00"
  32. }
  33. - 返回:
  34. {
  35. "data": {
  36. "type": "temperature_threshold",
  37. "records": [
  38. {
  39. "time_stamp": "2024-06-08 00:05:00",
  40. "temp_channel": "main_bearing_temperature",
  41. "SPRT_score": 0.123,
  42. "status": "正常"
  43. },
  44. ...
  45. ]
  46. },
  47. "code": 200,
  48. "message": "success"
  49. }
  50. """
  51. try:
  52. analyzer = MSET_Temp(
  53. windCode=input_data.windCode,
  54. windTurbineNumberList=input_data.windTurbineNumberList,
  55. startTime=input_data.startTime,
  56. endTime=input_data.endTime
  57. )
  58. df_result = analyzer.check_threshold() # DataFrame 长格式
  59. records = df_result.to_dict(orient="records")
  60. return {
  61. "data": {
  62. "type": "temperature_threshold",
  63. "records": records
  64. },
  65. "code": 200,
  66. "message": "success"
  67. }
  68. except Exception as e:
  69. return JSONResponse(
  70. status_code=500,
  71. content={
  72. "code": 500,
  73. "message": "analysis failed",
  74. "detail": str(e)
  75. }
  76. )
  77. # 趋势分析(暂未调用)
  78. @app.post("/temperature/trend")
  79. async def route_trend(input_data: TemperatureInput):
  80. """
  81. 趋势分析接口:
  82. - 输入:
  83. {
  84. "windCode": "WOF01000010",
  85. "windTurbineNumberList": ["WOG00542"],
  86. "startTime": "2023-01-01 00:00",
  87. "endTime": "2023-01-05 12:00"
  88. }
  89. - 返回:
  90. {
  91. "data": {
  92. "type": "temperature_trend",
  93. "timestamps": [ "2024-06-08 00:00:00", ... ],
  94. "channels": [
  95. { "temp_channel": "main_bearing_temperature", "values": [24.5, 24.7, ...] },
  96. ...
  97. ],
  98. "unit": "°C"
  99. },
  100. "code": 200,
  101. "message": "success"
  102. }
  103. """
  104. try:
  105. analyzer = MSET_Temp(
  106. windCode=input_data.windCode,
  107. windTurbineNumberList=input_data.windTurbineNumberList,
  108. startTime=input_data.startTime,
  109. endTime=input_data.endTime
  110. )
  111. result = analyzer.get_trend()
  112. return {
  113. "data": {
  114. "type": "temperature_trend",
  115. **result
  116. },
  117. "code": 200,
  118. "message": "success"
  119. }
  120. except Exception as e:
  121. return JSONResponse(
  122. status_code=500,
  123. content={
  124. "code": 500,
  125. "message": "analysis failed",
  126. "detail": str(e)
  127. }
  128. )
  129. if __name__ == "__main__":
  130. uvicorn.run(
  131. "main:app",
  132. host="0.0.0.0",
  133. port=8000,
  134. reload=True
  135. )