Library Design & Modules

This page aims to provide some details on the design and internals of this library. You might be interested in this if you want to improve this library, or if you are just looking to access some information that is not currently exposed.

Update Cycle

When update() is called, the library constructs a query to send to the device based on supported modules. Internally, each module defines query() to describe what they want query during the update.

The returned data is cached internally to avoid I/O on property accesses. All properties defined both in the device class and in the module classes follow this principle.

While the properties are designed to provide a nice API to use for common use cases, you may sometimes want to access the raw, cached data as returned by the device. This can be done using the internal_state property.

Modules

The functionality provided by all SmartDevice instances is (mostly) done inside separate modules. While the individual device-type specific classes provide an easy access for the most import features, you can also access individual modules through kasa.SmartDevice.modules. You can get the list of supported modules for a given device instance using supported_modules.

Note

If you only need some module-specific information, you can call the wanted method on the module to avoid using update().

API documentation for modules

Module for individual feature modules.

class kasa.modules.AmbientLight(device: SmartDevice, module: str)[source]

Implements ambient light controls for the motion sensor.

call(method, params=None)

Call the given method with the given parameters.

async current_brightness() int[source]

Return current brightness.

Return value units.

property data

Return the module specific raw data from the last update.

property enabled: bool

Return True if the module is enabled.

property is_supported: bool

Return whether the module is supported by the device.

property presets: dict

Return device-defined presets for brightness setting.

query()[source]

Request configuration.

query_for_command(query, params=None)

Create a request object for the given parameters.

async set_brightness_limit(value: int)[source]

Set the limit when the motion sensor is inactive.

See presets for preset values. Custom values are also likely allowed.

async set_enabled(state: bool)[source]

Enable/disable LAS.

class kasa.modules.Antitheft(device: SmartDevice, module: str)[source]

Implementation of the antitheft module.

This shares the functionality among other rule-based modules.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

async delete_all_rules()

Delete all rules.

async delete_rule(rule: kasa.modules.rulemodule.Rule)

Delete the given rule.

property is_supported: bool

Return whether the module is supported by the device.

query()

Prepare the query for rules.

query_for_command(query, params=None)

Create a request object for the given parameters.

property rules: List[kasa.modules.rulemodule.Rule]

Return the list of rules for the service.

async set_enabled(state: bool)

Enable or disable the service.

class kasa.modules.Cloud(device: SmartDevice, module: str)[source]

Module implementing support for cloud services.

call(method, params=None)

Call the given method with the given parameters.

connect(username: str, password: str)[source]

Login to the cloud using given information.

property data

Return the module specific raw data from the last update.

disconnect()[source]

Disconnect from the cloud.

get_available_firmwares()[source]

Return list of available firmwares.

property info: kasa.modules.cloud.CloudInfo

Return information about the cloud connectivity.

property is_supported: bool

Return whether the module is supported by the device.

query()[source]

Request cloud connectivity info.

query_for_command(query, params=None)

Create a request object for the given parameters.

set_server(url: str)[source]

Set the update server URL.

class kasa.modules.Countdown(device: SmartDevice, module: str)[source]

Implementation of countdown module.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

async delete_all_rules()

Delete all rules.

async delete_rule(rule: kasa.modules.rulemodule.Rule)

Delete the given rule.

property is_supported: bool

Return whether the module is supported by the device.

query()

Prepare the query for rules.

query_for_command(query, params=None)

Create a request object for the given parameters.

property rules: List[kasa.modules.rulemodule.Rule]

Return the list of rules for the service.

async set_enabled(state: bool)

Enable or disable the service.

class kasa.modules.Emeter(device: SmartDevice, module: str)[source]

Emeter module.

call(method, params=None)

Call the given method with the given parameters.

property daily_data

Return statistics on daily basis.

property data

Return the module specific raw data from the last update.

property emeter_this_month: Optional[float]

Return this month’s energy consumption in kWh.

property emeter_today: Optional[float]

Return today’s energy consumption in kWh.

async erase_stats()[source]

Erase all stats.

Uses different query than usage meter.

async get_daystat(*, year, month, kwh=True)[source]

Return daily stats for the given year & month.

async get_monthstat(*, year, kwh=True)[source]

Return monthly stats for the given year.

async get_realtime()[source]

Return real-time statistics.

property is_supported: bool

Return whether the module is supported by the device.

property monthly_data

Return statistics on monthly basis.

query()

Return the base query.

query_for_command(query, params=None)

Create a request object for the given parameters.

property realtime: kasa.emeterstatus.EmeterStatus

Return current energy readings.

property usage_this_month

Return usage in this month in minutes.

property usage_today

Return today’s usage in minutes.

class kasa.modules.Module(device: SmartDevice, module: str)[source]

Base class implemention for all modules.

The base classes should implement query to return the query they want to be executed during the regular update cycle.

call(method, params=None)[source]

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

property is_supported: bool

Return whether the module is supported by the device.

abstract query()[source]

Query to execute during the update cycle.

The inheriting modules implement this to include their wanted queries to the query that gets executed when Device.update() gets called.

query_for_command(query, params=None)[source]

Create a request object for the given parameters.

class kasa.modules.Motion(device: SmartDevice, module: str)[source]

Implements the motion detection (PIR) module.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

property enabled: bool

Return True if module is enabled.

property is_supported: bool

Return whether the module is supported by the device.

query()[source]

Request PIR configuration.

query_for_command(query, params=None)

Create a request object for the given parameters.

property range: kasa.modules.motion.Range

Return motion detection range.

async set_enabled(state: bool)[source]

Enable/disable PIR.

async set_range(*, range: Optional[kasa.modules.motion.Range] = None, custom_range: Optional[int] = None)[source]

