58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""
|
|
Outlet/Relay Accessory Implementation for HomeKit
|
|
|
|
Implements simple relay/outlet (on/off switch):
|
|
- On (read/write)
|
|
- OutletInUse (always true)
|
|
"""
|
|
|
|
from pyhap.accessory import Accessory
|
|
from pyhap.const import CATEGORY_OUTLET
|
|
|
|
|
|
class OutletAccessory(Accessory):
|
|
"""Relay/Outlet for simple on/off control."""
|
|
|
|
category = CATEGORY_OUTLET
|
|
|
|
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
|
"""
|
|
Initialize the outlet accessory.
|
|
|
|
Args:
|
|
driver: HAP driver instance
|
|
device: Device object from DeviceRegistry
|
|
api_client: ApiClient for sending commands
|
|
display_name: Optional display name (defaults to device.friendly_name)
|
|
"""
|
|
name = display_name or device.friendly_name or device.name
|
|
super().__init__(driver, name, *args, **kwargs)
|
|
self.device = device
|
|
self.api_client = api_client
|
|
|
|
# Add Outlet service
|
|
self.outlet_service = self.add_preload_service('Outlet')
|
|
|
|
# Get On characteristic and set callback
|
|
self.on_char = self.outlet_service.get_characteristic('On')
|
|
self.on_char.setter_callback = self.set_on
|
|
|
|
# OutletInUse is always true (relay is always functional)
|
|
self.in_use_char = self.outlet_service.get_characteristic('OutletInUse')
|
|
self.in_use_char.set_value(True)
|
|
|
|
def set_on(self, value):
|
|
"""Called when HomeKit wants to turn outlet on/off."""
|
|
power_state = "on" if value else "off"
|
|
payload = {
|
|
"type": "relay",
|
|
"payload": {"power": power_state}
|
|
}
|
|
self.api_client.post_device_set(self.device.device_id, payload["type"], payload["payload"])
|
|
|
|
def update_state(self, state_payload):
|
|
"""Update state from API event."""
|
|
if "power" in state_payload:
|
|
is_on = state_payload["power"] == "on"
|
|
self.on_char.set_value(is_on)
|