New custom integration for sysdweb
This commit is contained in:
55
custom_components/sysdweb/__init__.py
Normal file
55
custom_components/sysdweb/__init__.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import logging
|
||||
import voluptuous as vol
|
||||
from collections import defaultdict
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_USERNAME, CONF_PASSWORD
|
||||
from homeassistant.helpers import aiohttp_client
|
||||
import functools
|
||||
from aiohttp import BasicAuth
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DOMAIN = 'sysdweb'
|
||||
DATA_SYSDWEB = "data_sysdweb"
|
||||
CONF_SERVICES = "services"
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema({
|
||||
DOMAIN: cv.ensure_list(vol.Schema({
|
||||
vol.Required(CONF_HOST): cv.string,
|
||||
vol.Optional(CONF_PORT, default=10080): cv.port,
|
||||
vol.Required(CONF_USERNAME): cv.string,
|
||||
vol.Required(CONF_PASSWORD): cv.string,
|
||||
vol.Required(CONF_SERVICES): cv.ensure_list(cv.string)
|
||||
}))
|
||||
}, extra=vol.ALLOW_EXTRA)
|
||||
|
||||
|
||||
async def async_setup(hass, config):
|
||||
info_map = {}
|
||||
for conf_entry in config[DOMAIN]:
|
||||
host = conf_entry[CONF_HOST]
|
||||
port = conf_entry[CONF_PORT]
|
||||
auth = BasicAuth(login=conf_entry[CONF_USERNAME], password=conf_entry[CONF_PASSWORD])
|
||||
for service_name in conf_entry[CONF_SERVICES]:
|
||||
info_map[(host, service_name)] = (f"http://{host}:{port}/api/v1/{service_name}/", auth)
|
||||
hass.data[DATA_SYSDWEB] = info_map
|
||||
|
||||
# services
|
||||
possible_actions = ['start', 'stop', 'restart', 'reload', 'reloadorrestart']
|
||||
|
||||
async def service_call(call, sysdweb_action):
|
||||
assert sysdweb_action in possible_actions
|
||||
hostname = call.data.get("hostname")
|
||||
service_name = call.data.get("service_name")
|
||||
url, auth = hass.data[DATA_SYSDWEB][(hostname, service_name)]
|
||||
session = aiohttp_client.async_get_clientsession(hass)
|
||||
async with session.get(url + sysdweb_action, auth=auth) as resp:
|
||||
resp_json = await resp.json()
|
||||
result = resp_json[sysdweb_action]
|
||||
if result != 'OK' or resp.status != 200:
|
||||
_LOGGER.error(f"Error calling service sysdweb: {action} {resp_json}")
|
||||
|
||||
for action in possible_actions:
|
||||
hass.services.async_register(DOMAIN, action, functools.partial(service_call, sysdweb_action=action))
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user