Set the range for the sensor.

Parameters
  • range – for using standard ranges

  • custom_range – range in decimeters, overrides the range parameter

class kasa.modules.Rule(*, id: str, name: str, enable: bool, wday: List[int], repeat: bool, sact: Optional[kasa.modules.rulemodule.Action] = None, stime_opt: kasa.modules.rulemodule.TimeOption, smin: int, eact: Optional[kasa.modules.rulemodule.Action] = None, etime_opt: kasa.modules.rulemodule.TimeOption, emin: int, s_light: Optional[Dict] = None)[source]

Representation of a rule.

Config

alias of pydantic.config.BaseConfig

classmethod construct(_fields_set: Optional[SetStr] = None, **values: Any) Model

Creates a new model setting __dict__ and __fields_set__ from trusted or pre-validated data. Default values are respected, but no other validation is performed. Behaves as if Config.extra = ‘allow’ was set since it adds all passed values

copy(*, include: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, exclude: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, update: Optional[DictStrAny] = None, deep: bool = False) Model

Duplicate a model, optionally choose which fields to include, exclude and change.

Parameters
  • include – fields to include in new model

  • exclude – fields to exclude from new model, as with values this takes precedence over include

  • update – values to change/add in the new model. Note: the data is not validated before creating the new model: you should trust this data

  • deep – set to True to make a deep copy of the model

Returns

new model instance

dict(*, include: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, exclude: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, by_alias: bool = False, skip_defaults: Optional[bool] = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False) DictStrAny

Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.

eact: Optional[kasa.modules.rulemodule.Action]
emin: int
enable: bool
etime_opt: kasa.modules.rulemodule.TimeOption
classmethod from_orm(obj: Any) Model
id: str
json(*, include: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, exclude: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, by_alias: bool = False, skip_defaults: Optional[bool] = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, encoder: Optional[Callable[[Any], Any]] = None, models_as_dict: bool = True, **dumps_kwargs: Any) unicode

Generate a JSON representation of the model, include and exclude arguments as per dict().

encoder is an optional function to supply as default to json.dumps(), other arguments as per json.dumps().

name: str
classmethod parse_file(path: Union[str, pathlib.Path], *, content_type: unicode = None, encoding: unicode = 'utf8', proto: pydantic.parse.Protocol = None, allow_pickle: bool = False) Model
classmethod parse_obj(obj: Any) Model
classmethod parse_raw(b: Union[str, bytes], *, content_type: unicode = None, encoding: unicode = 'utf8', proto: pydantic.parse.Protocol = None, allow_pickle: bool = False) Model
repeat: bool
s_light: Optional[Dict]
sact: Optional[kasa.modules.rulemodule.Action]
classmethod schema(by_alias: bool = True, ref_template: unicode = '#/definitions/{model}') DictStrAny
classmethod schema_json(*, by_alias: bool = True, ref_template: unicode = '#/definitions/{model}', **dumps_kwargs: Any) unicode
smin: int
stime_opt: kasa.modules.rulemodule.TimeOption
classmethod update_forward_refs(**localns: Any) None

Try to update ForwardRefs on fields based on this Model, globalns and localns.

classmethod validate(value: Any) Model
wday: List[int]
class kasa.modules.RuleModule(device: SmartDevice, module: str)[source]

Base class for rule-based modules, such as countdown and antitheft.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

async delete_all_rules()[source]

Delete all rules.

async delete_rule(rule: kasa.modules.rulemodule.Rule)[source]

Delete the given rule.

property is_supported: bool

Return whether the module is supported by the device.

query()[source]

Prepare the query for rules.

query_for_command(query, params=None)

Create a request object for the given parameters.

property rules: List[kasa.modules.rulemodule.Rule]

Return the list of rules for the service.

async set_enabled(state: bool)[source]

Enable or disable the service.

class kasa.modules.Schedule(device: SmartDevice, module: str)[source]

Implements the scheduling interface.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

async delete_all_rules()

Delete all rules.

async delete_rule(rule: kasa.modules.rulemodule.Rule)

Delete the given rule.

property is_supported: bool

Return whether the module is supported by the device.

query()

Prepare the query for rules.

query_for_command(query, params=None)

Create a request object for the given parameters.

property rules: List[kasa.modules.rulemodule.Rule]

Return the list of rules for the service.

async set_enabled(state: bool)

Enable or disable the service.

class kasa.modules.Time(device: SmartDevice, module: str)[source]

Implements the timezone settings.

call(method, params=None)

Call the given method with the given parameters.

property data

Return the module specific raw data from the last update.

async get_time()[source]

Return current device time.

async get_timezone()[source]

Request timezone information from the device.

property is_supported: bool

Return whether the module is supported by the device.

query()[source]

Request time and timezone.

query_for_command(query, params=None)

Create a request object for the given parameters.

property time: datetime.datetime

Return current device time.

property timezone

Return current timezone.

class kasa.modules.Usage(device: SmartDevice, module: str)[source]

Baseclass for emeter/usage interfaces.

call(method, params=None)

Call the given method with the given parameters.

property daily_data

Return statistics on daily basis.

property data

Return the module specific raw data from the last update.

async erase_stats()[source]

Erase all stats.

async get_daystat(*, year=None, month=None)[source]

Return daily stats for the given year & month.

async get_monthstat(*, year=None)[source]

Return monthly stats for the given year.

property is_supported: bool

Return whether the module is supported by the device.

property monthly_data

Return statistics on monthly basis.

query()[source]

Return the base query.

query_for_command(query, params=None)

Create a request object for the given parameters.

property usage_this_month

Return usage in this month in minutes.

property usage_today

Return today’s usage in minutes.