printer.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from datetime import datetime
  2. from pydantic import BaseModel, Field
  3. class PrinterBase(BaseModel):
  4. name: str = Field(..., min_length=1, max_length=100)
  5. serial_number: str = Field(..., min_length=1, max_length=50)
  6. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  7. access_code: str = Field(..., min_length=1, max_length=20)
  8. model: str | None = None
  9. auto_archive: bool = True
  10. class PrinterCreate(PrinterBase):
  11. pass
  12. class PrinterUpdate(BaseModel):
  13. name: str | None = None
  14. ip_address: str | None = None
  15. access_code: str | None = None
  16. model: str | None = None
  17. is_active: bool | None = None
  18. auto_archive: bool | None = None
  19. print_hours_offset: float | None = None
  20. class PrinterResponse(PrinterBase):
  21. id: int
  22. is_active: bool
  23. nozzle_count: int = 1 # 1 or 2, auto-detected from MQTT
  24. print_hours_offset: float = 0.0
  25. created_at: datetime
  26. updated_at: datetime
  27. class Config:
  28. from_attributes = True
  29. class HMSErrorResponse(BaseModel):
  30. code: str
  31. module: int
  32. severity: int # 1=fatal, 2=serious, 3=common, 4=info
  33. class AMSTray(BaseModel):
  34. id: int
  35. tray_color: str | None = None
  36. tray_type: str | None = None
  37. remain: int = 0
  38. k: float | None = None # Pressure advance value
  39. class AMSUnit(BaseModel):
  40. id: int
  41. humidity: int | None = None
  42. temp: float | None = None
  43. tray: list[AMSTray] = []
  44. class PrinterStatus(BaseModel):
  45. id: int
  46. name: str
  47. connected: bool
  48. state: str | None = None
  49. current_print: str | None = None
  50. subtask_name: str | None = None
  51. gcode_file: str | None = None
  52. progress: float | None = None
  53. remaining_time: int | None = None
  54. layer_num: int | None = None
  55. total_layers: int | None = None
  56. temperatures: dict | None = None
  57. cover_url: str | None = None
  58. hms_errors: list[HMSErrorResponse] = []
  59. ams: list[AMSUnit] = []
  60. ams_exists: bool = False
  61. vt_tray: AMSTray | None = None # Virtual tray / external spool
  62. sdcard: bool = False # SD card inserted
  63. timelapse: bool = False # Timelapse recording active
  64. ipcam: bool = False # Live view enabled