sharkiq
sharkiq copied to clipboard
Python API for Shark IQ robot
sharkiqpy
Unofficial SDK for Shark IQ robot vacuums, designed primarily to support an integration for Home Assistant.
Installation
Use the package manager pip to install foobar.
pip install sharkiqpy
Usage
Simple Operation
from sharkiqpy import get_ayla_api, OperatingModes, Properties, PowerModes
USERNAME = '[email protected]'
PASSWORD = '$7r0nkP@s$w0rD'
ayla_api = get_ayla_api(USERNAME, PASSWORD)
ayla_api.sign_in()
shark_vacs = ayla_api.get_devices()
shark = shark_vacs[0]
shark.update()
shark.set_operating_mode(OperatingModes.START)
shark.return_to_base()
Async operation
import asyncio
from sharkiqpy import get_ayla_api, OperatingModes, SharkIqVacuum
USERNAME = '[email protected]'
PASSWORD = '$7r0nkP@s$w0rD'
async def main(ayla_api) -> SharkIqVacuum:
await ayla_api.async_sign_in()
shark_vacs = await ayla_api.async_get_devices()
shark = shark_vacs[0]
await shark.async_update()
await shark.async_find_device()
await shark.async_set_operating_mode(OperatingModes.START)
return shark
ayla_api = get_ayla_api(USERNAME, PASSWORD)
shark = asyncio.run(main(ayla_api))
Documentation
get_ayla_api(username, password, websession=None)
Returns and AylaApi object to interact with the Ayla Networks Device API conrolling the Shark IQ robot, with the app_id and app_secret parameters set for the Shark IQ robot.
class AylaAPI(username, password, app_id, app_secret, websession)
Class for interacting with the Ayla Networks Device API underlying the Shark IQ controls.
username: strpassword: strapp_id: strapp_secret: strwebsession: Optional[aiohttp.ClientSession] = NoneOptionalaiohttp.ClientSessionto use for async calls. If one is not provided, a newaiohttp.ClientSessionwill be created at the first async call.
Methods
get_devices()/async_get_devices()Get a list ofSharkIqVacuums for every device found inlist_devices()list_devices()/async_list_devices()Get a list of known device descriptiondictsrefesh_auth()/async_refesh_auth()Refresh the authentication tokenrequest(method, url, headers = None, auto_refresh = True, **kwargs)/async_request(...)Submit an HTTP request to the Ayla networks API with the auth headermethod: strAn HTTP method, usually'get'or'post'url: strheaders: Optional[Dict] = NoneOptionaldictof HTTP headers besides the auth header, which is included automaticallyauto_refresh: bool = TrueIfTrue, automatically callrefesh_auth()/async_refesh_auth()if the auth token is near expiration**kwargsPassed on torequests.requestoraiohttp.ClientSession.request
sign_in()/async_sign_in()Authenticatesign_out()/async_sign_out()Sign out
class SharkIqRobot(ayla_api, device_dct)
Primary API for interacting with Shark IQ vacuums
ayla_api: AylaApiAnAylaApiwith an authenticated connectiondevice_dct: DictAdictdescribing the device, usually obtained fromAylaApi.list_devices()
Methods
find_device()/async_find_device()Cause the device to emit an annoying chirpget_file_property_url(property_name)/async_get_file_property_url(property_name)Get the URL for the latest version of a'file'-type propertyproperty_name: Union[str, PropertyName]Either astrorPropertyNamesvalue for the desired property
get_file_property(property_name)/async_get_file_property(property_name)Get the contents of the latest version of a'file'-type propertyproperty_name: Union[str, PropertyName]Either astrorPropertyNamesvalue for the desired property
get_metadata()/async_get_metadata()Update some device metadata (vac_model_numberandvac_serial_number)set_operating_mode(mode)/async_set_operating_mode(mode)Set the operating mode. This is just a thin wrapper aroundset_property_value/async_set_property_valueprovided for convenience.- mode: OperatingModes Mode to set, e.g.,
OperatingModes.STARTto start the vacuum
- mode: OperatingModes Mode to set, e.g.,
get_property_value(property_name)/async_get_property_value(property_name)Returns the value ofproperty_name, cast to the appropriate typeproperty_name: Union[str, PropertyName]Either astrorPropertyNamesvalue for the desired property
set_property_value(property_name, property_value)/async_set_property_value(property_name, property_value)Set the value ofproperty_nameproperty_name: Union[str, PropertyName]Either astrorPropertyNamevalue for the desired propertyproperty_value: AnyNew value. Type checking is currently left to the remote API.
update()/async_update(property_list=None)Fetch the updated robot state from the remote apiproperty_list: Optional[Interable[str]]An optional iterable of property names. If specified, only those properties will be updated.
Properties
ayla_apiThe underlyingAylaApiobjecterror_codeError code, if any. NB: these can be very stale as they are not immediately reset in the API when the error is cleared.error_textEnglish description of theerror_code. The same caveat applies.nameThe device name as it appears in the SharkClean appoem_model_numberA "rough" model number that does not distinguish, for example, between robots with and without a self-emptying baseproperties_fullA dictionary representing all known device properties and their metadata (typeDict[str, Dict])property_valuesA convenience accessor intoproperties_fullmapping property names to valuesserial_numberThe unique device serial number used with the Ayla Networks API (NB: this name may change)vac_model_numberThe precise model numbervac_serial_numberThe serial number printed on the device
Enums
OperatingModesOperation modes to control the vacuum (START,STOP,PAUSE,RETURN)PowerModesVacuum power mode (ECO,NORMAL,MAX)PropertiesProperties to use withget_property_value/set_property_value
TODOs:
- Add support for mapping and room selection
- Once we have mapping, it may be possible to use the RSSI property combined with an increased update frequency to generate a wifi strength heatmap. Kind of orthogonal to the main purpose, but I really want to do this.