diff --git a/API.md b/API.md index e7c315ef0..f787b852e 100644 --- a/API.md +++ b/API.md @@ -342,6 +342,7 @@ Get all available addons. "url": "null|url", "logo": "bool", "audio": "bool", + "audio": "bool", "hassio_api": "bool" } ], @@ -381,6 +382,7 @@ Get all available addons. "logo": "bool", "hassio_api": "bool", "webui": "null|http(s)://[HOST]:port/xy/zx", + "gpio": "bool", "audio": "bool", "audio_input": "null|0,0", "audio_output": "null|0,0" diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index ece50d989..b966296bf 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -21,7 +21,8 @@ from ..const import ( ATTR_HOST_NETWORK, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_STARTUP, STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM, ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_WEBUI, - ATTR_HASSIO_API, ATTR_AUDIO, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT) + ATTR_HASSIO_API, ATTR_AUDIO, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT, + ATTR_GPIO) from .util import check_installed from ..dock.addon import DockerAddon from ..tools import write_json_file, read_json_file @@ -250,6 +251,11 @@ class Addon(object): """Return True if the add-on access to hassio api.""" return self._mesh[ATTR_HASSIO_API] + @property + def with_gpio(self): + """Return True if the add-on access to gpio interface.""" + return self._mesh[ATTR_GPIO] + @property def with_audio(self): """Return True if the add-on access to audio.""" diff --git a/hassio/addons/git.py b/hassio/addons/git.py index 233b5e965..f70f2ebec 100644 --- a/hassio/addons/git.py +++ b/hassio/addons/git.py @@ -73,7 +73,7 @@ class GitRepo(object): None, self.repo.remotes.origin.pull) except (git.InvalidGitRepositoryError, git.NoSuchPathError, - git.exc.GitCommandError) as err: + git.GitCommandError) as err: _LOGGER.error("Can't pull %s repo: %s.", self.url, err) return False diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 56cf47b53..aa4ff0879 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -14,7 +14,7 @@ from ..const import ( ATTR_LOCATON, ATTR_REPOSITORY, ATTR_TIMEOUT, ATTR_NETWORK, ATTR_AUTO_UPDATE, ATTR_WEBUI, ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API, ATTR_BUILD_FROM, ATTR_SQUASH, - ATTR_ARGS) + ATTR_ARGS, ATTR_GPIO) from ..validate import NETWORK_PORT, DOCKER_PORTS, ALSA_CHANNEL @@ -95,6 +95,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Optional(ATTR_ENVIRONMENT): {vol.Match(r"\w*"): vol.Coerce(str)}, vol.Optional(ATTR_PRIVILEGED): [vol.In(PRIVILEGED_ALL)], vol.Optional(ATTR_AUDIO, default=False): vol.Boolean(), + vol.Optional(ATTR_GPIO, default=False): vol.Boolean(), vol.Optional(ATTR_HASSIO_API, default=False): vol.Boolean(), vol.Required(ATTR_OPTIONS): dict, vol.Required(ATTR_SCHEMA): vol.Any(vol.Schema({ diff --git a/hassio/api/addons.py b/hassio/api/addons.py index e6acec354..62b5d35d7 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -13,7 +13,7 @@ from ..const import ( ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER, ATTR_INSTALLED, ATTR_LOGO, ATTR_WEBUI, ATTR_DEVICES, ATTR_PRIVILEGED, ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API, - BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) + ATTR_GPIO, BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) from ..validate import DOCKER_PORTS _LOGGER = logging.getLogger(__name__) @@ -79,6 +79,7 @@ class APIAddons(object): ATTR_LOGO: addon.with_logo, ATTR_HASSIO_API: addon.use_hassio_api, ATTR_AUDIO: addon.with_audio, + ATTR_GPIO: addon.with_gpio, }) data_repositories = [] @@ -127,6 +128,7 @@ class APIAddons(object): ATTR_LOGO: addon.with_logo, ATTR_WEBUI: addon.webui, ATTR_HASSIO_API: addon.use_hassio_api, + ATTR_GPIO: addon.with_gpio, ATTR_AUDIO: addon.with_audio, ATTR_AUDIO_INPUT: addon.audio_input, ATTR_AUDIO_OUTPUT: addon.audio_output, diff --git a/hassio/const.py b/hassio/const.py index 7c48a4b8a..30abe5574 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -120,6 +120,7 @@ ATTR_SERIAL = 'serial' ATTR_SECURITY = 'security' ATTR_BUILD_FROM = 'build_from' ATTR_SQUASH = 'squash' +ATTR_GPIO = 'gpio' ATTR_ADDONS_CUSTOM_LIST = 'addons_custom_list' STARTUP_INITIALIZE = 'initialize' diff --git a/hassio/dock/addon.py b/hassio/dock/addon.py index 938f3a673..9ebef1f89 100644 --- a/hassio/dock/addon.py +++ b/hassio/dock/addon.py @@ -107,6 +107,7 @@ class DockerAddon(DockerInterface): addon_mapping = self.addon.map_volumes + # setup config mappings if MAP_CONFIG in addon_mapping: volumes.update({ str(self.config.path_extern_config): { @@ -137,6 +138,13 @@ class DockerAddon(DockerInterface): 'bind': '/share', 'mode': addon_mapping[MAP_SHARE] }}) + # init other hardware mappings + if self.addon.with_gpio: + volumes.update({ + '/sys/class/gpio': { + 'bind': '/sys/class/gpio', 'mode': "rw" + }}) + return volumes def _run(self):