seems to work
This commit is contained in:
72
apps/homekit/accessories/thermostat.py
Normal file
72
apps/homekit/accessories/thermostat.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""
|
||||
Thermostat Accessory Implementation for HomeKit
|
||||
|
||||
Implements thermostat control according to homekit_mapping.md:
|
||||
- CurrentTemperature (read-only)
|
||||
- TargetTemperature (read/write)
|
||||
- CurrentHeatingCoolingState (fixed: 1 = heating)
|
||||
- TargetHeatingCoolingState (fixed: 3 = auto)
|
||||
"""
|
||||
|
||||
from pyhap.accessory import Accessory
|
||||
from pyhap.const import CATEGORY_THERMOSTAT
|
||||
|
||||
|
||||
class ThermostatAccessory(Accessory):
|
||||
"""Thermostat with temperature control."""
|
||||
|
||||
category = CATEGORY_THERMOSTAT
|
||||
|
||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
||||
"""
|
||||
Initialize the thermostat 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 Thermostat service
|
||||
self.thermostat_service = self.add_preload_service('Thermostat')
|
||||
|
||||
# Get characteristics
|
||||
self.current_temp_char = self.thermostat_service.get_characteristic('CurrentTemperature')
|
||||
self.target_temp_char = self.thermostat_service.get_characteristic('TargetTemperature')
|
||||
self.current_heating_cooling_char = self.thermostat_service.get_characteristic('CurrentHeatingCoolingState')
|
||||
self.target_heating_cooling_char = self.thermostat_service.get_characteristic('TargetHeatingCoolingState')
|
||||
|
||||
# Set callback for target temperature
|
||||
self.target_temp_char.setter_callback = self.set_target_temperature
|
||||
|
||||
# Set fixed heating/cooling states (mode is always "auto")
|
||||
# CurrentHeatingCoolingState: 0=Off, 1=Heat, 2=Cool
|
||||
self.current_heating_cooling_char.set_value(1) # Always heating
|
||||
|
||||
# TargetHeatingCoolingState: 0=Off, 1=Heat, 2=Cool, 3=Auto
|
||||
self.target_heating_cooling_char.set_value(3) # Always auto
|
||||
|
||||
# Set temperature range (5-30°C as per UI)
|
||||
self.target_temp_char.properties['minValue'] = 5
|
||||
self.target_temp_char.properties['maxValue'] = 30
|
||||
self.target_temp_char.properties['minStep'] = 0.5
|
||||
|
||||
def set_target_temperature(self, value):
|
||||
"""Called when HomeKit wants to change target temperature."""
|
||||
payload = {
|
||||
"type": "thermostat",
|
||||
"payload": {"target": float(value)}
|
||||
}
|
||||
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 "current" in state_payload:
|
||||
self.current_temp_char.set_value(float(state_payload["current"]))
|
||||
if "target" in state_payload:
|
||||
self.target_temp_char.set_value(float(state_payload["target"]))
|
||||
Reference in New Issue
Block a user