Skip to content

Commit 261bda8

Browse files
committed
Fix version merge conflict
2 parents f751b0e + c39d635 commit 261bda8

22 files changed

+487
-238
lines changed

API.md

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -203,16 +203,27 @@ Return QR-Code
203203
- POST `/host/reboot`
204204
- GET `/host/info`
205205

206-
See HostControl info command.
207-
208206
```json
209207
{
210208
"type": "",
211209
"version": "",
212210
"last_version": "",
213-
"features": ["shutdown", "reboot", "update", "network_info", "network_control"],
211+
"features": ["shutdown", "reboot", "update", "hostname", "network_info", "network_control"],
214212
"hostname": "",
215-
"os": ""
213+
"os": "",
214+
"audio": {
215+
"input": "0,0",
216+
"output": "0,0"
217+
}
218+
}
219+
```
220+
221+
- POST `/host/options`
222+
223+
```json
224+
{
225+
"audio_input": "0,0",
226+
"audio_output": "0,0"
216227
}
217228
```
218229

@@ -259,11 +270,6 @@ Optional:
259270
```json
260271
{
261272
"hostname": "",
262-
"mode": "dhcp|fixed",
263-
"ssid": "",
264-
"ip": "",
265-
"netmask": "",
266-
"gateway": ""
267273
}
268274
```
269275

@@ -330,7 +336,9 @@ Get all available addons.
330336
"privileged": ["NET_ADMIN", "SYS_ADMIN"],
331337
"devices": ["/dev/xy"],
332338
"url": "null|url",
333-
"logo": "bool"
339+
"logo": "bool",
340+
"audio": "bool",
341+
"hassio_api": "bool"
334342
}
335343
],
336344
"repositories": [
@@ -367,7 +375,11 @@ Get all available addons.
367375
"privileged": ["NET_ADMIN", "SYS_ADMIN"],
368376
"devices": ["/dev/xy"],
369377
"logo": "bool",
370-
"webui": "null|http(s)://[HOST]:port/xy/zx"
378+
"hassio_api": "bool",
379+
"webui": "null|http(s)://[HOST]:port/xy/zx",
380+
"audio": "bool",
381+
"audio_input": "null|0,0",
382+
"audio_output": "null|0,0"
371383
}
372384
```
373385

@@ -383,10 +395,12 @@ Get all available addons.
383395
"CONTAINER": "port|[ip, port]"
384396
},
385397
"options": {},
398+
"audio_output": "null|0,0",
399+
"audio_input": "null|0,0"
386400
}
387401
```
388402

389-
For reset custom network settings, set it `null`.
403+
For reset custom network/audio settings, set it `null`.
390404

391405
- POST `/addons/{addon}/start`
392406

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# Hass.io
2+
23
### First private cloud solution for home automation.
34

45
Hass.io is a Docker based system for managing your Home Assistant installation and related applications. The system is controlled via Home Assistant which communicates with the supervisor. The supervisor provides an API to manage the installation. This includes changing network settings or installing and updating software.
56

67
![](misc/hassio.png?raw=true)
78

