1
0

led_interface.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. """
  2. Unified LED interface for different LED control systems (WLED, Hyperion, etc.)
  3. Provides a common abstraction layer for pattern manager integration.
  4. """
  5. from typing import Optional, Literal
  6. from modules.led.led_controller import LEDController, effect_loading as wled_loading, effect_idle as wled_idle, effect_connected as wled_connected, effect_playing as wled_playing
  7. from modules.led.hyperion_controller import HyperionController, effect_loading as hyperion_loading, effect_idle as hyperion_idle, effect_connected as hyperion_connected, effect_playing as hyperion_playing
  8. LEDProviderType = Literal["wled", "hyperion", "none"]
  9. class LEDInterface:
  10. """
  11. Unified interface for LED control that works with multiple backends.
  12. Automatically delegates to the appropriate controller based on configuration.
  13. """
  14. def __init__(self, provider: LEDProviderType = "none", ip_address: Optional[str] = None, port: Optional[int] = None):
  15. self.provider = provider
  16. self._controller = None
  17. if provider == "wled" and ip_address:
  18. self._controller = LEDController(ip_address)
  19. elif provider == "hyperion" and ip_address:
  20. port = port or 8090 # Default Hyperion port
  21. self._controller = HyperionController(ip_address, port)
  22. @property
  23. def is_configured(self) -> bool:
  24. """Check if LED controller is configured"""
  25. return self._controller is not None
  26. def update_config(self, provider: LEDProviderType, ip_address: Optional[str] = None, port: Optional[int] = None):
  27. """Update LED provider configuration"""
  28. self.provider = provider
  29. if provider == "wled" and ip_address:
  30. self._controller = LEDController(ip_address)
  31. elif provider == "hyperion" and ip_address:
  32. port = port or 8090
  33. self._controller = HyperionController(ip_address, port)
  34. else:
  35. self._controller = None
  36. def effect_loading(self) -> bool:
  37. """Show loading effect"""
  38. if not self.is_configured:
  39. return False
  40. if self.provider == "wled":
  41. return wled_loading(self._controller)
  42. elif self.provider == "hyperion":
  43. return hyperion_loading(self._controller)
  44. return False
  45. def effect_idle(self, effect_name: Optional[str] = None) -> bool:
  46. """Show idle effect"""
  47. if not self.is_configured:
  48. return False
  49. if self.provider == "wled":
  50. return wled_idle(self._controller)
  51. elif self.provider == "hyperion":
  52. return hyperion_idle(self._controller, effect_name)
  53. return False
  54. def effect_connected(self) -> bool:
  55. """Show connected effect"""
  56. if not self.is_configured:
  57. return False
  58. if self.provider == "wled":
  59. return wled_connected(self._controller)
  60. elif self.provider == "hyperion":
  61. return hyperion_connected(self._controller)
  62. return False
  63. def effect_playing(self, effect_name: Optional[str] = None) -> bool:
  64. """Show playing effect"""
  65. if not self.is_configured:
  66. return False
  67. if self.provider == "wled":
  68. return wled_playing(self._controller)
  69. elif self.provider == "hyperion":
  70. return hyperion_playing(self._controller, effect_name)
  71. return False
  72. def set_power(self, state: int) -> dict:
  73. """Set power state (0=Off, 1=On, 2=Toggle)"""
  74. if not self.is_configured:
  75. return {"connected": False, "message": "No LED controller configured"}
  76. return self._controller.set_power(state)
  77. def check_status(self) -> dict:
  78. """Check controller status"""
  79. if not self.is_configured:
  80. return {"connected": False, "message": "No LED controller configured"}
  81. if self.provider == "wled":
  82. return self._controller.check_wled_status()
  83. elif self.provider == "hyperion":
  84. return self._controller.check_hyperion_status()
  85. return {"connected": False, "message": "Unknown provider"}
  86. def get_controller(self):
  87. """Get the underlying controller instance (for advanced usage)"""
  88. return self._controller