From 42023ed4a5706fd29a180d7676029069fd023bc5 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Sun, 21 Feb 2021 13:09:43 +0000 Subject: [PATCH] init --- hassio/src/dashboard/hassio-addons.ts | 3 ++ hassio/src/supervisor-base-element.ts | 52 +++++++++++++++++++++++++-- src/data/supervisor/supervisor.ts | 10 +++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/hassio/src/dashboard/hassio-addons.ts b/hassio/src/dashboard/hassio-addons.ts index a28c7c1da8..e9e44c7fad 100644 --- a/hassio/src/dashboard/hassio-addons.ts +++ b/hassio/src/dashboard/hassio-addons.ts @@ -25,6 +25,9 @@ class HassioAddons extends LitElement { @property({ attribute: false }) public supervisor!: Supervisor; protected render(): TemplateResult { + this.supervisor + ?.callApi({ endpoint: "/supervisor/ping", rest: false }) + .then((result) => console.log("result", result)); return html`

Add-ons

diff --git a/hassio/src/supervisor-base-element.ts b/hassio/src/supervisor-base-element.ts index 9abdf473a5..3e0a5839f1 100644 --- a/hassio/src/supervisor-base-element.ts +++ b/hassio/src/supervisor-base-element.ts @@ -7,7 +7,10 @@ import { } from "lit-element"; import { atLeastVersion } from "../../src/common/config/version"; import { fetchHassioAddonsInfo } from "../../src/data/hassio/addon"; -import { HassioResponse } from "../../src/data/hassio/common"; +import { + hassioApiResultExtractor, + HassioResponse, +} from "../../src/data/hassio/common"; import { fetchHassioHassOsInfo, fetchHassioHostInfo, @@ -23,6 +26,9 @@ import { getSupervisorEventCollection, subscribeSupervisorEvents, Supervisor, + supervisorApiRequest, + SupervisorAPIRequestParams, + supervisorApiWsRequest, SupervisorObject, supervisorStore, } from "../../src/data/supervisor/supervisor"; @@ -56,7 +62,11 @@ export class SupervisorBaseElement extends urlSyncMixin( } protected _updateSupervisor(obj: Partial): void { - this.supervisor = { ...this.supervisor!, ...obj }; + this.supervisor = { + ...this.supervisor!, + ...obj, + callApi: (params) => this._callAPI(params), + }; } protected firstUpdated(changedProps: PropertyValues): void { @@ -142,10 +152,48 @@ export class SupervisorBaseElement extends urlSyncMixin( os, network, resolution, + callApi: (params) => this._callAPI(params), }; this.addEventListener("supervisor-update", (ev) => this._updateSupervisor(ev.detail) ); } + + private async _callAPI(params: SupervisorAPIRequestParams): Promise { + const hasHass = this.hass !== undefined; + const canUseWS = + !params.rest && + hasHass && + atLeastVersion(this.hass.config.version, 2021, 2, 4); + + if (canUseWS) { + const connection = hasHass ? this.hass.connection : params.connection; + if (connection === undefined) { + throw Error(`No connection found, aborting API call - ${params}`); + } + const requestParams: supervisorApiRequest = { + ...params, + }; + delete requestParams.rest; + delete requestParams.connection; + return await supervisorApiWsRequest(connection, requestParams); + } else { + const method = + params.method === "post" + ? "POST" + : params.method === "put" + ? "PUT" + : params.method === "delete" + ? "DELETE" + : "GET"; + return hassioApiResultExtractor( + await this.hass.callApi>( + method, + `hassio${params.endpoint}`, + params.data + ) + ); + } + } } diff --git a/src/data/supervisor/supervisor.ts b/src/data/supervisor/supervisor.ts index 1dbaecef2c..5236d153bb 100644 --- a/src/data/supervisor/supervisor.ts +++ b/src/data/supervisor/supervisor.ts @@ -41,7 +41,6 @@ export type SupervisorObject = interface supervisorApiRequest { endpoint: string; method?: "get" | "post" | "delete" | "put"; - force_rest?: boolean; data?: any; } @@ -52,6 +51,14 @@ export interface SupervisorEvent { [key: string]: any; } +export interface SupervisorAPIRequestParams { + connection?: any; + rest?: boolean; + data?: any; + endpoint: string; + method?: "get" | "post" | "delete" | "put"; +} + export interface Supervisor { host: HassioHostInfo; supervisor: HassioSupervisorInfo; @@ -61,6 +68,7 @@ export interface Supervisor { resolution: HassioResolution; os: HassioHassOSInfo; addon: HassioAddonsInfo; + callApi(params: SupervisorAPIRequestParams): Promise; } export const supervisorApiWsRequest = (