8-
[HassIO-Addons](https://github.com/home-assistant/hassio-addons) | [HassIO-Build](https://github.com/home-assistant/hassio-build)
9+
- [Hass.io Addons](https://github.com/home-assistant/hassio-addons)
10+
- [Hass.io Build](https://github.com/home-assistant/hassio-build)
911

1012
## Installation
1113

hassio/addons/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async def _add_repository(url):
7878

7979
# don't add built-in repository to config
8080
if url not in BUILTIN_REPOSITORIES:
81-
self.config.addons_repositories = url
81+
self.config.add_addon_repository(url)
8282

8383
tasks = [_add_repository(url) for url in new_rep - old_rep]
8484
if tasks:

hassio/addons/addon.py

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES, ATTR_ENVIRONMENT,
2020
ATTR_HOST_NETWORK, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_STARTUP,
2121
STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM,
22-
ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_WEBUI)
22+
ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_WEBUI,
23+
ATTR_HASSIO_API, ATTR_AUDIO, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT)
2324
from .util import check_installed
2425
from ..dock.addon import DockerAddon
2526
from ..tools import write_json_file, read_json_file
@@ -244,6 +245,56 @@ def privileged(self):
244245
"""Return list of privilege."""
245246
return self._mesh.get(ATTR_PRIVILEGED)
246247

248+
@property
249+
def use_hassio_api(self):
250+
"""Return True if the add-on access to hassio api."""
251+
return self._mesh[ATTR_HASSIO_API]
252+
253+
@property
254+
def with_audio(self):
255+
"""Return True if the add-on access to audio."""
256+
return self._mesh[ATTR_AUDIO]
257+
258+
@property
259+
def audio_output(self):
260+
"""Return ALSA config for output or None."""
261+
if not self.with_audio:
262+
return
263+
264+
setting = self.config.audio_output
265+
if self.is_installed and ATTR_AUDIO_OUTPUT in self.data.user[self._id]:
266+
setting = self.data.user[self._id][ATTR_AUDIO_OUTPUT]
267+
return setting
268+
269+
@audio_output.setter
270+
def audio_output(self, value):
271+
"""Set/remove custom audio output settings."""
272+
if value is None:
273+
self.data.user[self._id].pop(ATTR_AUDIO_OUTPUT, None)
274+
else:
275+
self.data.user[self._id][ATTR_AUDIO_OUTPUT] = value
276+
self.data.save()
277+
278+
@property
279+
def audio_input(self):
280+
"""Return ALSA config for input or None."""
281+
if not self.with_audio:
282+
return
283+
284+
setting = self.config.audio_input
285+
if self.is_installed and ATTR_AUDIO_INPUT in self.data.user[self._id]:
286+
setting = self.data.user[self._id][ATTR_AUDIO_INPUT]
287+
return setting
288+
289+
@audio_input.setter
290+
def audio_input(self, value):
291+
"""Set/remove custom audio input settings."""
292+
if value is None:
293+
self.data.user[self._id].pop(ATTR_AUDIO_INPUT, None)
294+
else:
295+
self.data.user[self._id][ATTR_AUDIO_INPUT] = value
296+
self.data.save()
297+
247298
@property
248299
def url(self):
249300
"""Return url of addon."""
@@ -413,14 +464,20 @@ async def state(self):
413464
return STATE_STOPPED
414465

415466
@check_installed
416-
async def start(self):
417-
"""Set options and start addon."""
418-
return await self.addon_docker.run()
467+
def start(self):
468+
"""Set options and start addon.
469+
470+
Return a coroutine.
471+
"""
472+
return self.addon_docker.run()
419473

420474
@check_installed
421-
async def stop(self):
422-
"""Stop addon."""
423-
return await self.addon_docker.stop()
475+
def stop(self):
476+
"""Stop addon.
477+
478+
Return a coroutine.
479+
"""
480+
return self.addon_docker.stop()
424481

425482
@check_installed
426483
async def update(self, version=None):
@@ -430,7 +487,7 @@ async def update(self, version=None):
430487
if version == self.version_installed:
431488
_LOGGER.warning(
432489
"Addon %s is already installed in %s", self._id, version)
433-
return True
490+
return False
434491

435492
if not await self.addon_docker.update(version):
436493
return False
@@ -439,14 +496,20 @@ async def update(self, version=None):
439496
return True
440497

441498
@check_installed
442-
async def restart(self):
443-
"""Restart addon."""
444-
return await self.addon_docker.restart()
499+
def restart(self):
500+
"""Restart addon.
501+
502+
Return a coroutine.
503+
"""
504+
return self.addon_docker.restart()
445505

446506
@check_installed
447-
async def logs(self):
448-
"""Return addons log output."""
449-
return await self.addon_docker.logs()
507+
def logs(self):
508+
"""Return addons log output.
509+
510+
Return a coroutine.
511+
"""
512+
return self.addon_docker.logs()
450513

451514
@check_installed
452515
async def snapshot(self, tar_file):

hassio/addons/validate.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
ARCH_AARCH64, ARCH_AMD64, ARCH_I386, ATTR_TMPFS, ATTR_PRIVILEGED,
1111
ATTR_USER, ATTR_STATE, ATTR_SYSTEM, STATE_STARTED, STATE_STOPPED,
1212
ATTR_LOCATON, ATTR_REPOSITORY, ATTR_TIMEOUT, ATTR_NETWORK,
13-
ATTR_AUTO_UPDATE, ATTR_WEBUI)
14-
from ..validate import NETWORK_PORT, DOCKER_PORTS
13+
ATTR_AUTO_UPDATE, ATTR_WEBUI, ATTR_AUDIO, ATTR_AUDIO_INPUT,
14+
ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API)
15+
from ..validate import NETWORK_PORT, DOCKER_PORTS, ALSA_CHANNEL
1516

