mitvs_module.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import yaml
  2. import requests
  3. import os
  4. import json
  5. from utils.logger_config import logger
  6. class MiTVController:
  7. def __init__(self, config_path='kodi_config_prod.yaml'):
  8. self.config_path = config_path
  9. self.config = self._load_config()
  10. self.ha_config = self.config.get('home_assistant', {})
  11. self.base_url = self.ha_config.get('url', '').rstrip('/')
  12. self.token = self.ha_config.get('token', '')
  13. self.headers = {
  14. "Authorization": f"Bearer {self.token}",
  15. "Content-Type": "application/json",
  16. }
  17. self.kodi_servers = self.config.get('kodi_servers', [])
  18. def _load_config(self):
  19. if not os.path.exists(self.config_path):
  20. logger.error(f"配置文件不存在: {self.config_path}")
  21. return {}
  22. try:
  23. with open(self.config_path, 'r', encoding='utf-8') as f:
  24. return yaml.safe_load(f) or {}
  25. except Exception as e:
  26. logger.error(f"加载配置文件失败: {e}")
  27. return {}
  28. def _call_ha_service(self, entity_id, service="press", domain="button"):
  29. if not self.base_url or not self.token:
  30. logger.error("Home Assistant 配置缺失 (url or token)")
  31. return False
  32. if not entity_id:
  33. logger.warning("未配置 entity_id")
  34. return False
  35. url = f"{self.base_url}/api/services/{domain}/{service}"
  36. payload = {"entity_id": entity_id}
  37. logger.info(f"准备调用HA接口: URL={url}, Entity={entity_id}")
  38. try:
  39. response = requests.post(url, headers=self.headers, json=payload, timeout=5)
  40. if response.status_code in [200, 201]:
  41. logger.info(f"HA调用成功: {entity_id} -> {domain}.{service}, 响应: {response.text}")
  42. return True
  43. else:
  44. logger.error(f"HA调用失败: {response.status_code} - {response.text}")
  45. return False
  46. except Exception as e:
  47. logger.error(f"HA请求异常: {e}")
  48. return False
  49. def turn_on_display(self, kodi_id):
  50. """唤醒指定ID的电视"""
  51. server = next((s for s in self.kodi_servers if s.get('id') == kodi_id), None)
  52. if not server:
  53. logger.error(f"未找到ID为 {kodi_id} 的Kodi服务器配置")
  54. return False
  55. entity_id = server.get('ha_turn_on_entity_id')
  56. if not entity_id:
  57. logger.error(f"Kodi ID {kodi_id} 未配置唤醒实例ID (ha_turn_on_entity_id)")
  58. return False
  59. # 智能调用,不强制指定service,让 _call_ha_service 判断
  60. return self._call_ha_service(entity_id)
  61. def turn_off_display(self, kodi_id):
  62. """息屏指定ID的电视"""
  63. server = next((s for s in self.kodi_servers if s.get('id') == kodi_id), None)
  64. if not server:
  65. logger.error(f"未找到ID为 {kodi_id} 的Kodi服务器配置")
  66. return False
  67. entity_id = server.get('ha_turn_off_entity_id')
  68. if not entity_id:
  69. logger.error(f"Kodi ID {kodi_id} 未配置息屏实例ID (ha_turn_off_entity_id)")
  70. return False
  71. # 智能调用,不强制指定service
  72. return self._call_ha_service(entity_id)
  73. def turn_on_all_displays(self):
  74. """唤醒所有电视"""
  75. success_count = 0
  76. for server in self.kodi_servers:
  77. if self.turn_on_display(server.get('id')):
  78. success_count += 1
  79. return success_count > 0
  80. def turn_off_all_displays(self):
  81. """息屏所有电视"""
  82. success_count = 0
  83. for server in self.kodi_servers:
  84. if self.turn_off_display(server.get('id')):
  85. success_count += 1
  86. return success_count > 0
  87. # 单例实例
  88. mitv_controller = MiTVController()
  89. def turn_on_display(kodi_id):
  90. return mitv_controller.turn_on_display(kodi_id)
  91. def turn_off_display(kodi_id):
  92. return mitv_controller.turn_off_display(kodi_id)
  93. def turn_on_all_displays():
  94. return mitv_controller.turn_on_all_displays()
  95. def turn_off_all_displays():
  96. return mitv_controller.turn_off_all_displays()