1
0
mirror of https://github.com/JarvyJ/HomeIntent.git synced 2022-02-11 01:01:05 +03:00

Home Intent: HA API translation support (#279)

* HA API translation support at API layer

* fix for empty list on call_service with added delay

* removed debugging print statements

* Update README.md

closes #274, #275
This commit is contained in:
Jarvy Jarvison
2022-01-09 12:21:39 -06:00
committed by GitHub
parent d04a94e4bd
commit 144de74b24
13 changed files with 208 additions and 120 deletions

View File

@@ -53,8 +53,8 @@ class HomeAssistantSettings(BaseModel):
class HomeAssistantComponent:
def __init__(self, config: HomeAssistantSettings):
self.api = HomeAssistantAPI(config.url, config.bearer_token)
def __init__(self, config: HomeAssistantSettings, language: str):
self.api = HomeAssistantAPI(config.url, config.bearer_token, language)
self.services = self.api.get("/api/services")
all_entities = self.api.get("/api/states")
self.entities = [x for x in all_entities if x["entity_id"] not in config.ignore_entities]
@@ -67,7 +67,9 @@ class HomeAssistantComponent:
def setup(home_intent):
# only needed if there are additional settings!
config = home_intent.get_config(HomeAssistantSettings)
home_assistant_component = HomeAssistantComponent(config)
home_assistant_component = HomeAssistantComponent(
config, home_intent.settings.home_intent.language
)
if "climate" in home_assistant_component.domains and "climate" not in config.ignore_domains:
climate = home_intent.import_module(f"{__name__}.climate")

View File

@@ -1,3 +1,7 @@
import json
from pathlib import Path
from time import sleep
import requests
from requests import Session
from requests.adapters import HTTPAdapter
@@ -9,7 +13,7 @@ class HomeAssistantAPIException(Exception):
class HomeAssistantAPI:
def __init__(self, url, bearer_token):
def __init__(self, url, bearer_token, language):
self.session = Session()
self.session.headers.update(
{
@@ -23,6 +27,20 @@ class HomeAssistantAPI:
self.session.mount("http://", HTTPAdapter(max_retries=retries))
self.session.mount("https://", HTTPAdapter(max_retries=retries))
# Setup the language stuff, the HA API returns state in English, so we need to translate it on our end
# to make life a bit easier
self.language = language
api_translation_file = Path(__file__).parent / f"./api_translations/{language}.json"
if language != "en":
if api_translation_file.is_file():
self.translation = json.load(api_translation_file.open())
else:
raise HomeAssistantAPIException(
f"API Translation file for language '{language}' doesn't exist. "
f"You will need to create one in components/home_assistant/api_translations/{language}.json"
)
# Make a test call to see if everything works
try:
self.get("/api/")
except requests.exceptions.ConnectionError:
@@ -43,7 +61,26 @@ class HomeAssistantAPI:
response.raise_for_status()
return response.json()
def get_entity(self, entity):
def get_entity(self, entity, service_response=None):
entity = self._get_entity(entity, service_response)
if self.language != "en":
if "state" in entity:
entity["state"] = self.translation[entity["state"]]
return entity
def _get_entity(self, entity, service_response=None):
if isinstance(service_response, list):
# call_service in HA returns a list of entities.
# There's a bug where sometimes it returns an empty list
# you have to wait ~1s to actually get the new state
if service_response:
try:
return _extract_from_list(service_response, entity)
except EntityIdNotFoundInList:
pass
sleep(1)
return self.get(f"/api/states/{entity}")
def post(self, url, body):
@@ -53,3 +90,15 @@ class HomeAssistantAPI:
def call_service(self, domain, service, body):
return self.post(f"/api/services/{domain}/{service}", body)
class EntityIdNotFoundInList(LookupError):
pass
def _extract_from_list(service_response, entity_id):
for entity in service_response:
if entity["entity_id"] == entity_id:
return entity
raise EntityIdNotFoundInList()

View File

@@ -0,0 +1,5 @@
The Home Assistant API returns certain attributes/states in english, that a user may have to translate across multiple components. The json files in this directory translate the specific english words in API responses to the corresponding languages.
This includes things like "on" and "off" as well as "high", "medium", and "low".
The json file will get auto-loaded based on language and is used in the HA API code to handle the translation.

View File

@@ -0,0 +1,4 @@
{
"on": "an",
"off": "aus"
}

View File

@@ -106,20 +106,20 @@ class BaseClimate:
return self._turn_off(climate)
def _turn_off(self, climate):
self.ha.api.call_service("climate", "turn_off", {"entity_id": climate})
response = self.ha.api.get_entity(climate)
response = self.ha.api.call_service("climate", "turn_off", {"entity_id": climate})
response = self.ha.api.get_entity(climate, response)
return response
def _turn_on(self, climate):
self.ha.api.call_service("climate", "turn_on", {"entity_id": climate})
response = self.ha.api.get_entity(climate)
response = self.ha.api.call_service("climate", "turn_on", {"entity_id": climate})
response = self.ha.api.get_entity(climate, response)
return response
def _set_hvac_mode(self, climate, climate_hvac_mode):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate", "set_hvac_mode", {"entity_id": climate, "hvac_mode": climate_hvac_mode}
)
response = self.ha.api.get_entity(climate)
response = self.ha.api.get_entity(climate, response)
return response
def _set_target_temperature(self, climate_target_temperature_entity, temperature: float):
@@ -127,12 +127,12 @@ class BaseClimate:
SupportedFeatures.SUPPORT_TARGET_TEMPERATURE
in self.climate_device_features[climate_target_temperature_entity]
):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate",
"set_temperature",
{"entity_id": climate_target_temperature_entity, "temperature": temperature},
)
response = self.ha.api.get_entity(climate_target_temperature_entity)
response = self.ha.api.get_entity(climate_target_temperature_entity, response)
return response
def _set_target_temperature_high(
@@ -143,7 +143,7 @@ class BaseClimate:
in self.climate_device_features[climate_target_temperature_range_entity]
):
response = self.ha.api.get_entity(climate_target_temperature_range_entity)
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate",
"set_temperature",
{
@@ -152,7 +152,7 @@ class BaseClimate:
"target_temp_high": temperature,
},
)
response = self.ha.api.get_entity(climate_target_temperature_range_entity)
response = self.ha.api.get_entity(climate_target_temperature_range_entity, response)
return response
def _set_target_temperature_low(
@@ -163,7 +163,7 @@ class BaseClimate:
in self.climate_device_features[climate_target_temperature_range_entity]
):
response = self.ha.api.get_entity(climate_target_temperature_range_entity)
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate",
"set_temperature",
{
@@ -172,7 +172,7 @@ class BaseClimate:
"target_temp_high": response["attributes"]["target_temp_high"],
},
)
response = self.ha.api.get_entity(climate_target_temperature_range_entity)
response = self.ha.api.get_entity(climate_target_temperature_range_entity, response)
return response
def _set_humidity(self, climate_target_humidity_entity, humidity: int):
@@ -180,12 +180,12 @@ class BaseClimate:
SupportedFeatures.SUPPORT_TARGET_HUMIDITY
in self.climate_device_features[climate_target_humidity_entity]
):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate",
"set_humidity",
{"entity_id": climate_target_humidity_entity, "humidity": humidity},
)
response = self.ha.api.get_entity(climate_target_humidity_entity)
response = self.ha.api.get_entity(climate_target_humidity_entity, response)
return response
def _set_preset_mode(self, climate_preset_mode_entity, climate_preset_mode):
@@ -193,12 +193,12 @@ class BaseClimate:
SupportedFeatures.SUPPORT_PRESET_MODE
in self.climate_device_features[climate_preset_mode_entity]
):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate",
"set_preset_mode",
{"entity_id": climate_preset_mode_entity, "preset_mode": climate_preset_mode},
)
response = self.ha.api.get_entity(climate_preset_mode_entity)
response = self.ha.api.get_entity(climate_preset_mode_entity, response)
return response
def _toggle_aux_heat(self, climate_aux_heat_entity):
@@ -209,15 +209,15 @@ class BaseClimate:
return self._turn_off(climate_aux_heat_entity)
def _turn_aux_off(self, climate_aux_heat_entity):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate", "set_aux_heat", {"entity_id": climate_aux_heat_entity, "aux_heat": False}
)
response = self.ha.api.get_entity(climate_aux_heat_entity)
response = self.ha.api.get_entity(climate_aux_heat_entity, response)
return response
def _turn_aux_on(self, climate_aux_heat_entity):
self.ha.api.call_service(
response = self.ha.api.call_service(
"climate", "set_aux_heat", {"entity_id": climate_aux_heat_entity, "aux_heat": True}
)
response = self.ha.api.get_entity(climate_aux_heat_entity)
response = self.ha.api.get_entity(climate_aux_heat_entity, response)
return response

View File

@@ -94,59 +94,69 @@ class BaseCover:
def _open_cover(self, cover_open):
if SupportedFeatures.SUPPORT_OPEN in self.cover_features[cover_open]:
self.ha.api.call_service("cover", "open_cover", {"entity_id": cover_open})
response = self.ha.api.call_service("cover", "open_cover", {"entity_id": cover_open})
elif SupportedFeatures.SUPPORT_OPEN_TILT in self.cover_features[cover_open]:
self.ha.api.call_service("cover", "open_cover_tilt", {"entity_id": cover_open})
response = self.ha.api.get_entity(cover_open)
response = self.ha.api.call_service(
"cover", "open_cover_tilt", {"entity_id": cover_open}
)
response = self.ha.api.get_entity(cover_open, response)
return response
def _close_cover(self, cover_close):
if SupportedFeatures.SUPPORT_CLOSE in self.cover_features[cover_close]:
self.ha.api.call_service("cover", "close_cover", {"entity_id": cover_close})
response = self.ha.api.call_service("cover", "close_cover", {"entity_id": cover_close})
elif SupportedFeatures.SUPPORT_CLOSE_TILT in self.cover_features[cover_close]:
self.ha.api.call_service("cover", "close_cover_tilt", {"entity_id": cover_close})
response = self.ha.api.get_entity(cover_close)
response = self.ha.api.call_service(
"cover", "close_cover_tilt", {"entity_id": cover_close}
)
response = self.ha.api.get_entity(cover_close, response)
return response
def _stop_cover(self, cover_stop):
if SupportedFeatures.SUPPORT_STOP in self.cover_features[cover_stop]:
self.ha.api.call_service("cover", "stop_cover", {"entity_id": cover_stop})
response = self.ha.api.call_service("cover", "stop_cover", {"entity_id": cover_stop})
if SupportedFeatures.SUPPORT_STOP_TILT in self.cover_features[cover_stop]:
self.ha.api.call_service("cover", "stop_cover_tilt", {"entity_id": cover_stop})
response = self.ha.api.get_entity(cover_stop)
response = self.ha.api.call_service(
"cover", "stop_cover_tilt", {"entity_id": cover_stop}
)
response = self.ha.api.get_entity(cover_stop, response)
return response
def _open_cover_tilt(self, cover_open_tilt):
self.ha.api.call_service("cover", "open_cover_tilt", {"entity_id": cover_open_tilt})
response = self.ha.api.get_entity(cover_open_tilt)
response = self.ha.api.call_service(
"cover", "open_cover_tilt", {"entity_id": cover_open_tilt}
)
response = self.ha.api.get_entity(cover_open_tilt, response)
return response
def _close_cover_tilt(self, cover_close_tilt):
self.ha.api.call_service("cover", "close_cover_tilt", {"entity_id": cover_close_tilt})
response = self.ha.api.get_entity(cover_close_tilt)
response = self.ha.api.call_service(
"cover", "close_cover_tilt", {"entity_id": cover_close_tilt}
)
response = self.ha.api.get_entity(cover_close_tilt, response)
return response
def _set_cover_position(self, cover_set_position, cover_positions):
if SupportedFeatures.SUPPORT_SET_POSITION:
self.ha.api.call_service(
response = self.ha.api.call_service(
"cover",
"set_cover_position",
{"entity_id": cover_set_position, "position": cover_positions},
)
elif SupportedFeatures.SUPPORT_SET_TILT_POSITION:
self.ha.api.call_service(
response = self.ha.api.call_service(
"cover",
"set_cover_tilt_position",
{"entity_id": cover_set_position, "position": cover_positions},
)
response = self.ha.api.get_entity(cover_set_position)
response = self.ha.api.get_entity(cover_set_position, response)
return response
def _set_cover_tilt_position(self, cover_set_tilt_position, cover_positions):
self.ha.api.call_service(
response = self.ha.api.call_service(
"cover",
"set_cover_tilt_position",
{"entity_id": cover_set_tilt_position, "tilt_position": cover_positions},
)
response = self.ha.api.get_entity(cover_set_tilt_position)
response = self.ha.api.get_entity(cover_set_tilt_position, response)
return response

View File

@@ -75,55 +75,65 @@ class BaseFan:
return slots
def _toggle_fan(self, fan):
self.ha.api.call_service("fan", "toggle", {"entity_id": fan})
response = self.ha.api.get_entity(fan)
response = self.ha.api.call_service("fan", "toggle", {"entity_id": fan})
response = self.ha.api.get_entity(fan, response)
return response
def _turn_off(self, fan):
self.ha.api.call_service("fan", "turn_off", {"entity_id": fan})
response = self.ha.api.get_entity(fan)
response = self.ha.api.call_service("fan", "turn_off", {"entity_id": fan})
response = self.ha.api.get_entity(fan, response)
return response
def _turn_on(self, fan):
self.ha.api.call_service("fan", "turn_on", {"entity_id": fan})
response = self.ha.api.get_entity(fan)
response = self.ha.api.call_service("fan", "turn_on", {"entity_id": fan})
response = self.ha.api.get_entity(fan, response)
return response
def _oscillate_fan(self, oscillating_fan):
response = self.ha.api.get_entity(oscillating_fan)
oscillation_change = not response["attributes"]["oscillating"]
self.ha.api.call_service(
"fan", "oscillate", {"entity_id": oscillating_fan, "oscillating": oscillation_change,},
response = self.ha.api.call_service(
"fan",
"oscillate",
{
"entity_id": oscillating_fan,
"oscillating": oscillation_change,
},
)
response = self.ha.api.get_entity(oscillating_fan)
response = self.ha.api.get_entity(oscillating_fan, response)
return response
def _set_preset(self, preset_fan, preset_mode):
self.ha.api.call_service(
response = self.ha.api.call_service(
"fan", "set_preset_mode", {"entity_id": preset_fan, "preset_mode": preset_mode}
)
response = self.ha.api.get_entity(preset_fan)
return f"Setting the {response['attributes']['friendly_name']} to {preset_mode}"
response = self.ha.api.get_entity(preset_fan, response)
return response
def _reverse_airflow(self, directional_fan):
response = self.ha.api.get_entity(directional_fan)
forward_or_reverse = (
"reverse" if response["attributes"]["direction"] == "reverse" else "forward"
)
self.ha.api.call_service(
response = self.ha.api.call_service(
"fan",
"set_direction",
{"entity_id": directional_fan, "direction": forward_or_reverse,},
{
"entity_id": directional_fan,
"direction": forward_or_reverse,
},
)
response = self.ha.api.get_entity(directional_fan)
response = self.ha.api.get_entity(directional_fan, response)
return response
def _set_fan_speed(self, speed_fan, fan_speed):
self.ha.api.call_service(
"fan", "set_speed", {"entity_id": speed_fan, "speed": fan_speed},
response = self.ha.api.call_service(
"fan",
"set_speed",
{"entity_id": speed_fan, "speed": fan_speed},
)
response = self.ha.api.get_entity(speed_fan)
return f"Setting the {response['attributes']['friendly_name']} to {fan_speed}"
response = self.ha.api.get_entity(speed_fan, response)
return response
def _increase_fan_speed(self, speed_fan, fan_speed_list):
response = self.ha.api.get_entity(speed_fan)
@@ -138,10 +148,12 @@ class BaseFan:
else:
new_fan_speed = fan_speed_list[current_fan_speed_index + 1]
self.ha.api.call_service(
"fan", "set_speed", {"entity_id": speed_fan, "speed": new_fan_speed},
response = self.ha.api.call_service(
"fan",
"set_speed",
{"entity_id": speed_fan, "speed": new_fan_speed},
)
response = self.ha.api.get_entity(speed_fan)
response = self.ha.api.get_entity(speed_fan, response)
return response, new_fan_speed
def _decrease_fan_speed(self, speed_fan, fan_speed_list):
@@ -154,8 +166,10 @@ class BaseFan:
else:
new_fan_speed = fan_speed_list[current_fan_speed_index - 1]
self.ha.api.call_service(
"fan", "set_speed", {"entity_id": speed_fan, "speed": new_fan_speed},
response = self.ha.api.call_service(
"fan",
"set_speed",
{"entity_id": speed_fan, "speed": new_fan_speed},
)
response = self.ha.api.get_entity(speed_fan)
response = self.ha.api.get_entity(speed_fan, response)
return response, new_fan_speed

View File

@@ -18,16 +18,16 @@ class BaseGroup:
return slots
def _toggle_group(self, group):
self.ha.api.call_service("homeassistant", "toggle", {"entity_id": group})
response = self.ha.api.get_entity(group)
response = self.ha.api.call_service("homeassistant", "toggle", {"entity_id": group})
response = self.ha.api.get_entity(group, response)
return response
def _turn_on_group(self, group):
self.ha.api.call_service("homeassistant", "turn_on", {"entity_id": group})
response = self.ha.api.get_entity(group)
response = self.ha.api.call_service("homeassistant", "turn_on", {"entity_id": group})
response = self.ha.api.get_entity(group, response)
return response
def _turn_off_group(self, group):
self.ha.api.call_service("homeassistant", "turn_off", {"entity_id": group})
response = self.ha.api.get_entity(group)
response = self.ha.api.call_service("homeassistant", "turn_off", {"entity_id": group})
response = self.ha.api.get_entity(group, response)
return response

View File

@@ -32,30 +32,34 @@ class BaseHumidifier:
return humidifier_modes
def _toggle_humidifier(self, humidifier):
self.ha.api.call_service("humidifier", "toggle", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier)
response = self.ha.api.call_service("humidifier", "toggle", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier, response)
return response
def _turn_off(self, humidifier):
self.ha.api.call_service("humidifier", "turn_off", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier)
response = self.ha.api.call_service("humidifier", "turn_off", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier, response)
return response
def _turn_on(self, humidifier):
self.ha.api.call_service("humidifier", "turn_on", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier)
response = self.ha.api.call_service("humidifier", "turn_on", {"entity_id": humidifier})
response = self.ha.api.get_entity(humidifier, response)
return response
def _change_humidity(self, humidifier, humidity):
self.ha.api.call_service(
"humidifier", "set_humidity", {"entity_id": humidifier, "humidity": humidity},
response = self.ha.api.call_service(
"humidifier",
"set_humidity",
{"entity_id": humidifier, "humidity": humidity},
)
response = self.ha.api.get_entity(humidifier)
response = self.ha.api.get_entity(humidifier, response)
return response
def _set_mode(self, humidifier, humidifier_mode):
self.ha.api.call_service(
"humidifier", "set_mode", {"entity_id": humidifier, "mode": humidifier_mode},
response = self.ha.api.call_service(
"humidifier",
"set_mode",
{"entity_id": humidifier, "mode": humidifier_mode},
)
response = self.ha.api.get_entity(humidifier)
response = self.ha.api.get_entity(humidifier, response)
return response

View File

@@ -53,60 +53,60 @@ class BaseLight:
return color_temperatures
def _toggle_light(self, light):
self.ha.api.call_service("light", "toggle", {"entity_id": light})
response = self.ha.api.get_entity(light)
response = self.ha.api.call_service("light", "toggle", {"entity_id": light})
response = self.ha.api.get_entity(light, response)
return response
def _turn_on(self, light):
self.ha.api.call_service("light", "turn_on", {"entity_id": light})
response = self.ha.api.get_entity(light)
response = self.ha.api.call_service("light", "turn_on", {"entity_id": light})
response = self.ha.api.get_entity(light, response)
return response
def _turn_off(self, light):
self.ha.api.call_service("light", "turn_off", {"entity_id": light})
response = self.ha.api.get_entity(light)
response = self.ha.api.call_service("light", "turn_off", {"entity_id": light})
response = self.ha.api.get_entity(light, response)
return response
def _change_color(self, light, color):
self.ha.api.call_service(
response = self.ha.api.call_service(
"light", "turn_on", {"entity_id": light, "rgb_color": color_to_hex(color)}
)
response = self.ha.api.get_entity(light)
response = self.ha.api.get_entity(light, response)
color_name = self.color_value_to_name[color]
return response, color_name
def _change_color_brightness(self, light, color, brightness):
self.ha.api.call_service(
response = self.ha.api.call_service(
"light",
"turn_on",
{"entity_id": light, "rgb_color": color_to_hex(color), "brightness_pct": brightness},
)
response = self.ha.api.get_entity(light)
response = self.ha.api.get_entity(light, response)
color_name = self.color_value_to_name[color]
return response, color_name
def _change_brightness(self, light, brightness):
self.ha.api.call_service(
response = self.ha.api.call_service(
"light", "turn_on", {"entity_id": light, "brightness_pct": brightness}
)
response = self.ha.api.get_entity(light)
response = self.ha.api.get_entity(light, response)
return response
def _change_color_temperature(self, light, color_temperature):
self.ha.api.call_service(
response = self.ha.api.call_service(
"light", "turn_on", {"entity_id": light, "kelvin": color_temperature}
)
response = self.ha.api.get_entity(light)
response = self.ha.api.get_entity(light, response)
color_name = self.color_temp_to_name[int(color_temperature)]
return response, color_name
def _change_color_temperature_brightness(self, light, color_temperature, brightness):
self.ha.api.call_service(
response = self.ha.api.call_service(
"light",
"turn_on",
{"entity_id": light, "kelvin": color_temperature, "brightness_pct": brightness},
)
response = self.ha.api.get_entity(light)
response = self.ha.api.get_entity(light, response)
color_name = self.color_temp_to_name[int(color_temperature)]
return response, color_name

View File

@@ -30,16 +30,16 @@ class BaseLock:
return slots
def _lock_the_lock(self, lock):
self.ha.api.call_service("lock", "lock", {"entity_id": lock})
response = self.ha.api.get_entity(lock)
response = self.ha.api.call_service("lock", "lock", {"entity_id": lock})
response = self.ha.api.get_entity(lock, response)
return response
def _unlock_the_lock(self, lock):
self.ha.api.call_service("lock", "unlock", {"entity_id": lock})
response = self.ha.api.get_entity(lock)
response = self.ha.api.call_service("lock", "unlock", {"entity_id": lock})
response = self.ha.api.get_entity(lock, response)
return response
def _open_the_lock(self, lock_open_entity):
self.ha.api.call_service("lock", "open", {"entity_id": lock_open_entity})
response = self.ha.api.get_entity(lock_open_entity)
response = self.ha.api.call_service("lock", "open", {"entity_id": lock_open_entity})
response = self.ha.api.get_entity(lock_open_entity, response)
return response

View File

@@ -14,16 +14,16 @@ class BaseRemote:
return slots
def _toggle_remote(self, remote):
self.ha.api.call_service("remote", "toggle", {"entity_id": remote})
response = self.ha.api.get_entity(remote)
response = self.ha.api.call_service("remote", "toggle", {"entity_id": remote})
response = self.ha.api.get_entity(remote, response)
return response
def _turn_off(self, remote):
self.ha.api.call_service("remote", "turn_off", {"entity_id": remote})
response = self.ha.api.get_entity(remote)
response = self.ha.api.call_service("remote", "turn_off", {"entity_id": remote})
response = self.ha.api.get_entity(remote, response)
return response
def _turn_on(self, remote):
self.ha.api.call_service("remote", "turn_on", {"entity_id": remote})
response = self.ha.api.get_entity(remote)
response = self.ha.api.call_service("remote", "turn_on", {"entity_id": remote})
response = self.ha.api.get_entity(remote, response)
return response

View File

@@ -18,16 +18,16 @@ class BaseSwitch:
return slots
def _toggle_switch(self, switch):
self.ha.api.call_service("switch", "toggle", {"entity_id": switch})
response = self.ha.api.get_entity(switch)
response = self.ha.api.call_service("switch", "toggle", {"entity_id": switch})
response = self.ha.api.get_entity(switch, response)
return response
def _turn_off(self, switch):
self.ha.api.call_service("switch", "turn_off", {"entity_id": switch})
response = self.ha.api.get_entity(switch)
response = self.ha.api.call_service("switch", "turn_off", {"entity_id": switch})
response = self.ha.api.get_entity(switch, response)
return response
def _turn_on(self, switch):
self.ha.api.call_service("switch", "turn_on", {"entity_id": switch})
response = self.ha.api.get_entity(switch)
response = self.ha.api.call_service("switch", "turn_on", {"entity_id": switch})
response = self.ha.api.get_entity(switch, response)
return response