98 lines
2.8 KiB
Python
98 lines
2.8 KiB
Python
"""Component to interact with Hassbian tools."""
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.http import HomeAssistantView
|
|
from homeassistant.config import async_check_ha_config_file
|
|
from homeassistant.components import websocket_api
|
|
from homeassistant.const import (
|
|
CONF_UNIT_SYSTEM_METRIC, CONF_UNIT_SYSTEM_IMPERIAL
|
|
)
|
|
from homeassistant.helpers import config_validation as cv
|
|
from homeassistant.util import location
|
|
|
|
|
|
async def async_setup(hass):
|
|
"""Set up the Hassbian config."""
|
|
hass.http.register_view(CheckConfigView)
|
|
websocket_api.async_register_command(hass, websocket_update_config)
|
|
websocket_api.async_register_command(hass, websocket_detect_config)
|
|
return True
|
|
|
|
|
|
class CheckConfigView(HomeAssistantView):
|
|
"""Hassbian packages endpoint."""
|
|
|
|
url = '/api/config/core/check_config'
|
|
name = 'api:config:core:check_config'
|
|
|
|
async def post(self, request):
|
|
"""Validate configuration and return results."""
|
|
errors = await async_check_ha_config_file(request.app['hass'])
|
|
|
|
state = 'invalid' if errors else 'valid'
|
|
|
|
return self.json({
|
|
"result": state,
|
|
"errors": errors,
|
|
})
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.async_response
|
|
@websocket_api.websocket_command({
|
|
'type': 'config/core/update',
|
|
vol.Optional('latitude'): cv.latitude,
|
|
vol.Optional('longitude'): cv.longitude,
|
|
vol.Optional('elevation'): int,
|
|
vol.Optional('unit_system'): cv.unit_system,
|
|
vol.Optional('location_name'): str,
|
|
vol.Optional('time_zone'): cv.time_zone,
|
|
})
|
|
async def websocket_update_config(hass, connection, msg):
|
|
"""Handle update core config command."""
|
|
data = dict(msg)
|
|
data.pop('id')
|
|
data.pop('type')
|
|
|
|
try:
|
|
await hass.config.async_update(**data)
|
|
connection.send_result(msg['id'])
|
|
except ValueError as err:
|
|
connection.send_error(
|
|
msg['id'], 'invalid_info', str(err)
|
|
)
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.async_response
|
|
@websocket_api.websocket_command({
|
|
'type': 'config/core/detect',
|
|
})
|
|
async def websocket_detect_config(hass, connection, msg):
|
|
"""Detect core config."""
|
|
session = hass.helpers.aiohttp_client.async_get_clientsession()
|
|
location_info = await location.async_detect_location_info(session)
|
|
|
|
info = {}
|
|
|
|
if location_info is None:
|
|
connection.send_result(msg['id'], info)
|
|
return
|
|
|
|
if location_info.use_metric:
|
|
info['unit_system'] = CONF_UNIT_SYSTEM_METRIC
|
|
else:
|
|
info['unit_system'] = CONF_UNIT_SYSTEM_IMPERIAL
|
|
|
|
if location_info.latitude:
|
|
info['latitude'] = location_info.latitude
|
|
|
|
if location_info.longitude:
|
|
info['longitude'] = location_info.longitude
|
|
|
|
if location_info.time_zone:
|
|
info['time_zone'] = location_info.time_zone
|
|
|
|
connection.send_result(msg['id'], info)
|