API Reference¶
dependencies module¶
Action Engine¶
ActionEngine for HomeControl
Configuration Manager¶
config_manager module
-
class
homecontrol.dependencies.config_manager.
ConfigManager
(cfg: dict, cfg_path: str)[source]¶ Bases:
object
Manages the configuration with configuration domains
-
coroutine
approve_domain_config
(domain: str, config: dict, initial: bool = True) → dict[source]¶ Returns an approved and validated version of config for a domain
-
coroutine
register_domain
(domain: str, handler: object = None, schema: voluptuous.schema_builder.Schema = None, allow_reload: bool = False, default: dict = None) → object[source]¶ Registers a configuration domain
Objects can register themselves to their own configuration domain and subscribe to changes in the configuration
Parameters: - domain (str) – The configuration domain (A top-level key in config.yaml)
- handler (object) – The object subscribing to this domain. Methods it can implement are: - approve_configuration(domain, config) -> bool: - apply_new_configuration(domain, config) -> None: If not specified then your configuration domain will not be reloadable
- allow_reload (bool):
- Allow reloading this configuration domain
- schema (voluptuous.Schema):
- Schema to validate the configuration and to fill in defaults
- default (dict):
- A default configuration
Returns: A validated and approved version of the configuration
-
coroutine
Data Types¶
data types for HomeControl that can be translated to JSON for API usage
-
class
homecontrol.dependencies.data_types.
Color
(h: int, s: int, l: int)[source]¶ Bases:
object
Representation for a color
-
dump
() -> (<class 'int'>, <class 'int'>, <class 'int'>)[source]¶ Dumps the Color into a JSON serialisable format
-
staticmethod
from_data
(hsl: tuple)[source]¶ Constructor from the data received through the API or configuration
-
h
¶ Hue
-
l
¶ Lightness
-
rgb
¶ RGB
-
s
¶ Saturation
-
Entity Types¶
Module containing the entity types Every new Item or Module will get one of these classes as a base class
-
class
homecontrol.dependencies.entity_types.
Item
[source]¶ Bases:
object
A dummy Item
-
config_schema
= <Schema(<class 'object'>, extra=PREVENT_EXTRA, required=False) object>¶
-
coroutine
constructor
(identifier: str, name: str, cfg: dict, state_defaults: dict, core: homecontrol.core.Core) → Item[source]¶ Constructs an item
-
status
= 'offline'¶
-
-
class
homecontrol.dependencies.entity_types.
Module
[source]¶ Bases:
object
A dummy Module
-
folder_location
= None¶
-
-
homecontrol.dependencies.entity_types.
ModuleDef
¶
Event Engine¶
EventEngine for HomeControl
-
class
homecontrol.dependencies.event_engine.
Event
(event_type: str, data: dict = None, timestamp: int = None, kwargs: dict = None)[source]¶ Bases:
object
Representation for an Event
-
class
homecontrol.dependencies.event_engine.
EventEngine
(core)[source]¶ Bases:
object
Dispatcher for events
-
broadcast
(event_type: str, data: dict = None, **kwargs) → List[_asyncio.Future][source]¶ Broadcast an event and return the futures
Every listener is a coroutine that will simply receive event and kwargs
Example: >>> async def on_event(event: Event, …): >>> return
-
broadcast_threaded
(event_type: str, data: dict = None, **kwargs) → List[_asyncio.Task][source]¶ Same as broadcast BUT - It returns Futures and not Tasks - It uses threads
-
staticmethod
create_event
(event_type: str, data: dict = None, **kwargs) → homecontrol.dependencies.event_engine.Event[source]¶ Creates an Event to be broadcasted
-
coroutine
gather
(event_type: str, data: dict = None, timeout: Union[float, int, None] = None, **kwargs) → List[Any][source]¶ Broadcast an event and return the results
-
Item Manager¶
ItemManager for HomeControl
-
class
homecontrol.dependencies.item_manager.
ItemManager
(core)[source]¶ Bases:
object
ItemManager manages all your stateful items
-
coroutine
add_from_module
(mod_obj: homecontrol.dependencies.entity_types.Module) → None[source]¶ Adds the item specifications of a module to the dict of available ones
mod_obj: homecontrol.entity_types.Module
-
coroutine
create_from_storage_entry
(storage_entry: dict) → homecontrol.dependencies.entity_types.Item[source]¶ Creates an Item from a storage entry
-
coroutine
create_item
(identifier: str, item_type: str, cfg: dict = None, state_defaults: dict = None, name: str = None) → homecontrol.dependencies.entity_types.Item[source]¶ Creates a HomeControl item
-
coroutine
init_item
(item: homecontrol.dependencies.entity_types.Item) → None[source]¶ Initialises an item
-
for ... in
iter_items_by_id
(iterable) → [<class 'homecontrol.dependencies.entity_types.Item'>][source]¶ Translates item identifiers into item instances
-
coroutine
remove_item
(identifier: str) → None[source]¶ Removes a HomeControl item
- identifier: str
- The item’s identifier
-
coroutine
JSON Response¶
JSONResponse module
JSON¶
JSON Encoder and Decoder
-
class
homecontrol.dependencies.json.
JSONEncoder
(core: Core, *args, **kwargs)[source]¶ Bases:
json.encoder.JSONEncoder
Custom JSONEncoder that also parses HomeControl types
Module Manager¶
ModuleManager module
-
class
homecontrol.dependencies.module_manager.
ModuleFolder
(name: str)[source]¶ Bases:
object
module folder representation to create a dummy package in sys.modules
-
class
homecontrol.dependencies.module_manager.
ModuleManager
(core)[source]¶ Bases:
object
Manages your modules
-
coroutine
load_file_module
(mod_path: str, name: str) -> (<class 'homecontrol.dependencies.entity_types.Module'>, <class 'Exception'>)[source]¶ Loads a module from a file and initialises it
Returns a Module object
-
coroutine
load_folder_module
(path: str, name: str) -> (<class 'homecontrol.dependencies.entity_types.Module'>, <class 'Exception'>)[source]¶ Loads a module from a folder and initialises it
It also takes care of pip requirements
Returns a Module object
-
coroutine
State Engine¶
StateEngine module
-
class
homecontrol.dependencies.state_engine.
State
(state_engine: homecontrol.dependencies.state_engine.StateEngine, default, getter: Callable = None, setter: Callable = None, name: str = None, state_type: type = None, schema: dict = None, poll_interval: float = None)[source]¶ Bases:
object
Holds one state of an item
-
class
homecontrol.dependencies.state_engine.
StateDef
(poll_interval: Optional[float] = None, default: Any = None, default_factory: Callable = None)[source]¶ Bases:
object
-
class
homecontrol.dependencies.state_engine.
StateEngine
(item: homecontrol.dependencies.entity_types.Item, core: homecontrol.core.Core, state_defaults: dict = None)[source]¶ Bases:
object
Holds the states of an item
-
check_value
(state: str, value) → voluptuous.error.Error[source]¶ Checks if a value is valid for a state
-
Throttle Function¶
throttle_function
Tick Engine¶
TickEngine
Validators¶
YAML Loader¶
Provides a YAML loader
-
class
homecontrol.dependencies.yaml_loader.
Constructor
[source]¶ Bases:
yaml.constructor.SafeConstructor
Constructor for yaml
-
env_var_constructor
(node: yaml.nodes.Node) → str[source]¶ Embeds an environment variable !env_var <name> [default]
-
format_string_constructor
(node: yaml.nodes.Node = None) → str[source]¶ Renders a format string .. rubric:: Example
!format { template: “Hello {who}”, who: You }
-
include_dir_file_mapped_constructor
(node: yaml.nodes.Node = None) → dict[source]¶ !include_dir_file_mapped <folder>
Loads multiple files from a folder and maps their contents to their filenames
-
include_file_constructor
(node: yaml.nodes.Node = None) → object[source]¶ !include <path> ~/ for paths relative to your home directory / for absolute paths anything else for paths relative to your config folder
-
include_merge_constructor
(node: yaml.nodes.Node = None) -> (<class 'list'>, <class 'dict'>)[source]¶ !include <file|folder> …
Merges file or folder contents
This constructor only works if all the files’ contents are of same type and if this type is either list or dict.
-
listdir_constructor
(node: yaml.nodes.Node) → list[source]¶ !listdir <path>
Returns the contents of a directory
-
path_constructor
(node: yaml.nodes.Node) → str[source]¶ !path <path> ~/ for paths relative to your home directory / for absolute paths anything else for paths relative to your config folder
-
-
class
homecontrol.dependencies.yaml_loader.
YAMLLoader
(stream, cfg_folder: str = None)[source]¶ Bases:
yaml.reader.Reader
,yaml.scanner.Scanner
,yaml.parser.Parser
,yaml.composer.Composer
,homecontrol.dependencies.yaml_loader.Constructor
,yaml.resolver.Resolver
Loads YAML with custom constructors
homecontrol module¶
The core instance for HomeControl
-
class
homecontrol.core.
Core
(cfg: dict, cfg_file: str, loop: Optional[asyncio.events.AbstractEventLoop] = None, start_args: Optional[Dict[KT, VT]] = None)[source]¶ Bases:
object
Represents the root object for HomeControl
Constants used by HomeControl
-
class
homecontrol.const.
ItemStatus
[source]¶ Bases:
enum.Enum
Every status an item can have
-
OFFLINE
= 'offline'¶
-
ONLINE
= 'online'¶
-
STOPPED
= 'stopped'¶
-
WAITING_FOR_DEPENDENCY
= 'waiting-for-dependency'¶
-
Exceptions
-
exception
homecontrol.exceptions.
ConfigDomainAlreadyRegistered
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
The configuration domain is already registered
-
exception
homecontrol.exceptions.
ConfigurationNotApproved
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
Configuration has not been approved
-
exception
homecontrol.exceptions.
HomeControlException
[source]¶ Bases:
BaseException
The base exception for HomeControl
-
exception
homecontrol.exceptions.
ItemNotFoundException
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
Item not found
-
exception
homecontrol.exceptions.
ItemNotOnlineError
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
Item is not online
-
exception
homecontrol.exceptions.
ItemTypeNotExistsError
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
Item type does not exist
-
exception
homecontrol.exceptions.
ModuleNotFoundException
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
Module not found
-
exception
homecontrol.exceptions.
PipInstallError
[source]¶ Bases:
homecontrol.exceptions.HomeControlException
A pip install failed
API Module¶
The HTTP API for HomeControl Currenty it supports following routes:
-
GET
/api/ping
¶ Ping the API
Example request:
GET /api/ping HTTP/ HTTP/1.1 Host: homecontrol.local:8080 Accept: application/json
Example response:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "data": "PONG", "status_code": 200, "success": true }
Response Headers: - Content-Type – application/json
Status Codes: - 200 OK – HomeControl is online
Custom Scripts¶
This module offers a very simple way to execute custom code in HomeControl Please note that this method is quite dangerous as these scripts could do anything and if you’re running HomeControl as root they will even have root privileges
PiGPIO Adapter¶
Provides an interface with a Raspberry Pi’s GPIO ports using pigpio.
Installation¶
You can find an installation guide on the official website.
On Raspbian you only need to run
sudo apt update
sudo apt install pigpio
The simplest way to automatically run pigpio on boot would be:
sudo bash -c "echo /usr/bin/pigpiod >> /etc/rc.local"