lavva.exalushome.extalife
Version:
Library implementing communication and abstraction layers for ExtaLife API in ExalusHome system
179 lines • 10.6 kB
JavaScript
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