machine_config.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. """
  2. 机型配置定义
  3. 与 daping_rec_online_api 项目保持一致的机型和模板映射规则
  4. """
  5. from typing import Dict, List, Optional
  6. from pydantic import BaseModel
  7. class ZoneConfig(BaseModel):
  8. """区域配置(洗涤筒/干衣筒)"""
  9. zone_id: str
  10. zone_name: str
  11. device_type: str # wash/dry
  12. class TemplateMapping(BaseModel):
  13. """模板映射配置"""
  14. template_type: str # common/time_popular/time_custom 等
  15. redis_key_pattern: str # Redis key 格式
  16. description: str
  17. class MachineModel(BaseModel):
  18. """机型配置"""
  19. model_id: str # 机型标识符,如 x11, hplus
  20. model_name: str # 显示名称
  21. type_id: str # Redis 中的 type_id
  22. zones: List[ZoneConfig] # 区域配置
  23. template_mappings: List[TemplateMapping] # 模板映射
  24. support_multi_card: bool = False # 是否支持多卡
  25. recommend_types: List[str] = ["1", "2"] # 推荐类型:1=人气, 2=定制
  26. @property
  27. def zone_ids(self) -> List[str]:
  28. return [z.zone_id for z in self.zones]
  29. # 机型配置注册表
  30. MACHINE_MODELS: Dict[str, MachineModel] = {
  31. "x11": MachineModel(
  32. model_id="x11",
  33. model_name="X11",
  34. type_id="201c51890c31c308050100218008390000000000000000000000000000000040",
  35. zones=[
  36. ZoneConfig(zone_id="2", zone_name="洗衣机", device_type="wash"),
  37. ZoneConfig(zone_id="3", zone_name="洗衣机(AI快净)", device_type="wash"),
  38. ],
  39. template_mappings=[
  40. TemplateMapping(
  41. template_type="common",
  42. redis_key_pattern="broadcast-template-jinja:single_card:wash:common",
  43. description="通用模板"
  44. ),
  45. TemplateMapping(
  46. template_type="time_popular",
  47. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular",
  48. description="人气模板"
  49. ),
  50. TemplateMapping(
  51. template_type="time_custom",
  52. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom",
  53. description="定制模板"
  54. ),
  55. TemplateMapping(
  56. template_type="time_season",
  57. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season",
  58. description="季节模板"
  59. ),
  60. TemplateMapping(
  61. template_type="time_care",
  62. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care",
  63. description="关怀模板"
  64. ),
  65. TemplateMapping(
  66. template_type="time_environmental",
  67. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental",
  68. description="环保模板"
  69. ),
  70. TemplateMapping(
  71. template_type="time_weather",
  72. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_weather",
  73. description="天气模板"
  74. ),
  75. TemplateMapping(
  76. template_type="time_health",
  77. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health",
  78. description="健康模板"
  79. ),
  80. ]
  81. ),
  82. "x11_dry": MachineModel(
  83. model_id="x11_dry",
  84. model_name="X11 干衣机",
  85. type_id="201c51890c31c308310100218003484748000000000000000000000000000040",
  86. zones=[
  87. ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"),
  88. ],
  89. template_mappings=[
  90. TemplateMapping(
  91. template_type="common",
  92. redis_key_pattern="broadcast-template-jinja:single_card:dry:common",
  93. description="通用模板"
  94. ),
  95. TemplateMapping(
  96. template_type="time_popular",
  97. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular",
  98. description="人气模板"
  99. ),
  100. TemplateMapping(
  101. template_type="time_custom",
  102. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom",
  103. description="定制模板"
  104. ),
  105. TemplateMapping(
  106. template_type="time_season",
  107. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season",
  108. description="季节模板"
  109. ),
  110. TemplateMapping(
  111. template_type="time_care",
  112. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care",
  113. description="关怀模板"
  114. ),
  115. TemplateMapping(
  116. template_type="time_environmental",
  117. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental",
  118. description="环保模板"
  119. ),
  120. ]
  121. ),
  122. "hplus": MachineModel(
  123. model_id="hplus",
  124. model_name="Hplus",
  125. type_id="201c51890c31c308050400218003484843000001000000000000000000000040",
  126. zones=[
  127. ZoneConfig(zone_id="3", zone_name="洗衣机", device_type="wash"),
  128. ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"),
  129. ],
  130. template_mappings=[
  131. TemplateMapping(
  132. template_type="common",
  133. redis_key_pattern="broadcast-template-jinja:single_card:wash:common",
  134. description="通用模板"
  135. ),
  136. TemplateMapping(
  137. template_type="time_popular",
  138. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular",
  139. description="人气模板"
  140. ),
  141. TemplateMapping(
  142. template_type="time_custom",
  143. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom",
  144. description="定制模板"
  145. ),
  146. ]
  147. ),
  148. "ultra": MachineModel(
  149. model_id="ultra",
  150. model_name="Ultra",
  151. type_id="201c51890c31c308050100218008054150000000000000000000000000000040",
  152. zones=[
  153. ZoneConfig(zone_id="1", zone_name="洗衣机下", device_type="wash"),
  154. ZoneConfig(zone_id="3", zone_name="洗衣机下(双)", device_type="wash"),
  155. ZoneConfig(zone_id="41", zone_name="洗衣机左", device_type="wash"),
  156. ZoneConfig(zone_id="43", zone_name="洗衣机左(双)", device_type="wash"),
  157. ZoneConfig(zone_id="61", zone_name="洗衣机右", device_type="wash"),
  158. ZoneConfig(zone_id="63", zone_name="洗衣机右(双)", device_type="wash"),
  159. ],
  160. template_mappings=[
  161. TemplateMapping(
  162. template_type="common",
  163. redis_key_pattern="broadcast-template-jinja:single_card:wash:common",
  164. description="通用模板"
  165. ),
  166. TemplateMapping(
  167. template_type="time_popular",
  168. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular",
  169. description="人气模板"
  170. ),
  171. TemplateMapping(
  172. template_type="time_custom",
  173. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom",
  174. description="定制模板"
  175. ),
  176. TemplateMapping(
  177. template_type="time_weather",
  178. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_weather",
  179. description="天气模板"
  180. ),
  181. TemplateMapping(
  182. template_type="time_season",
  183. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season",
  184. description="季节模板"
  185. ),
  186. TemplateMapping(
  187. template_type="time_care",
  188. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care",
  189. description="关怀模板"
  190. ),
  191. TemplateMapping(
  192. template_type="time_environmental",
  193. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental",
  194. description="环保模板"
  195. ),
  196. TemplateMapping(
  197. template_type="time_health",
  198. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health",
  199. description="健康模板"
  200. ),
  201. TemplateMapping(
  202. template_type="time_health_2",
  203. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_health_2",
  204. description="健康2-杀菌模板"
  205. ),
  206. ]
  207. ),
  208. "f2_multi": MachineModel(
  209. model_id="f2_multi",
  210. model_name="F2 Multi",
  211. type_id="201c51890c31c30805040021800",
  212. zones=[
  213. ZoneConfig(zone_id="1", zone_name="洗衣机", device_type="wash"),
  214. ],
  215. template_mappings=[
  216. TemplateMapping(
  217. template_type="common",
  218. redis_key_pattern="broadcast-template-jinja:multi_card:wash:common",
  219. description="通用模板"
  220. ),
  221. TemplateMapping(
  222. template_type="time_popular",
  223. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_popular",
  224. description="人气模板"
  225. ),
  226. TemplateMapping(
  227. template_type="time_custom",
  228. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_custom",
  229. description="定制模板"
  230. ),
  231. TemplateMapping(
  232. template_type="time_weather",
  233. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_weather",
  234. description="天气模板"
  235. ),
  236. TemplateMapping(
  237. template_type="time_season_storage",
  238. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_season_storage",
  239. description="季节收纳模板"
  240. ),
  241. TemplateMapping(
  242. template_type="time_season_in",
  243. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_season_in",
  244. description="季节上新模板"
  245. ),
  246. TemplateMapping(
  247. template_type="time_care",
  248. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_care",
  249. description="关怀模板"
  250. ),
  251. TemplateMapping(
  252. template_type="time_environmental",
  253. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_environmental",
  254. description="环保模板"
  255. ),
  256. TemplateMapping(
  257. template_type="time_health",
  258. redis_key_pattern="broadcast-template-jinja:multi_card:wash:time_health",
  259. description="健康模板"
  260. ),
  261. ],
  262. support_multi_card=True
  263. ),
  264. "seeker": MachineModel(
  265. model_id="seeker",
  266. model_name="Seeker",
  267. type_id="201c51890c31c308050100218008054251410000000000000000000000000040",
  268. zones=[
  269. ZoneConfig(zone_id="2", zone_name="洗衣机(下)", device_type="wash"),
  270. ZoneConfig(zone_id="3", zone_name="洗衣机(左)", device_type="wash"),
  271. ZoneConfig(zone_id="4", zone_name="洗衣机(右)", device_type="wash"),
  272. ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"),
  273. ],
  274. template_mappings=[
  275. TemplateMapping(
  276. template_type="common",
  277. redis_key_pattern="broadcast-template-jinja:single_card:wash:common",
  278. description="通用模板"
  279. ),
  280. TemplateMapping(
  281. template_type="time_popular",
  282. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_popular",
  283. description="人气模板"
  284. ),
  285. TemplateMapping(
  286. template_type="time_custom",
  287. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_custom",
  288. description="定制模板"
  289. ),
  290. TemplateMapping(
  291. template_type="time_season",
  292. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_season",
  293. description="季节模板"
  294. ),
  295. TemplateMapping(
  296. template_type="time_care",
  297. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_care",
  298. description="关怀模板"
  299. ),
  300. TemplateMapping(
  301. template_type="time_environmental",
  302. redis_key_pattern="broadcast-template-jinja:single_card:wash:time_environmental",
  303. description="环保模板"
  304. ),
  305. ]
  306. ),
  307. "seeker_dry": MachineModel(
  308. model_id="seeker_dry",
  309. model_name="Seeker 干衣机",
  310. type_id="201c51890c31c308310100218008054251410003000000000000000000000040",
  311. zones=[
  312. ZoneConfig(zone_id="0", zone_name="干衣机", device_type="dry"),
  313. ],
  314. template_mappings=[
  315. TemplateMapping(
  316. template_type="common",
  317. redis_key_pattern="broadcast-template-jinja:single_card:dry:common",
  318. description="通用模板"
  319. ),
  320. TemplateMapping(
  321. template_type="time_popular",
  322. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular",
  323. description="人气模板"
  324. ),
  325. TemplateMapping(
  326. template_type="time_custom",
  327. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom",
  328. description="定制模板"
  329. ),
  330. TemplateMapping(
  331. template_type="time_season",
  332. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season",
  333. description="季节模板"
  334. ),
  335. TemplateMapping(
  336. template_type="time_care",
  337. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care",
  338. description="关怀模板"
  339. ),
  340. TemplateMapping(
  341. template_type="time_environmental",
  342. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental",
  343. description="环保模板"
  344. ),
  345. ]
  346. ),
  347. "x11_ultra": MachineModel(
  348. model_id="x11_ultra",
  349. model_name="X11 Ultra",
  350. type_id="201c51890c31c308050400218003484446000000000000000000000000000040",
  351. zones=[
  352. ZoneConfig(zone_id="24", zone_name="干衣机", device_type="dry"),
  353. ZoneConfig(zone_id="7", zone_name="干衣机(双)", device_type="dry"),
  354. ZoneConfig(zone_id="1", zone_name="干衣机(单)", device_type="dry"),
  355. ],
  356. template_mappings=[
  357. TemplateMapping(
  358. template_type="common",
  359. redis_key_pattern="broadcast-template-jinja:single_card:dry:common",
  360. description="通用模板"
  361. ),
  362. TemplateMapping(
  363. template_type="time_popular",
  364. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_popular",
  365. description="人气模板"
  366. ),
  367. TemplateMapping(
  368. template_type="time_custom",
  369. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_custom",
  370. description="定制模板"
  371. ),
  372. TemplateMapping(
  373. template_type="time_season",
  374. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_season",
  375. description="季节模板"
  376. ),
  377. TemplateMapping(
  378. template_type="time_care",
  379. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_care",
  380. description="关怀模板"
  381. ),
  382. TemplateMapping(
  383. template_type="time_environmental",
  384. redis_key_pattern="broadcast-template-jinja:single_card:dry:time_environmental",
  385. description="环保模板"
  386. ),
  387. ]
  388. ),
  389. }
  390. def get_machine_model(model_id: str) -> Optional[MachineModel]:
  391. """获取机型配置"""
  392. return MACHINE_MODELS.get(model_id)
  393. def list_machine_models() -> List[MachineModel]:
  394. """获取所有机型配置"""
  395. return list(MACHINE_MODELS.values())
  396. def get_template_types_for_model(model_id: str, device_type: str = None) -> List[str]:
  397. """获取机型支持的模板类型"""
  398. model = get_machine_model(model_id)
  399. if not model:
  400. return []
  401. mappings = model.template_mappings
  402. if device_type:
  403. # 过滤设备类型
  404. mappings = [m for m in mappings if device_type in m.redis_key_pattern]
  405. return [m.template_type for m in mappings]