1617

1718
MAP_VOLUME = r"^(config|ssl|addons|backup|share)(?::(rw|:ro))?$"
@@ -38,14 +39,12 @@
3839
PRIVILEGED_ALL = [
3940
"NET_ADMIN",
4041
"SYS_ADMIN",
42+
"SYS_RAWIO"
4143
]
4244

4345

44-
def _migrate_startup(value):
45-
"""Migrate startup schema.
46-
47-
REMOVE after 0.50-
48-
"""
46+
def _simple_startup(value):
47+
"""Simple startup schema."""
4948
if value == "before":
5049
return STARTUP_SERVICES
5150
if value == "after":
@@ -62,7 +61,7 @@ def _migrate_startup(value):
6261
vol.Optional(ATTR_URL): vol.Url(),
6362
vol.Optional(ATTR_ARCH, default=ARCH_ALL): [vol.In(ARCH_ALL)],
6463
vol.Required(ATTR_STARTUP):
65-
vol.All(_migrate_startup, vol.In(STARTUP_ALL)),
64+
vol.All(_simple_startup, vol.In(STARTUP_ALL)),
6665
vol.Required(ATTR_BOOT):
6766
vol.In([BOOT_AUTO, BOOT_MANUAL]),
6867
vol.Optional(ATTR_PORTS): DOCKER_PORTS,
@@ -75,6 +74,8 @@ def _migrate_startup(value):
7574
vol.Optional(ATTR_MAP, default=[]): [vol.Match(MAP_VOLUME)],
7675
vol.Optional(ATTR_ENVIRONMENT): {vol.Match(r"\w*"): vol.Coerce(str)},
7776
vol.Optional(ATTR_PRIVILEGED): [vol.In(PRIVILEGED_ALL)],
77+
vol.Optional(ATTR_AUDIO, default=False): vol.Boolean(),
78+
vol.Optional(ATTR_HASSIO_API, default=False): vol.Boolean(),
7879
vol.Required(ATTR_OPTIONS): dict,
7980
vol.Required(ATTR_SCHEMA): vol.Any(vol.Schema({
8081
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [
@@ -103,6 +104,8 @@ def _migrate_startup(value):
103104
vol.Optional(ATTR_BOOT):
104105
vol.In([BOOT_AUTO, BOOT_MANUAL]),
105106
vol.Optional(ATTR_NETWORK): DOCKER_PORTS,
107+
vol.Optional(ATTR_AUDIO_OUTPUT): ALSA_CHANNEL,
108+
vol.Optional(ATTR_AUDIO_INPUT): ALSA_CHANNEL,
106109
})
107110

108111

hassio/api/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def register_host(self, host_control, hardware):
3737
self.webapp.router.add_post('/host/reboot', api_host.reboot)
3838
self.webapp.router.add_post('/host/shutdown', api_host.shutdown)
3939
self.webapp.router.add_post('/host/update', api_host.update)
40+
self.webapp.router.add_post('/host/options', api_host.options)
4041

4142
def register_network(self, host_control):
4243
"""Register network function."""
@@ -46,11 +47,11 @@ def register_network(self, host_control):
4647
self.webapp.router.add_post('/network/options', api_net.options)
4748

4849
def register_supervisor(self, supervisor, snapshots, addons, host_control,
49-
websession):
50+
updater):
5051
"""Register supervisor function."""
5152
api_supervisor = APISupervisor(
5253
self.config, self.loop, supervisor, snapshots, addons,
53-
host_control, websession)
54+
host_control, updater)
5455

5556
self.webapp.router.add_get('/supervisor/ping', api_supervisor.ping)
5657
self.webapp.router.add_get('/supervisor/info', api_supervisor.info)

0 commit comments

Comments
 (0)