Initial Home Assistant Configuration
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
""" Implement the services of this implementation """
|
||||
from home_connect_async import HomeConnect, HomeConnectError, Appliance
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.helpers import device_registry as dr
|
||||
|
||||
|
||||
class Services():
|
||||
""" Collection of the Services offered by the integration """
|
||||
def __init__(self, hass:HomeAssistant, homeconnect:HomeConnect) -> None:
|
||||
self.homeconnect = homeconnect
|
||||
self.hass = hass
|
||||
self.dr = dr.async_get(hass)
|
||||
|
||||
async def async_select_program(self, call) -> None:
|
||||
""" Service for selecting a program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
program_key = data['program_key']
|
||||
options = data.get('options')
|
||||
validate = data.get('validate')
|
||||
try:
|
||||
await appliance.async_select_program(program_key, options, validate)
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
|
||||
async def async_start_program(self, call) -> None:
|
||||
""" Service for starting the currently selected program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
program_key = data.get('program_key')
|
||||
options = data.get('options')
|
||||
validate = data.get('validate')
|
||||
try:
|
||||
await appliance.async_start_program(program_key, options, validate)
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
|
||||
|
||||
async def async_stop_program(self, call) -> None:
|
||||
""" Service for stopping the currently active program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_stop_active_program()
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
|
||||
async def async_pause_program(self, call) -> None:
|
||||
""" Service for pausing the currently active program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_pause_active_program()
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
|
||||
async def async_resume_program(self, call) -> None:
|
||||
""" Service for stopping the currently active program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_resume_paused_program()
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
|
||||
async def async_set_program_option(self, call) -> None:
|
||||
""" Service for setting an option on the current program """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_set_option(data['key'], data['value'])
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
except ValueError as ex:
|
||||
raise HomeAssistantError(str(ex)) from ex
|
||||
|
||||
|
||||
async def async_apply_setting(self, call) -> None:
|
||||
""" Service for applying an appliance setting """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_apply_setting(data['key'], data['value'])
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
except ValueError as ex:
|
||||
raise HomeAssistantError(str(ex)) from ex
|
||||
|
||||
async def async_run_command(self, call) -> None:
|
||||
""" Service for running a command on an appliance """
|
||||
data = call.data
|
||||
appliance = self.get_appliance_from_device_id(data['device_id'])
|
||||
if appliance:
|
||||
try:
|
||||
await appliance.async_send_command(data['key'], data['value'])
|
||||
except HomeConnectError as ex:
|
||||
raise HomeAssistantError(ex.error_description if ex.error_description else ex.msg) from ex
|
||||
except ValueError as ex:
|
||||
raise HomeAssistantError(str(ex)) from ex
|
||||
|
||||
def get_appliance_from_device_id(self, device_id) -> Appliance|None:
|
||||
""" Helper function to get an appliance from the Home Assistant device_id """
|
||||
device = self.dr.devices[device_id]
|
||||
haId = list(device.identifiers)[0][1]
|
||||
for (key, appliance) in self.homeconnect.appliances.items():
|
||||
if key.lower().replace('-','_') == haId:
|
||||
return appliance
|
||||
return None
|
||||
Reference in New Issue
Block a user