UNPKG

lavva.exalushome.extalife

Version:

Library implementing communication and abstraction layers for ExtaLife API in ExalusHome system

179 lines 10.6 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { Api } from "lavva.exalushome"; import { DataFrame, Method, Status } from "lavva.exalushome/build/js/DataFrame"; import { ExalusConnectionService } from "lavva.exalushome/build/js/Services/ExalusConnectionService"; import { ResponseResult } from "lavva.exalushome/build/js/Services/FieldChangeResult"; import { LoggerService } from "lavva.exalushome/build/js/Services/Logging/LoggerService"; import { UpdatesProvider } from "lavva.exalushome/build/js/Services/Updates/UpdatesProvider"; import { ProviderType, UpdateInfo } from "lavva.exalushome/build/js/Services/Updates/IUpdatesProvider"; import { UpdateErrorCode, UpdateProgressInfo, UpdateStatus } from "lavva.exalushome/build/js/Services/Updates/IUpdatesService"; import { FirmwareVersion } from "../../Devices/DeviceServices/FirmwareService/FirmwareService"; import { ExtaLifeService } from "../../ExtaLife"; export class ExtaLifeControllerRadioUpdatesProvider { constructor(extInfo, runtimeInfo) { this._apiVersion = extInfo.APIVersion; this._extenstionVersion = extInfo.ExtensionVersion; this._protocolExtGuid = extInfo.ExtensionGuid; this._runtimeInfo = runtimeInfo; this._logger = Api.Get(LoggerService.ServiceName); this._connection = Api.Get(ExalusConnectionService.ServiceName); } get AvailableExtensionVersion() { return this._extenstionVersion; } get AvailableApiVersion() { return this._apiVersion; } get ExtensionGuid() { return this._protocolExtGuid; } get ProtocolGuid() { return ExtaLifeService.ExtaLifeProtocolGuid; } get ProviderType() { return ProviderType.Controller; } GetUpdateProviderName() { return `${ExtaLifeControllerRadioUpdatesProvider.ProviderName}_${this._apiVersion}_${this._extenstionVersion}`; } GetAvailableRadioUpdateAsync() { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; this._logger.Debug(ExtaLifeControllerRadioUpdatesProvider.ProviderName, `Checking for 868MHz radio firmware upgrade...`); const hadrwareInf = yield Api.Get(UpdatesProvider.ServiceName).GetHardwareInfoAsync(); if ((_a = hadrwareInf.GetAvailableHardware.first(hInfo => hInfo.DevicePath == "/proc")) === null || _a === void 0 ? void 0 : _a.DisplayName.contains("AM3352")) return new ResponseResult(UpdateErrorCode.UnsupportedDevice, `Cannot get available updates! This ExtaLife module does not support updates.`); if (parseFloat(this._extenstionVersion) < 1.2105051130) { return new ResponseResult(UpdateErrorCode.UnsupportedExtensionVersion, `Cannot get available updates! ExtaLife 868MHz extension is too old for upgrade. Version: ${this._extenstionVersion}`); } const result = yield ((_b = this._connection) === null || _b === void 0 ? void 0 : _b.SendAndWaitForResponseAsync(new GetRadioVersionRequest(), 8000, false)); let radioVersion = 1.0; if (result != null && result.Data != null && ((_c = result.Data) === null || _c === void 0 ? void 0 : _c.Item1)) radioVersion = parseFloat(`${result.Data.Item2.Major}.${result.Data.Item2.Minor}`); this._logger.Debug(ExtaLifeControllerRadioUpdatesProvider.ProviderName, `ExtaLife 868MHz radio firmware version: ${radioVersion}`); var url = `https://updates.tr7.pl/firmware/${this._runtimeInfo.UpdateChannel}/${radioVersion}/${ExtaLifeService.ExtaLifeRadioModuleDeviceGuid}`; try { this._logger.Debug(`Looking for update at: ${url}/${radioVersion}/update.json`); let response = yield fetch(`${url}/${radioVersion}/update.json`); let updateData; let updateInfo = new UpdateInfo(); switch (response.status) { case 200: if (response.body != null) updateData = (yield response.json()); break; default: this._logger.Debug(`Looking for update at: ${url}/update.json`); response = yield fetch(`${url}/update.json`); switch (response.status) { case 200: if (response.body != null) updateData = (yield response.json()); break; case 404: return new ResponseResult(UpdateErrorCode.DeviceIsUpToDate, `Updates not found, radio ExtaLife 868MHz is already up-to-date.`); default: return new ResponseResult(UpdateErrorCode.CannotGetUpdates, `Response status code does not indicate success. Status: ${response.status}`); } } if (updateData != null) { updateInfo.CurrentResourceVersion = radioVersion.toString(); updateInfo.UpdatedResourceName = "Radio ExtaLife 868 MHz"; updateInfo.Update = updateData; return updateInfo; } else throw (new Error(`Cannot get Update Data from response. Status: ${response.status}`)); } catch (err) { return new ResponseResult(UpdateErrorCode.CannotGetUpdates, `Cannot get available updates! ${err}`); } }); } GetCurrentRadioVersionAsync() { return __awaiter(this, void 0, void 0, function* () { var _a, _b; const result = yield ((_a = this._connection) === null || _a === void 0 ? void 0 : _a.SendAndWaitForResponseAsync(new GetRadioVersionRequest(), 8000, false)); if (result != null && result.Data != null && ((_b = result.Data) === null || _b === void 0 ? void 0 : _b.Item1)) return `${result.Data.Item2.Major}.${result.Data.Item2.Minor}`; return "n/a"; }); } InstallRadioUpdateAsync(update, updateProgress, updateAction) { return __awaiter(this, void 0, void 0, function* () { var _a, _b; if (updateAction != null) return new ResponseResult(UpdateErrorCode.UpdateActionsNotSupported, `Update service for given resource: ${update.UpdatedResourceName} does not support custom update actions.`); const hadrwareInf = yield Api.Get(UpdatesProvider.ServiceName).GetHardwareInfoAsync(); if ((_a = hadrwareInf.GetAvailableHardware.first(hInfo => hInfo.DevicePath == "/proc")) === null || _a === void 0 ? void 0 : _a.DisplayName.contains("AM3352")) return new ResponseResult(UpdateErrorCode.UnsupportedDevice, `Cannot get available updates! This ExtaLife module does not support updates.`); const progressInfo = new UpdateProgressInfo(); progressInfo.UpdatedResourceName = new Map([["pl-PL", update.UpdatedResourceName], ["en-US", update.UpdatedResourceName]]); try { yield ((_b = this._connection) === null || _b === void 0 ? void 0 : _b.SendAndHandleResponseAsync(new UpgradeRadioFirmwareRequest(update.Update.DownloadUri), 30000, (resp) => { switch (resp.Status) { case Status.MultiDataResponseStart: progressInfo.Status = UpdateStatus.PreparingForUpgrade; break; case Status.MultiDataResponse: if (resp.Data == null) { this._logger.Warning(ExtaLifeControllerRadioUpdatesProvider.ProviderName, `Recived update response without data! URI: ${update.Update.DownloadUri}`); return; } progressInfo.Percentage = resp.Data; progressInfo.Status = UpdateStatus.Upgrading; break; case Status.MultiDataResponseStop: if (resp.Data) { progressInfo.Percentage = 100; progressInfo.Status = UpdateStatus.Upgraded; } else progressInfo.Status = UpdateStatus.InstallationError; break; } this._logger.Debug(ExtaLifeControllerRadioUpdatesProvider.ProviderName, `Recived update progress response, percentage: ${progressInfo.Percentage}, status: ${progressInfo.Status}, resource name: ${update.UpdatedResourceName}`); updateProgress(progressInfo); }, false)); } catch (error) { progressInfo.Percentage = 0; progressInfo.Status = UpdateStatus.Error; updateProgress(progressInfo); return new ResponseResult(UpdateErrorCode.CannotProcessUpdate, `Cannot process update, error: ${error}`); } return Status.OK; }); } } ExtaLifeControllerRadioUpdatesProvider.ProviderName = "ExtaLifeControllerUpdateProvider"; class GetRadioVersionRequest extends DataFrame { constructor() { super(); this.Resource = "/extalife/radio/firmware/version"; this.Method = Method.Get; } } class RadioVersionResult { constructor() { this.Item1 = false; this.Item2 = new FirmwareVersion; } } class UpgradeRadioFirmwareRequest extends DataFrame { constructor(uri) { super(); this.Resource = "/extafree2/radio/upgrade"; this.Method = Method.Put; this.Data = uri; } } //# sourceMappingURL=ExtaLifeControllerRadioUpdatesProvider.js.map