mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-26 02:26:30 +00:00
commit
10d9135d86
4
API.md
4
API.md
@ -350,6 +350,10 @@ Load host configs from a USB stick.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- POST `/hardware/trigger`
|
||||||
|
|
||||||
|
Trigger an udev reload
|
||||||
|
|
||||||
### Home Assistant
|
### Home Assistant
|
||||||
|
|
||||||
- GET `/homeassistant/info`
|
- GET `/homeassistant/info`
|
||||||
|
@ -471,6 +471,7 @@ class Addon(AddonModel):
|
|||||||
if self.with_audio:
|
if self.with_audio:
|
||||||
self.write_asound()
|
self.write_asound()
|
||||||
|
|
||||||
|
# Start Add-on
|
||||||
try:
|
try:
|
||||||
await self.instance.run()
|
await self.instance.run()
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
"""Init file for Hass.io add-ons."""
|
"""Init file for Hass.io add-ons."""
|
||||||
from distutils.version import StrictVersion
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Awaitable, Dict, List, Optional
|
from typing import Any, Awaitable, Dict, List, Optional
|
||||||
|
|
||||||
|
from packaging import version as pkg_version
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from ..const import (
|
from ..const import (
|
||||||
@ -482,7 +482,9 @@ class AddonModel(CoreSysAttributes):
|
|||||||
|
|
||||||
# Home Assistant
|
# Home Assistant
|
||||||
version = config.get(ATTR_HOMEASSISTANT) or self.sys_homeassistant.version
|
version = config.get(ATTR_HOMEASSISTANT) or self.sys_homeassistant.version
|
||||||
if StrictVersion(self.sys_homeassistant.version) < StrictVersion(version):
|
if pkg_version.parse(self.sys_homeassistant.version) < pkg_version.parse(
|
||||||
|
version
|
||||||
|
):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -101,6 +101,7 @@ class RestAPI(CoreSysAttributes):
|
|||||||
[
|
[
|
||||||
web.get("/hardware/info", api_hardware.info),
|
web.get("/hardware/info", api_hardware.info),
|
||||||
web.get("/hardware/audio", api_hardware.audio),
|
web.get("/hardware/audio", api_hardware.audio),
|
||||||
|
web.post("/hardware/trigger", api_hardware.trigger),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
"""Init file for Hass.io hardware RESTful API."""
|
"""Init file for Hass.io hardware RESTful API."""
|
||||||
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
from aiohttp import web
|
||||||
|
|
||||||
from .utils import api_process
|
from .utils import api_process
|
||||||
from ..const import (
|
from ..const import (
|
||||||
@ -19,7 +23,7 @@ class APIHardware(CoreSysAttributes):
|
|||||||
"""Handle RESTful API for hardware functions."""
|
"""Handle RESTful API for hardware functions."""
|
||||||
|
|
||||||
@api_process
|
@api_process
|
||||||
async def info(self, request):
|
async def info(self, request: web.Request) -> Dict[str, Any]:
|
||||||
"""Show hardware info."""
|
"""Show hardware info."""
|
||||||
return {
|
return {
|
||||||
ATTR_SERIAL: list(
|
ATTR_SERIAL: list(
|
||||||
@ -32,7 +36,7 @@ class APIHardware(CoreSysAttributes):
|
|||||||
}
|
}
|
||||||
|
|
||||||
@api_process
|
@api_process
|
||||||
async def audio(self, request):
|
async def audio(self, request: web.Request) -> Dict[str, Any]:
|
||||||
"""Show ALSA audio devices."""
|
"""Show ALSA audio devices."""
|
||||||
return {
|
return {
|
||||||
ATTR_AUDIO: {
|
ATTR_AUDIO: {
|
||||||
@ -40,3 +44,8 @@ class APIHardware(CoreSysAttributes):
|
|||||||
ATTR_OUTPUT: self.sys_host.alsa.output_devices,
|
ATTR_OUTPUT: self.sys_host.alsa.output_devices,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@api_process
|
||||||
|
def trigger(self, request: web.Request) -> None:
|
||||||
|
"""Trigger a udev device reload."""
|
||||||
|
return asyncio.shield(self.sys_hardware.udev_trigger())
|
||||||
|
@ -41,6 +41,7 @@ ADDONS_API_BYPASS = re.compile(
|
|||||||
r"^(?:"
|
r"^(?:"
|
||||||
r"|/addons/self/(?!security|update)[^/]+"
|
r"|/addons/self/(?!security|update)[^/]+"
|
||||||
r"|/info"
|
r"|/info"
|
||||||
|
r"|/hardware/trigger"
|
||||||
r"|/services.*"
|
r"|/services.*"
|
||||||
r"|/discovery.*"
|
r"|/discovery.*"
|
||||||
r"|/auth"
|
r"|/auth"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from ipaddress import ip_network
|
from ipaddress import ip_network
|
||||||
|
|
||||||
HASSIO_VERSION = "184"
|
HASSIO_VERSION = "185"
|
||||||
|
|
||||||
|
|
||||||
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"
|
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"
|
||||||
|
@ -188,3 +188,10 @@ class JsonFileError(HassioError):
|
|||||||
|
|
||||||
class DockerAPIError(HassioError):
|
class DockerAPIError(HassioError):
|
||||||
"""Docker API error."""
|
"""Docker API error."""
|
||||||
|
|
||||||
|
|
||||||
|
# Hardware
|
||||||
|
|
||||||
|
|
||||||
|
class HardwareNotSupportedError(HassioNotSupportedError):
|
||||||
|
"""Raise if hardware function is not supported."""
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from contextlib import asynccontextmanager, suppress
|
from contextlib import asynccontextmanager, suppress
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from distutils.version import StrictVersion
|
|
||||||
from ipaddress import IPv4Address
|
from ipaddress import IPv4Address
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
@ -16,6 +15,7 @@ from uuid import UUID
|
|||||||
import aiohttp
|
import aiohttp
|
||||||
from aiohttp import hdrs
|
from aiohttp import hdrs
|
||||||
import attr
|
import attr
|
||||||
|
from packaging import version as pkg_version
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_ACCESS_TOKEN,
|
ATTR_ACCESS_TOKEN,
|
||||||
@ -80,7 +80,9 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
|||||||
try:
|
try:
|
||||||
# Evaluate Version if we lost this information
|
# Evaluate Version if we lost this information
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = await self.instance.get_latest_version(key=StrictVersion)
|
self.version = await self.instance.get_latest_version(
|
||||||
|
key=pkg_version.parse
|
||||||
|
)
|
||||||
|
|
||||||
await self.instance.attach(tag=self.version)
|
await self.instance.attach(tag=self.version)
|
||||||
except DockerAPIError:
|
except DockerAPIError:
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
"""Read hardware info from system."""
|
"""Read hardware info from system."""
|
||||||
|
import asyncio
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -8,6 +9,7 @@ from typing import Any, Dict, Optional, Set
|
|||||||
import pyudev
|
import pyudev
|
||||||
|
|
||||||
from ..const import ATTR_DEVICES, ATTR_NAME, ATTR_TYPE, CHAN_ID, CHAN_TYPE
|
from ..const import ATTR_DEVICES, ATTR_NAME, ATTR_TYPE, CHAN_ID, CHAN_TYPE
|
||||||
|
from ..exceptions import HardwareNotSupportedError
|
||||||
|
|
||||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -148,3 +150,14 @@ class Hardware:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
return datetime.utcfromtimestamp(int(found.group(1)))
|
return datetime.utcfromtimestamp(int(found.group(1)))
|
||||||
|
|
||||||
|
async def udev_trigger(self) -> None:
|
||||||
|
"""Trigger a udev reload."""
|
||||||
|
proc = await asyncio.create_subprocess_exec("udevadm", "trigger")
|
||||||
|
|
||||||
|
await proc.wait()
|
||||||
|
if proc.returncode == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
_LOGGER.waring("udevadm device triggering fails!")
|
||||||
|
raise HardwareNotSupportedError()
|
||||||
|
@ -7,6 +7,7 @@ cpe==1.2.1
|
|||||||
cryptography==2.7
|
cryptography==2.7
|
||||||
docker==4.0.2
|
docker==4.0.2
|
||||||
gitpython==3.0.2
|
gitpython==3.0.2
|
||||||
|
packaging==19.1
|
||||||
pytz==2019.2
|
pytz==2019.2
|
||||||
pyudev==0.21.0
|
pyudev==0.21.0
|
||||||
uvloop==0.12.2
|
uvloop==0.12.2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user