diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 814b86b..dae435f 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -97,10 +97,10 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Use Node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x - name: Extract the version and commit body from the tag id: extract_release diff --git a/dist/lib/SimpleAPI.d.ts b/dist/lib/SimpleAPI.d.ts new file mode 100644 index 0000000..27461e1 --- /dev/null +++ b/dist/lib/SimpleAPI.d.ts @@ -0,0 +1,95 @@ +import type { Server as HttpServer } from 'node:http'; +import type { Server as HttpsServer } from 'node:https'; +import { Express, type Request, type Response } from 'express'; +export type Server = HttpServer | HttpsServer; +declare const commandsPermissions: { + [operation: string]: { + type: 'state' | 'object' | ''; + operation: 'read' | 'write' | 'list' | ''; + }; +}; +type CommandName = keyof typeof commandsPermissions; +/** + * SimpleAPI class + * + * From settings used only secure, auth and crossDomain + * + * @class + * @param webSettings settings of the web server, like
{secure: settings.secure, port: settings.port}
+ * @param adapter web adapter object
+ * @param instanceSettings instance object with common and native
+ * @param app express application
+ * @return object instance
+ */
+export declare class SimpleAPI {
+ private readonly adapter;
+ private readonly settings;
+ private readonly config;
+ private readonly namespace;
+ private readonly app?;
+ private readonly cachedNames;
+ private readonly cachedIds;
+ private readonly restApiDelayed;
+ constructor(_server: Server, webSettings: {
+ secure: boolean;
+ port: number | string;
+ defaultUser?: string;
+ auth?: boolean;
+ language?: ioBroker.Languages;
+ }, adapter: ioBroker.Adapter, instanceSettings: ioBroker.InstanceObject, app?: Express);
+ isAuthenticated(query: {
+ user?: string;
+ pass?: string;
+ }): Promise{secure: settings.secure, port: settings.port}
+ * @param adapter web adapter object
+ * @param instanceSettings instance object with common and native
+ * @param app express application
+ * @return object instance
+ */
+class SimpleAPI {
+ adapter;
+ settings;
+ config;
+ namespace;
+ app;
+ cachedNames = new Map();
+ cachedIds = new Map();
+ restApiDelayed = [];
+ constructor(_server, webSettings, adapter, instanceSettings, app) {
+ this.app = app;
+ this.adapter = adapter;
+ this.settings = webSettings;
+ this.config = instanceSettings
+ ? instanceSettings.native
+ : {};
+ this.namespace = instanceSettings ? instanceSettings._id.substring('system.adapter.'.length) : 'simple-api';
+ this.adapter.log.info(`${this.settings.secure ? 'Secure ' : ''}simpleAPI server listening on port ${this.settings.port}`);
+ this.config.defaultUser = webSettings.defaultUser || this.config.defaultUser || 'system.user.admin';
+ if (!this.config.defaultUser.match(/^system\.user\./)) {
+ this.config.defaultUser = `system.user.${this.config.defaultUser}`;
+ }
+ this.config.onlyAllowWhenUserIsOwner = !!this.config.onlyAllowWhenUserIsOwner;
+ this.adapter.log.info(`Allow states only when user is owner: ${this.config.onlyAllowWhenUserIsOwner}`);
+ if (this.app) {
+ this.adapter.log.info(`Install extension on /${this.namespace}/`);
+ this.app.use(`/${this.namespace}/`, (req, res) => {
+ this.restApi(req, res);
+ });
+ // let it be accessible under old address too
+ for (const c in commandsPermissions) {
+ ((command) => {
+ this.adapter.log.info(`Install extension on /${command}/`);
+ this.app.use(`/${command}/`, (req, res) => {
+ void this.restApi(req, res, `/${command}${req.url}`);
+ });
+ })(c);
+ }
+ }
+ // Subscribe on object changes to manage cache
+ this.adapter.subscribeForeignObjects('*');
+ }
+ async isAuthenticated(query) {
+ if (!query.user || !query.pass) {
+ this.adapter.log.warn('No password or username!');
+ return false;
+ }
+ const res = await this.adapter.checkPasswordAsync(query.user, query.pass);
+ if (res) {
+ this.adapter.log.debug(`Logged in: ${query.user}`);
+ }
+ else {
+ this.adapter.log.warn(`Invalid password or user name: ${query.user}`);
+ }
+ return res;
+ }
+ stateChange(id, state) {
+ if (state?.ack) {
+ for (let i = this.restApiDelayed.length - 1; i >= 0; i--) {
+ if (this.restApiDelayed[i].id === id) {
+ if (this.restApiDelayed[i].timer) {
+ this.restApiDelayed[i].timer = undefined;
+ this.adapter.clearTimeout(this.restApiDelayed[i].timer);
+ this.restApiDelayed[i].resolve(this.restApiDelayed[i].index);
+ }
+ this.restApiDelayed.splice(i, 1);
+ }
+ }
+ }
+ }
+ objectChange(id, _obj) {
+ // Clear from cache, will be reinitialized on next usage
+ if (this.cachedIds.has(id)) {
+ const name = this.cachedIds.get(id)?.name;
+ if (name) {
+ this.cachedIds.delete(id);
+ this.cachedNames.delete(name);
+ }
+ }
+ }
+ static parseQuery(input, query, values) {
+ const parts = (input || '').split('&');
+ for (const part of parts) {
+ const [name, value] = part.split('=');
+ try {
+ if (name === 'user') {
+ query.user = decodeURIComponent(value.trim());
+ }
+ else if (name === 'pass') {
+ query.pass = decodeURIComponent(value);
+ }
+ else if (name === 'prettyPrint') {
+ query.prettyPrint = !value ? true : decodeURIComponent(value.trim()) === 'true';
+ }
+ else if (name === 'json') {
+ query.json = !value ? true : decodeURIComponent(value.trim()) === 'true';
+ }
+ else if (name === 'noStringify') {
+ query.noStringify = !value ? true : decodeURIComponent(value.trim()) === 'true';
+ }
+ else if (name === 'wait') {
+ query.wait = !value ? 2000 : parseInt(decodeURIComponent(value.trim()), 10) || 0;
+ }
+ else if (name === 'ack') {
+ const val = decodeURIComponent(value.trim());
+ query.ack = val === 'true' || val === '1';
+ }
+ else {
+ values[name] =
+ value === undefined ? null : decodeURIComponent(`${value.trim()}`.replace(/\+/g, '%20'));
+ }
+ }
+ catch {
+ values[name] = value;
+ }
+ }
+ if (query.ack === undefined) {
+ query.ack = false;
+ }
+ }
+ async setStates(values, query) {
+ let response = [];
+ const names = Object.keys(values);
+ for (let i = 0; i < names.length; i++) {
+ const stateId = names[i];
+ this.adapter.log.debug(`${i}: "${stateId}"`);
+ try {
+ const { id, name } = await this.findState(stateId, query.user);
+ if (!id) {
+ response[i] = { error: `datapoint "${stateId}" not found` };
+ }
+ else {
+ let value;
+ if (values[stateId] === 'true') {
+ value = true;
+ }
+ else if (values[stateId] === 'false') {
+ value = false;
+ }
+ else {
+ const f = parseFloat(values[stateId]);
+ if (!isNaN(f) && values[stateId] === f.toString()) {
+ value = f;
+ }
+ else {
+ value = values[stateId];
+ }
+ }
+ try {
+ await this.adapter.setForeignState(id, value, !!query.ack, {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ response[i] = { id, val: value };
+ this.adapter.log.debug(`Add to Response: ${JSON.stringify(response[i])}`);
+ }
+ catch (err) {
+ throw err;
+ }
+ }
+ }
+ catch (err) {
+ // State isn't found or no permission
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ throw err;
+ }
+ response[i] = { error: err.toString() };
+ }
+ }
+ return response;
+ }
+ async restApiPost(req, res, command, oId, values, query) {
+ let body = '';
+ req.on('data', (data) => {
+ body += data.toString();
+ });
+ await new Promise(resolve => req.on('end', resolve));
+ switch (command) {
+ case 'setBulk': {
+ this.adapter.log.debug(`POST-${command}: body = ${body}`);
+ SimpleAPI.parseQuery(body, query, values);
+ this.adapter.log.debug(`POST-${command}: values = ${JSON.stringify(values)}`);
+ try {
+ const response = await this.setStates(values, query);
+ this.doResponse(res, 'json', response, query.prettyPrint);
+ }
+ catch (err) {
+ // State not found
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, 'json', 401, err.toString());
+ }
+ else if (err.toString().includes('found')) {
+ this.doErrorResponse(res, 'json', 404, err.toString());
+ }
+ else {
+ this.doErrorResponse(res, 'json', 500, err.toString());
+ }
+ }
+ break;
+ }
+ case 'setValueFromBody': {
+ // all given variables will get the same value
+ Object.values(oId).forEach(id => {
+ values[id] = body;
+ });
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, 'json', 422, 'no object/datapoint given');
+ return;
+ }
+ try {
+ const response = await this.setStates(values, query);
+ this.doResponse(res, 'json', response, query.prettyPrint);
+ }
+ catch (err) {
+ // State not found
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, 'json', 403, err.toString());
+ }
+ else if (err.toString().includes('found')) {
+ this.doErrorResponse(res, 'json', 404, err.toString());
+ }
+ else {
+ this.doErrorResponse(res, 'json', 500, err.toString());
+ }
+ }
+ break;
+ }
+ case 'search':
+ if (this.config.dataSource && this.config.allDatapoints) {
+ const result = await this.adapter.sendToAsync(this.config.dataSource, 'getEnabledDPs');
+ this.doResponse(res, 'json', Object.keys(result), query.prettyPrint);
+ }
+ else {
+ try {
+ const target = JSON.parse(body).target || '';
+ this.adapter.log.debug(`[SEARCH] target = ${target}`);
+ const list = await this.adapter.getForeignStatesAsync(values.pattern || `${target}*`, {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ oId = Object.keys(list);
+ this.doResponse(res, 'json', oId, query.prettyPrint);
+ }
+ catch (err) {
+ if (err.includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, 'json', 401, err);
+ }
+ else {
+ this.doErrorResponse(res, 'json', 500, err);
+ }
+ }
+ }
+ break;
+ case 'query': {
+ let bodyQuery;
+ try {
+ bodyQuery = JSON.parse(body);
+ let dateFrom = Date.now();
+ let dateTo = Date.now();
+ this.adapter.log.debug(`[QUERY] targets = ${JSON.stringify(bodyQuery.targets)}`);
+ this.adapter.log.debug(`[QUERY] range = ${JSON.stringify(bodyQuery.range)}`);
+ if (bodyQuery.range) {
+ dateFrom = Date.parse(bodyQuery.range.from);
+ dateTo = Date.parse(bodyQuery.range.to);
+ }
+ const options = {
+ start: dateFrom,
+ end: dateTo,
+ aggregate: values.aggregate || 'onchange',
+ };
+ if (values.count) {
+ options.count = parseInt(values.count, 10);
+ }
+ if (values.step) {
+ options.step = parseInt(values.step, 10);
+ }
+ oId = [];
+ if (Array.isArray(bodyQuery.targets)) {
+ bodyQuery.targets.forEach(t => oId.push(t.target));
+ }
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, 'json', 422, 'no datapoints given');
+ break;
+ }
+ const list = [];
+ for (let b = 0; b < bodyQuery.targets.length; b++) {
+ const element = {
+ target: bodyQuery.targets[b].target,
+ datapoints: [],
+ };
+ if (this.config.dataSource &&
+ !(bodyQuery.targets[b].data && bodyQuery.targets[b].data.noHistory === true)) {
+ this.adapter.log.debug(`Read data from: ${this.config.dataSource}`);
+ const result = await this.adapter.getHistoryAsync(this.config.dataSource, bodyQuery.targets[b].target, options);
+ this.adapter.log.debug(`[QUERY] sendTo result = ${JSON.stringify(result)}`);
+ for (let i = 0; i < result.result.length; i++) {
+ element.datapoints.push([result.result[i].val, result.result[i].ts]);
+ }
+ list.push(element);
+ }
+ else {
+ this.adapter.log.debug('Read last state');
+ try {
+ const { state, id } = await this.getState(bodyQuery.targets[b].target, query.user);
+ element.target = id;
+ if (state) {
+ element.datapoints = [[state.val, state.ts]];
+ }
+ else {
+ element.datapoints = [[null, null]];
+ }
+ list.push(element);
+ }
+ catch (err) {
+ if (err.toString().includes('not found')) {
+ list.push({ target: bodyQuery.targets[b].target, datapoints: [] });
+ }
+ else {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, 'json', 401, err);
+ }
+ else {
+ this.doErrorResponse(res, 'json', 500, err);
+ }
+ return;
+ }
+ }
+ }
+ }
+ this.doResponse(res, 'json', list, query.prettyPrint);
+ }
+ catch (err) {
+ if (err.includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, 'json', 403, err);
+ }
+ else {
+ this.doErrorResponse(res, 'json', 500, `Cannot parse request: ${body}`);
+ }
+ }
+ break;
+ }
+ case 'annotations':
+ // iobroker does not support annotations
+ this.adapter.log.debug('[ANNOTATIONS]');
+ this.doResponse(res, 'json', [], query.prettyPrint);
+ break;
+ default:
+ this.doErrorResponse(res, 'json', 422, `command "${command}" unknown`);
+ break;
+ }
+ }
+ async findState(idOrName, user) {
+ // By ID
+ let r = this.cachedIds.get(idOrName);
+ if (r) {
+ return r;
+ }
+ // By name
+ r = this.cachedNames.get(idOrName);
+ if (r) {
+ return r;
+ }
+ const result =
+ // @ts-expect-error fixed in js-controller
+ await this.adapter.findForeignObjectAsync(idOrName, null, { user, lang: this.settings.language });
+ if (result.id) {
+ let name;
+ if (result.name && typeof result.name === 'object') {
+ name = result.name[this.settings.language || 'en'] || result.name.en;
+ }
+ else {
+ name = result.name || '';
+ }
+ this.cachedIds.set(result.id, { id: result.id, name });
+ if (idOrName !== result.id) {
+ // search was for a name, so also cache the name
+ this.cachedNames.set(name, { id: result.id, name });
+ }
+ return { id: result.id, name };
+ }
+ throw new Error(`datapoint "${idOrName}" not found`);
+ }
+ async getState(idOrName, user) {
+ const result = await this.findState(idOrName, user);
+ return {
+ state: await this.adapter.getForeignStateAsync(result.id, {
+ user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ }),
+ id: result.id,
+ };
+ }
+ doResponse(res, type, content, pretty) {
+ let response;
+ if (pretty && typeof content === 'object') {
+ type = 'plain';
+ response = JSON.stringify(content, null, 2);
+ }
+ else {
+ response = JSON.stringify(content);
+ }
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
+ res.setHeader('Content-Type', type === 'json' ? 'application/json; charset=utf-8' : 'text/html; charset=utf-8');
+ res.statusCode = 200;
+ res.end(response, 'utf8');
+ }
+ doErrorResponse(res, type, status, error) {
+ let response;
+ response = escapeHtml(error || 'unknown');
+ if (!response.startsWith('error: ')) {
+ response = `error: ${response}`;
+ }
+ if (type === 'json') {
+ response = JSON.stringify({ error: response });
+ }
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
+ res.setHeader('Content-Type', type === 'json' ? 'application/json; charset=utf-8' : 'text/html; charset=utf-8');
+ res.statusCode = status;
+ res.end(response, 'utf8');
+ }
+ async checkPermissions(user, command) {
+ const acl = await this.adapter.calculatePermissionsAsync(user, commandsPermissions);
+ if (user !== 'system.user.admin') {
+ // type: file, object, state, other
+ // operation: create, read, write, list, delete, sendto, execute, sendto
+ if (commandsPermissions[command]) {
+ // If permission required
+ if (commandsPermissions[command].type) {
+ if (commandsPermissions[command].type === 'object') {
+ if (commandsPermissions[command].operation === 'list') {
+ return !!acl.object?.list;
+ }
+ if (commandsPermissions[command].operation === 'read') {
+ return !!acl.object?.read;
+ }
+ return !!acl.object?.write;
+ }
+ if (commandsPermissions[command].type === 'state') {
+ if (commandsPermissions[command].operation === 'list') {
+ return !!acl.state?.list;
+ }
+ if (commandsPermissions[command].operation === 'read') {
+ return !!acl.state?.read;
+ }
+ return !!acl.state?.write;
+ }
+ }
+ return true;
+ }
+ // unknown command
+ this.adapter.log.warn(`Unknown command from "${user}": ${command}`);
+ return false;
+ }
+ return true;
+ }
+ async setValue(id, value, res, wait, query, responseType) {
+ if (wait) {
+ await this.adapter.subscribeForeignStatesAsync(id);
+ }
+ try {
+ await this.adapter.setForeignState(id, value, query.ack, {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ }
+ catch (err) {
+ if (wait && !this.restApiDelayed.find(it => it.id === id)) {
+ this.adapter.unsubscribeForeignStates(id);
+ }
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ }
+ else {
+ this.doErrorResponse(res, responseType, 500, err);
+ }
+ return;
+ }
+ if (!wait) {
+ this.doResponse(res, responseType, { id, value, val: value }, query.prettyPrint);
+ }
+ else {
+ // Wait for ack=true
+ await new Promise((resolve, reject) => {
+ let timer;
+ const index = `${Date.now()}_${Math.round(Math.random() * 1000000)}`;
+ timer = this.adapter.setTimeout(() => {
+ timer = undefined;
+ reject(new Error(`timeout ${index}`));
+ }, wait);
+ this.restApiDelayed.push({ id, resolve, timer, index, value });
+ })
+ .then((index) => {
+ // Delete the timer
+ for (let i = 0; i < this.restApiDelayed.length; i++) {
+ if (this.restApiDelayed[i].index === index) {
+ const id = this.restApiDelayed[i].id;
+ const value = this.restApiDelayed[i].value;
+ if (this.restApiDelayed[i].timer) {
+ this.adapter.clearTimeout(this.restApiDelayed[i].timer);
+ this.restApiDelayed[i].timer = undefined;
+ }
+ this.restApiDelayed.splice(i, 1);
+ this.doResponse(res, responseType, { id, value, val: value }, query.prettyPrint);
+ // Unsubscribe if no other request is waiting
+ if (!this.restApiDelayed.find(it => it.id === id)) {
+ this.adapter.unsubscribeForeignStates(id);
+ }
+ break;
+ }
+ }
+ })
+ .catch((err) => {
+ const [error, index] = err.toString().split(' ');
+ for (let i = 0; i < this.restApiDelayed.length; i++) {
+ if (this.restApiDelayed[i].index === index) {
+ const id = this.restApiDelayed[i].id;
+ if (this.restApiDelayed[i].timer) {
+ this.adapter.clearTimeout(this.restApiDelayed[i].timer);
+ this.restApiDelayed[i].timer = undefined;
+ }
+ this.restApiDelayed.splice(i, 1);
+ if (!this.restApiDelayed.find(it => it.id === id)) {
+ this.adapter.unsubscribeForeignStates(id);
+ }
+ this.doErrorResponse(res, responseType, 500, error);
+ break;
+ }
+ }
+ });
+ }
+ }
+ async restApi(req, res, overwriteUrl) {
+ let url = overwriteUrl || req.url || '';
+ const values = {};
+ const query = { ack: false };
+ let oId = [];
+ try {
+ url = decodeURI(url);
+ }
+ catch (e) {
+ this.adapter.log.warn(`Malformed URL encoding for ${url}: ${e}`);
+ }
+ const pos = url.indexOf('?');
+ if (pos !== -1) {
+ url = url.substring(0, pos);
+ SimpleAPI.parseQuery(url.substring(pos + 1), query, values);
+ }
+ const [, _command, varsName] = url.split('/');
+ const command = _command;
+ const responseType = command === 'getPlainValue' ? 'plain' : 'json';
+ // Analyse system.adapter.socketio.0.uptime,system.adapter.history.0.memRss?value=78&wait=300
+ if (varsName) {
+ oId = varsName.split(',');
+ for (let j = oId.length - 1; j >= 0; j--) {
+ try {
+ oId[j] = decodeURIComponent(oId[j]);
+ }
+ catch (e) {
+ this.adapter.log.warn(`Malformed URL encoding for "${oId[j]}": ${e}`);
+ oId[j] = oId[j].trim().replace(/%23/g, '#'); // do old style minimal parsing
+ }
+ }
+ oId = oId.filter(id => id.trim());
+ }
+ let user;
+ // If authentication check is required
+ if (this.settings.auth) {
+ query.user ||= req.user;
+ const isAuth = !!req.user || (await this.isAuthenticated(query));
+ if (!isAuth) {
+ this.doErrorResponse(res, responseType, 401, `authentication failed. Please write "http${this.settings.secure ? 's' : ''}://${req.headers.host}?user=UserName&pass=Password"`);
+ return;
+ }
+ }
+ else {
+ query.user = req.user || this.config.defaultUser;
+ }
+ if (query.user && !query.user.startsWith('system.user.')) {
+ user = `system.user.${query.user}`;
+ }
+ else {
+ user = query.user;
+ }
+ if (!(await this.checkPermissions(user, command))) {
+ this.doErrorResponse(res, responseType, 401, `No permission for "${query.user}" to call ${command}`);
+ return;
+ }
+ if (req.method === 'POST') {
+ await this.restApiPost(req, res, command, oId, values, query);
+ return;
+ }
+ switch (command) {
+ case 'getPlainValue': {
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'no datapoint given');
+ break;
+ }
+ const response = [];
+ for (let i = 0; i < oId.length; i++) {
+ try {
+ const { state, id } = await this.getState(oId[i], user);
+ if (state) {
+ let val = state.val;
+ if (query.json) {
+ let obj;
+ try {
+ obj = JSON.parse(typeof val === 'string' ? val : JSON.stringify(val));
+ }
+ catch {
+ // ignore
+ obj = val;
+ }
+ val = JSON.stringify(obj);
+ }
+ else {
+ if (query.noStringify) {
+ val =
+ state.val === null
+ ? 'null'
+ : state.val === undefined
+ ? 'undefined'
+ : state.val.toString();
+ }
+ else {
+ val = JSON.stringify(state.val);
+ }
+ }
+ response[i] = val;
+ }
+ else {
+ response[i] = `error: cannot read state "${oId[i]}"`;
+ }
+ }
+ catch (err) {
+ if (err.toString().includes('not found')) {
+ response[i] = `error: datapoint "${oId[i]}" not found`;
+ }
+ else {
+ this.adapter.log.error(`Cannot get state: ${err}`);
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ }
+ else {
+ this.doErrorResponse(res, responseType, 500, err);
+ }
+ return;
+ }
+ }
+ }
+ this.doResponse(res, responseType, response.join('\n'), query.prettyPrint);
+ break;
+ }
+ case 'get': {
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'no object/datapoint given');
+ break;
+ }
+ const response = [];
+ for (let k = 0; k < oId.length; k++) {
+ this.adapter.log.debug(`work for ID ${oId[k]}`);
+ try {
+ const { state, id } = await this.getState(oId[k], query.user);
+ if (!id) {
+ response[k] = { error: `datapoint "${oId[k]}" not found` };
+ }
+ else {
+ const obj = this.adapter.getForeignObjectAsync(id);
+ response[k] = { ...obj, ...state };
+ }
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ return;
+ }
+ response[k] = { error: `datapoint "${oId[k]}" not found` };
+ }
+ }
+ this.doResponse(res, responseType, response.length === 1 ? response[0] : response, query.prettyPrint);
+ break;
+ }
+ case 'getBulk': {
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'no datapoints given');
+ break;
+ }
+ const response = [];
+ for (let b = 0; b < oId.length; b++) {
+ try {
+ const { id, state } = await this.getState(oId[b], query.user);
+ response[b] = { id, val: state?.val, ts: state?.ts, ack: state?.ack };
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ return;
+ }
+ response[b] = { id: oId[b], val: undefined, ts: undefined, ack: undefined };
+ }
+ }
+ this.doResponse(res, responseType, response, query.prettyPrint);
+ break;
+ }
+ case 'set': {
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'object/datapoint not given');
+ return;
+ }
+ if (values.value === undefined && values.val === undefined) {
+ this.doErrorResponse(res, responseType, 422, `error: no value found for "${oId[0]}". Use /set/id?value=1 or /set/id?value=1&wait=1000`);
+ return;
+ }
+ try {
+ const { id } = await this.findState(oId[0], query.user);
+ if (!id) {
+ this.doErrorResponse(res, responseType, 404, `error: datapoint "${oId[0]}" not found`);
+ return;
+ }
+ const type = values.type;
+ let value;
+ if (values.val === undefined) {
+ value = values.value;
+ }
+ else {
+ value = values.val;
+ }
+ // Ack=true cannot be awaited
+ const wait = !query.ack ? query.wait || 0 : 0;
+ // If type is not defined or not known
+ if (!type ||
+ (type !== 'boolean' &&
+ type !== 'number' &&
+ type !== 'string' &&
+ type !== 'json' &&
+ type !== 'object' &&
+ type !== 'array')) {
+ // Maybe this is JSON
+ if (values.val && (values.val[0] === '[' || values.val[0] === '{')) {
+ try {
+ values.val = JSON.parse(values.val);
+ }
+ catch (e) {
+ // keep it as string
+ }
+ }
+ if (value === 'true') {
+ value = true;
+ }
+ else if (value === 'false') {
+ value = false;
+ }
+ else if (!isNaN(parseFloat(value))) {
+ value = parseFloat(value);
+ }
+ }
+ else {
+ // type is known
+ if (type === 'boolean') {
+ value = value === 'true' || value === '1';
+ }
+ else if (type === 'number') {
+ value = parseFloat(value);
+ }
+ else if (type === 'json' || type === 'array' || type === 'object') {
+ try {
+ value = JSON.parse(value);
+ }
+ catch (e) {
+ this.doErrorResponse(res, responseType, 500, e);
+ return;
+ }
+ }
+ // string must not be formatted
+ }
+ await this.setValue(id, value, res, wait, query, responseType);
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ }
+ else {
+ this.doErrorResponse(res, responseType, 404, err);
+ }
+ }
+ break;
+ }
+ case 'toggle':
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'state not given');
+ return;
+ }
+ try {
+ const { id } = await this.findState(oId[0], query.user);
+ if (id) {
+ const wait = query.wait || 0;
+ // Read a type of object
+ const obj = await this.adapter.getForeignObjectAsync(id, {
+ user: query.user,
+ });
+ if (obj) {
+ const state = await this.adapter.getForeignStateAsync(id, {
+ user: query.user,
+ });
+ if (state) {
+ let value = state.val;
+ if (obj.common.type === 'boolean' || (!obj.common.type && typeof value === 'boolean')) {
+ if (value === 'true') {
+ value = true;
+ }
+ else if (value === 'false') {
+ value = false;
+ }
+ value = !value;
+ }
+ else if (obj.common.type === 'number' ||
+ (!obj.common.type && typeof value === 'number')) {
+ value = parseFloat(value);
+ if (obj.common.max !== undefined) {
+ obj.common.min = obj.common.min === undefined ? 0 : obj.common.min;
+ if (value > obj.common.max) {
+ value = obj.common.max;
+ }
+ else if (value < obj.common.min) {
+ value = obj.common.min;
+ }
+ // Invert
+ value = obj.common.max + obj.common.min - value;
+ }
+ else {
+ // the default number is from 0 to 100
+ if (value > 100) {
+ value = 100;
+ }
+ if (value < 0) {
+ value = 0;
+ }
+ value = 100 - value;
+ }
+ }
+ else {
+ if (value === 'true' || value === true) {
+ value = false;
+ }
+ else if (value === 'on') {
+ value = 'off';
+ }
+ else if (value === 'off') {
+ value = 'on';
+ }
+ else if (value === 'OFF') {
+ value = 'ON';
+ }
+ else if (value === 'ON') {
+ value = 'OFF';
+ }
+ else if (value === 'false' || value === false) {
+ value = true;
+ }
+ else if (parseFloat(value).toString() === value?.toString()) {
+ value = parseFloat(value).toString() ? 0 : 1;
+ }
+ else {
+ this.doErrorResponse(res, responseType, 422, 'state is neither number nor boolean');
+ return;
+ }
+ }
+ await this.setValue(id, value, res, wait, query, responseType);
+ return;
+ }
+ this.doErrorResponse(res, responseType, 404, `error: state "${oId[0]}" does not exist or null`);
+ return;
+ }
+ }
+ this.doErrorResponse(res, responseType, 404, `error: datapoint "${oId[0]}" not found`);
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ }
+ else {
+ this.doErrorResponse(res, responseType, 404, err);
+ }
+ }
+ break;
+ // /setBulk?BidCos-RF.FEQ1234567:1.LEVEL=0.7&Licht-Küche/LEVEL=0.7&Anwesenheit=0&950=1
+ case 'setBulk': {
+ const response = [];
+ this.adapter.log.debug(`Values: ${JSON.stringify(values)}`);
+ const names = Object.keys(values);
+ for (let n = 0; n < names.length; n++) {
+ try {
+ const { id, name } = await this.findState(names[n], query.user);
+ if (!id) {
+ response[n] = { error: `error: datapoint "${names[n]}" not found` };
+ continue;
+ }
+ this.adapter.log.debug(`GET-${command} for id=${id}, oid=${names[n]}, value=${values[names[n]]}`);
+ let value = values[names[n]];
+ if (value === 'true') {
+ value = true;
+ }
+ else if (value === 'false') {
+ value = false;
+ }
+ else {
+ const f = parseFloat(value);
+ if (!isNaN(f) && value === f.toString()) {
+ value = f;
+ }
+ }
+ try {
+ await this.adapter.setForeignState(id, value, query.ack, {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ response[n] = { id: id, val: value, value };
+ this.adapter.log.debug(`Add to Response-Get: ${JSON.stringify(response[n])}`);
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ return;
+ }
+ else {
+ response[n] = { error: err.toString() };
+ }
+ }
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doErrorResponse(res, responseType, 403, err);
+ return;
+ }
+ else {
+ response[n] = { error: err.toString() };
+ }
+ }
+ }
+ this.doResponse(res, responseType, response, query.prettyPrint);
+ break;
+ }
+ case 'getObjects':
+ case 'objects': {
+ try {
+ const list = await this.adapter.getForeignObjectsAsync(values.pattern || varsName || '*', values.type || null, {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ this.doResponse(res, responseType, list, query.prettyPrint);
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doResponse(res, responseType, 403, err.toString());
+ }
+ else {
+ this.doResponse(res, responseType, 500, err.toString());
+ }
+ }
+ break;
+ }
+ case 'getStates':
+ case 'states': {
+ try {
+ const list = await this.adapter.getForeignStatesAsync(values.pattern || varsName || '*', {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ this.doResponse(res, responseType, list, query.prettyPrint);
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doResponse(res, responseType, 403, err.toString());
+ }
+ else {
+ this.doResponse(res, responseType, 500, err.toString());
+ }
+ }
+ break;
+ }
+ case 'search':
+ try {
+ if (this.config.dataSource && this.config.allDatapoints !== true) {
+ const result = await this.adapter.sendToAsync(this.config.dataSource, 'getEnabledDPs');
+ this.doResponse(res, responseType, Object.keys(result || {}), query.prettyPrint);
+ }
+ else {
+ this.adapter.log.debug(`[SEARCH] target = ${varsName}`);
+ const list = await this.adapter.getForeignStatesAsync(values.pattern || varsName || '*', {
+ user: query.user,
+ limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner,
+ });
+ this.doResponse(res, responseType, Object.keys(list), query.prettyPrint);
+ }
+ }
+ catch (err) {
+ if (err.toString().includes(ERROR_PERMISSION)) {
+ this.doResponse(res, responseType, 403, err.toString());
+ }
+ else {
+ this.doResponse(res, responseType, 500, err.toString());
+ }
+ }
+ break;
+ case 'query': {
+ this.adapter.log.debug(JSON.stringify(values));
+ let dateFrom = Date.now();
+ let dateTo = Date.now();
+ if (values.dateFrom) {
+ dateFrom = Date.parse(values.dateFrom);
+ }
+ if (values.dateTo) {
+ dateTo = Date.parse(values.dateTo);
+ }
+ const options = {
+ start: dateFrom,
+ end: dateTo,
+ aggregate: values.aggregate || 'onchange',
+ };
+ if (values.count) {
+ options.count = parseInt(values.count, 10);
+ }
+ if (values.step) {
+ options.step = parseInt(values.step, 10);
+ }
+ if (!oId.length || !oId[0]) {
+ this.doErrorResponse(res, responseType, 422, 'no datapoints given');
+ return;
+ }
+ const response = [];
+ for (let b = 0; b < oId.length; b++) {
+ const element = {
+ target: oId[b],
+ datapoints: [],
+ };
+ if (this.config.dataSource && !(values.noHistory && values.noHistory === 'true')) {
+ this.adapter.log.debug(`Read data from: ${this.config.dataSource}`);
+ const result = await this.adapter.getHistoryAsync(this.config.dataSource, oId[b], options);
+ this.adapter.log.debug(`[QUERY] sendTo result = ${JSON.stringify(result)}`);
+ for (let i = 0; i < result.result.length; i++) {
+ element.datapoints.push([result.result[i].val, result.result[i].ts]);
+ }
+ response[b] = element;
+ }
+ else {
+ this.adapter.log.debug('Read last state');
+ const { state } = await this.getState(oId[b], query.user);
+ if (state) {
+ element.datapoints = [[state.val, state.ts]];
+ }
+ else {
+ element.datapoints = [[null, null]];
+ }
+ }
+ }
+ this.doResponse(res, responseType, response, query.prettyPrint);
+ break;
+ }
+ case 'annotations':
+ // ioBroker does not support annotations
+ this.adapter.log.debug('[ANNOTATIONS]');
+ this.doResponse(res, responseType, [], query.prettyPrint);
+ break;
+ case 'help':
+ // is default behaviour too
+ default:
+ const _obj = command === 'help' ? {} : { error: `command ${command} unknown` };
+ let request = `http${this.settings.secure ? 's' : ''}://${req.headers.host}`;
+ if (this.app) {
+ request += `/${this.namespace}/`;
+ }
+ let auth = '';
+ if (this.settings.auth) {
+ auth = 'user=UserName&pass=Password';
+ }
+ _obj.getPlainValue = `${request}/getPlainValue/stateID${auth ? `?${auth}` : ''}`;
+ _obj.get = `${request}/get/stateID/?prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.getBulk = `${request}/getBulk/stateID1,stateID2/?prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.set = `${request}/set/stateID?value=1&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.toggle = `${request}/toggle/stateID&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.setBulk = `${request}/setBulk?stateID1=0.7&stateID2=0&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.setValueFromBody = `${request}/setValueFromBody?stateID1${auth ? `&${auth}` : ''}`;
+ _obj.objects = `${request}/objects?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.states = `${request}/states?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.search = `${request}/search?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`;
+ _obj.query = `${request}/query/stateID1,stateID2/?dateFrom=2019-06-06T12:00:00.000Z&dateTo=2019-06-06T12:00:00.000Z&noHistory=false&aggregate=minmax&count=3000&prettyPrint${auth ? `&${auth}` : ''}`;
+ this.doResponse(res, responseType, _obj, true);
+ break;
+ }
+ }
+}
+exports.SimpleAPI = SimpleAPI;
+//# sourceMappingURL=SimpleAPI.js.map
\ No newline at end of file
diff --git a/dist/lib/SimpleAPI.js.map b/dist/lib/SimpleAPI.js.map
new file mode 100644
index 0000000..a010da3
--- /dev/null
+++ b/dist/lib/SimpleAPI.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"SimpleAPI.js","sourceRoot":"","sources":["../../src/lib/SimpleAPI.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/main.d.ts b/dist/main.d.ts
new file mode 100644
index 0000000..0b86aa2
--- /dev/null
+++ b/dist/main.d.ts
@@ -0,0 +1,13 @@
+import { type Request, type Response } from 'express';
+import { Adapter, type AdapterOptions } from '@iobroker/adapter-core';
+import { SimpleApiAdapterConfig } from './types';
+export declare class SimpleApiAdapter extends Adapter {
+ config: SimpleApiAdapterConfig;
+ private webServer;
+ private certificates;
+ constructor(options?: Partial