@iobroker/socket-classes
Version:
ioBroker server-side web sockets
807 lines (684 loc) • 73.2 kB
Markdown
# @iobroker/socket-classes
This library is used at least for the following adapters:
- [iobroker.admin](https://github.com/ioBroker/ioBroker.admin)
- [iobroker.cloud](https://github.com/ioBroker/ioBroker.cloud)
- [iobroker.socketio](https://github.com/ioBroker/ioBroker.socketio)
- [iobroker.ws](https://github.com/ioBroker/ioBroker.ws)
- [iobroker.rest-api](https://github.com/ioBroker/ioBroker.rest-api)
- [iobroker.iot](https://github.com/ioBroker/ioBroker.iot)
## Usage as admin
```js
const TTL_SEC = 3600;
const SocketAdmin = require('@iobroker/socket-classes').SocketAdmin;
const ws = require('@iobroker/ws-server');
const session = require('express-session');
const utils = require('@iobroker/adapter-core'); // Get common adapter utils
const AdapterStore = require(utils.controllerDir + '/lib/session.js')(session, TTL_SEC);
const store = new AdapterStore({adapter});
const io = new SocketAdmin(adapter.config, adapter, objects);
io.start(
server,
ws,
{
userKey: 'connect.sid',
store,
secret: adapter.config.secret
}
);
// subscribe on all object changes
io.subscribe('objectChange', '*');
// later
io.close();
```
## Usage as socket (ws or socketio)
```js
const TTL_SEC = 3600;
const ws = require('@iobroker/ws-server');
const SocketWS = require('@iobroker/socket-classes').SocketCommon;
const session = require('express-session');
const utils = require('@iobroker/adapter-core'); // Get common adapter utils
const AdapterStore = require(utils.controllerDir + '/lib/session.js')(session, TTL_SEC);
const store = new AdapterStore({adapter});
const settings = adapter.config;
settings.crossDomain = true;
settings.ttl = settings.ttl || TTL_SEC;
const io = new SocketWS(settings, adapter);
io.start(server.server, ws, {userKey: 'connect.sid', checkUser, store, secret: adapter.config.secret});
// later
io.close();
```
## GUI subscribes
GUI client can send to desired instance the `subscribe` message
```js
socket.emit('clientSubscribe', 'cameras.0', 'startCamera', { width: 640, height: 480 }, result => console.log('Started: ' + result));
```
The instance 'cameras.0' will receive message `clientSubscribe` with information who want to receive messages.
```js
adapter.on('message', obj => {
if (obj?.command === 'clientSubscribe') {
if (obj?.message.type && obj.message.type.startsWith('startCamera/')) {
const [, camera] = obj.message.type.split('/');
// start camera with obj.message.data
// ...
// inform GUI that camera is started
adapter.sendTo(obj.from, obj.command, {result: true}, obj.callback);
this.subscribes = this.subscribes || [];
this.subscribes.push({sid: obj.message.sid, from: obj.from, type: obj.message.type, camera});
}
} else if (obj?.command === 'clientUnsubscribe' || obj?.command === 'clientSubscribeError') {
if (obj?.message.type && obj.message.type.startsWith('startCamera/')) {
const [, camera] = obj.message.type.split('/');
if (this.subscribes) {
const pos = this.subscribes.findIndex(s => s.sid === obj.message.sid && s.from === obj.from && s.type === obj.message.type);
if (pos !== -1) {
this.subscribes.splice(pos, 1);
// stop camera
// ...
}
}
}
}
});
```
and after that the client will receive messages from instance
```js
function sendImage(camera, data) {
this.subscribes.forEach(it => {
if (it.camera !== camera) {
return;
}
// send image to GUI
adapter.sendTo(it.from, 'im', {m: it.type, s: it.sid, d: data});
});
}
```
## Web Methods
<!-- WEB_METHODS_START -->
### List of commands
* [`authenticate`](#authenticate_w)
* [`updateTokenExpiration`](#updatetokenexpiration_w)
* [`error`](#error_w)
* [`log`](#log_w)
* [`checkFeatureSupported`](#checkfeaturesupported_w)
* [`getHistory`](#gethistory_w)
* [`httpGet`](#httpget_w)
* [`sendTo`](#sendto_w)
* [`sendToHost`](#sendtohost_w)
* [`authEnabled`](#authenabled_w)
* [`logout`](#logout_w)
* [`listPermissions`](#listpermissions_w)
* [`getUserPermissions`](#getuserpermissions_w)
* [`getVersion`](#getversion_w)
* [`getAdapterName`](#getadaptername_w)
* [`clientSubscribe`](#clientsubscribe_w)
* [`clientUnsubscribe`](#clientunsubscribe_w)
* [`getCompactSystemConfig`](#getcompactsystemconfig_w)
* [`getAdapterInstances`](#getadapterinstances_w)
* [`getObject`](#getobject_w)
* [`getObjects`](#getobjects_w)
* [`getAllObjects`](#getallobjects_w)
* [`subscribeObjects`](#subscribeobjects_w)
* [`unsubscribeObjects`](#unsubscribeobjects_w)
* [`getObjectView`](#getobjectview_w)
* [`setObject`](#setobject_w)
* [`delObject`](#delobject_w)
* [`getStates`](#getstates_w)
* [`getForeignStates`](#getforeignstates_w)
* [`getState`](#getstate_w)
* [`setState`](#setstate_w)
* [`getBinaryState`](#getbinarystate_w)
* [`setBinaryState`](#setbinarystate_w)
* [`subscribe`](#subscribe_w)
* [`subscribeStates`](#subscribestates_w)
* [`unsubscribe`](#unsubscribe_w)
* [`unsubscribeStates`](#unsubscribestates_w)
* [`readFile`](#readfile_w)
* [`readFile64`](#readfile64_w)
* [`writeFile64`](#writefile64_w)
* [`writeFile`](#writefile_w)
* [`unlink`](#unlink_w)
* [`deleteFile`](#deletefile_w)
* [`deleteFolder`](#deletefolder_w)
* [`renameFile`](#renamefile_w)
* [`rename`](#rename_w)
* [`mkdir`](#mkdir_w)
* [`readDir`](#readdir_w)
* [`chmodFile`](#chmodfile_w)
* [`chownFile`](#chownfile_w)
* [`fileExists`](#fileexists_w)
* [`subscribeFiles`](#subscribefiles_w)
* [`unsubscribeFiles`](#unsubscribefiles_w)
### Commands
#### <a name="authenticate_w"></a>`authenticate(callback)`
Wait till the user is authenticated.
As the user authenticates himself, the callback will be called
* `callback` *(isUserAuthenticated: boolean, isAuthenticationUsed: boolean) => void) => void*: Callback `(isUserAuthenticated: boolean, isAuthenticationUsed: boolean) => void`
#### <a name="updatetokenexpiration_w"></a>`updateTokenExpiration(accessToken, callback)`
After the access token is updated, this command must be called to update the session (Only for OAuth2)
* `accessToken` *string*: New access token
* `callback` *(error: string | undefined | null, success?: boolean) => void) => void*: Callback `(error: string | undefined | null, success?: boolean) => void`
#### <a name="error_w"></a>`error(error)`
Write error into ioBroker log
* `error` *Error | string*: Error object or error text
#### <a name="log_w"></a>`log(text, level)`
Write log entry into ioBroker log
* `text` *string*: log text
* `level` *ioBroker.LogLevel*: one of `['silly', 'debug', 'info', 'warn', 'error']`. The default is 'debug'.
#### <a name="checkfeaturesupported_w"></a>`checkFeatureSupported(feature, callback)`
Check if the same feature is supported by the current js-controller
* `feature` *SupportedFeature*: feature name like `CONTROLLER_LICENSE_MANAGER`
* `callback` *(error: string | Error | null | undefined, isSupported?: boolean) => void) => void*: callback `(error: string | Error | null | undefined, isSupported: boolean) => void`
#### <a name="gethistory_w"></a>`getHistory(id, options, callback)`
Get the history data from the specific instance
* `id` *string*: object ID
* `options` *ioBroker.GetHistoryOptions*: History options
* `callback` *(error: string | Error | null | undefined, result: ioBroker.GetHistoryResult) => void) => void*: callback `(error: string | Error | null | undefined, result: ioBroker.GetHistoryResult) => void`
#### <a name="httpget_w"></a>`httpGet(url, callback)`
Read content of HTTP(s) page server-side (without CORS and stuff)
* `url` *string*: Page URL
* `callback` *(error: Error | null | undefined | string, result?: {status: number; statusText: string}, data?: string) => void*: callback `(error: Error | null, result?: { status: number; statusText: string }, data?: string) => void`
#### <a name="sendto_w"></a>`sendTo(adapterInstance, command, message, callback)`
Send the message to specific instance
* `adapterInstance` *string*: instance name, e.g. `history.0`
* `command` *string*: command name
* `message` *any*: the message is instance-dependent
* `callback` *(result: any) => void) => void*: callback `(result: any) => void`
#### <a name="sendtohost_w"></a>`sendToHost(host, command, message, callback)`
Send a message to the specific host.
Host can answer to the following commands: `cmdExec, getRepository, getInstalled, getInstalledAdapter, getVersion, getDiagData, getLocationOnDisk, getDevList, getLogs, getHostInfo, delLogs, readDirAsZip, writeDirAsZip, readObjectsAsZip, writeObjectsAsZip, checkLogging, updateMultihost`.
* `host` *string*: Host name. With or without 'system.host.' prefix
* `command` * 'shell' | 'cmdExec' | 'getRepository' | 'getInstalled' | 'getInstalledAdapter' | 'getVersion' | 'getDiagData' | 'getLocationOnDisk' | 'getDevList' | 'getLogs' | 'getLogFile' | 'getLogFiles' | 'getHostInfo' | 'getHostInfoShort' | 'delLogs' | 'readDirAsZip' | 'writeDirAsZip' | 'readObjectsAsZip' | 'writeObjectsAsZip' | 'checkLogging' | 'updateMultihost' | 'upgradeController' | 'upgradeAdapterWithWebserver' | 'getInterfaces' | 'upload' | 'rebuildAdapter' | 'readBaseSettings' | 'writeBaseSettings' | 'addNotification' | 'clearNotifications' | 'getNotifications' | 'updateLicenses' | 'upgradeOsPackages' | 'restartController' | 'sendToSentry'*: Host command
* `message` *any*: the message is command-specific
* `callback` *(result: {error?: string; result?: any}) => void) => void*: callback `(result: { error?: string; result?: any }) => void`
#### <a name="authenabled_w"></a>`authEnabled(callback)`
Ask server is authentication enabled, and if the user authenticated
* `callback` *(isUserAuthenticated: boolean | Error | string, isAuthenticationUsed: boolean) => void) => void*: callback `(isUserAuthenticated: boolean | Error | string, isAuthenticationUsed: boolean) => void`
#### <a name="logout_w"></a>`logout(callback)`
Logout user
* `callback` *ioBroker.ErrorCallback*: callback `(error?: Error) => void`
#### <a name="listpermissions_w"></a>`listPermissions(callback)`
List commands and permissions
* `callback` *(permissions: Record< string, {type: 'object' | 'state' | 'users' | 'other' | 'file' | ''; operation: SocketOperation} >) => void*: callback `(permissions: Record<string, { type: 'object' | 'state' | 'users' | 'other' | 'file' | ''; operation: SocketOperation }>) => void`
#### <a name="getuserpermissions_w"></a>`getUserPermissions(callback)`
Get user permissions
* `callback` *(error: string | null | undefined, userPermissions?: SocketACL | null) => void) => void*: callback `(error: string | null | undefined, userPermissions?: SocketACL | null) => void`
#### <a name="getversion_w"></a>`getVersion(callback)`
Get the adapter version. Not the socket-classes version!
* `callback` *(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void*: callback `(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void`
#### <a name="getadaptername_w"></a>`getAdapterName(callback)`
Get adapter name: "iobroker.ws", "iobroker.socketio", "iobroker.web", "iobroker.admin"
* `callback` *(error: string | Error | null | undefined, adapterName: string) => void) => void*: callback `(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void`
#### <a name="clientsubscribe_w"></a>`clientSubscribe(targetInstance, messageType, data, callback)`
Client subscribes to specific instance's messages.
Client informs a specific instance about subscription on its messages.
After subscription, the socket will receive "im" messages from the desired instance
The target instance MUST acknowledge the subscription and return result
* `targetInstance` *string*: Instance name, e.g., 'cameras.0'
* `messageType` *string*: Message type, e.g., 'startRecording/cam1'
* `data` *any*: Optional data object, e.g., {width: 640, height: 480}
* `callback` *(error: string | null | Error | undefined, result?: {accepted: boolean; heartbeat?: number; error?: string}) => void*: Callback `(error: string | null, result?:{ accepted: boolean; heartbeat?: number; error?: string; }) => void`
#### <a name="clientunsubscribe_w"></a>`clientUnsubscribe(targetInstance, messageType, callback)`
Client unsubscribes from specific instance's messages.
The target instance MUST NOT acknowledge the un-subscription
* `targetInstance` *string*: Instance name, e.g., 'cameras.0'
* `messageType` *string*: Message type, e.g., 'startRecording/cam1'
* `callback` *(error: string | null | Error | undefined) => void) => void*: Callback `(error: string | null) => void`
#### <a name="getcompactsystemconfig_w"></a>`getCompactSystemConfig(callback)`
Get the system configuration in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, systemConfig?: {common: ioBroker.SystemConfigCommon; native?: {secret: string; vendor?: any}}) => void*: - Callback function `(error: string | null, systemConfig?: { common: any; native?: { secret: string } }) => void`
#### <a name="getadapterinstances_w"></a>`getAdapterInstances(adapterName, callback)`
Read all instances of the given adapter, or all instances of all adapters if adapterName is not defined
* `adapterName` *string | undefined*: adapter name, e.g. `history`. To get all instances of all adapters, just place here "".
* `callback` *(error: null | undefined | Error | string, instanceList?: ioBroker.InstanceObject[]) => void) => void*: callback `(error: null | undefined | Error | string, instanceList?: ioBroker.InstanceObject[]) => void`
### Objects
#### <a name="getobject_w"></a>`getObject(id, callback)`
Get one object.
* `id` *string*: Object ID
* `callback` *(error: Error | undefined | string | null, obj?: ioBroker.Object) => void) => void*: Callback `(error: string | null, obj?: ioBroker.Object) => void`
#### <a name="getobjects_w"></a>`getObjects(list, callback)`
Get all objects that are relevant for the web: all states and enums with rooms.
This is a non-admin version of "all objects" and will be overloaded in admin
* `list` *string[] | null*: Optional list of IDs
* `callback` *(error: Error | undefined | string | null, objs?: Record<string, ioBroker.Object>) => void) => void*: Callback `(error: string | null, objs?: Record<string, ioBroker.Object>) => void`
#### <a name="getallobjects_w"></a>`getAllObjects(callback)`
Get all objects that are relevant for the web: all states and enums with rooms.
* `callback` *(error: null | undefined | Error | string, result?: Record<string, ioBroker.Object>) => void) => void*: - Callback function `(error: string | null, objects?: Record<string, ioBroker.Object>) => void`
#### <a name="subscribeobjects_w"></a>`subscribeObjects(pattern, callback)`
Subscribe to object changes by pattern. The events will come as 'objectChange' events to the socket.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of IDs like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: Error | undefined | string | null) => void) => void*: Callback `(error: string | null) => void`
#### <a name="unsubscribeobjects_w"></a>`unsubscribeObjects(pattern, callback)`
Unsubscribe from object changes by pattern.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of IDs like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null | Error | undefined) => void) => void*: Callback `(error: string | null) => void`
#### <a name="getobjectview_w"></a>`getObjectView(design, search, params, callback)`
Get a view of objects. Make a query to the object database.
* `design` *string*: Design name, e.g., 'system' or other designs like `custom`, but it must exist object `_design/custom`. To 99,9% use `system`.
* `search` *string*: Search name, object type, like `state`, `instance`, `adapter`, `host`, ...
* `params` *{startkey?: string; endkey?: string; depth?: number}*: Parameters for the query, e.g., `{startkey: 'system.adapter.', endkey: 'system.adapter.\u9999', depth?: number}`
* `callback` *(error: string | null | Error | undefined, result?: {rows: {id: string; value: ioBroker.Object & {virtual: boolean; hasChildren: number;};}[];}) => void*: Callback `(error: string | null, result?: { rows: Array<GetObjectViewItem> }) => void`
#### <a name="setobject_w"></a>`setObject(id, obj, callback)`
Set an object.
* `id` *string*: Object ID
* `obj` *ioBroker.Object*: Object to set
* `callback` *(error: string | null | Error | undefined) => void) => void*: Callback `(error: string | null) => void`
#### <a name="delobject_w"></a>`delObject(id, _options, callback)`
Delete an object. Only deletion of flot and fullcalendar objects is allowed
* `id` *string*: Object ID, like 'flot.0.myChart'
* `_options` *any*: Options for deletion. Ignored
* `callback` *(error: string | null | Error | undefined) => void) => void*: Callback `(error: string | null) => void`
### States
#### <a name="getstates_w"></a>`getStates(pattern, callback)`
Get states by pattern of current adapter
* `pattern` *string | string[] | undefined*: optional pattern, like `system.adapter.*` or array of state IDs. If the pattern is omitted, you will get ALL states of current adapter
* `callback` *(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void) => void*: callback `(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void`
#### <a name="getforeignstates_w"></a>`getForeignStates(pattern, callback)`
Same as getStates
* `pattern` *string | string[]*: pattern like `system.adapter.*` or array of state IDs
* `callback` *(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void) => void*: callback `(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void`
#### <a name="getstate_w"></a>`getState(id, callback)`
Get a state by ID
* `id` *string*: State ID, e.g. `system.adapter.admin.0.memRss`
* `callback` *(error: null | undefined | Error | string, state?: ioBroker.State) => void) => void*: Callback `(error: null | undefined | Error | string, state?: ioBroker.State) => void`
#### <a name="setstate_w"></a>`setState(id, state, callback)`
Set a state by ID
* `id` *string*: State ID, e.g. `system.adapter.admin.0.memRss`
* `state` *ioBroker.SettableState*: State value or object, e.g. `{val: 123, ack: true}`
* `callback` *(error: null | undefined | Error | string, state?: ioBroker.State) => void) => void*: Callback `(error: null | undefined | Error | string, state?: ioBroker.State) => void`
#### <a name="getbinarystate_w"></a>`getBinaryState(id, callback)`
Get a binary state by ID
* `id` *string*: State ID, e.g. `javascript.0.binary`
* `callback` *(error: null | undefined | Error | string, base64?: string) => void) => void*: Callback `(error: null | undefined | Error | string, base64?: string) => void`
#### <a name="setbinarystate_w"></a>`setBinaryState(id, _base64, callback)`
Set a binary state by ID
* `id` *string*: State ID, e.g. `javascript.0.binary`
* `_base64` *string*: State value as base64 string. Binary states have no acknowledged flag.
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="subscribe_w"></a>`subscribe(pattern, callback)`
Subscribe to state changes by pattern.
The events will come as 'stateChange' events to the socket.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of states like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null) => void) => void*: Callback `(error: string | null) => void`
#### <a name="subscribestates_w"></a>`subscribeStates(pattern, callback)`
Subscribe to state changes by pattern. Same as `subscribe`.
The events will come as 'stateChange' events to the socket.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of states like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null) => void) => void*: Callback `(error: string | null) => void`
#### <a name="unsubscribe_w"></a>`unsubscribe(pattern, callback)`
Unsubscribe from state changes by pattern.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of states like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null) => void) => void*: Callback `(error: string | null) => void`
#### <a name="unsubscribestates_w"></a>`unsubscribeStates(pattern, callback)`
Unsubscribe from state changes by pattern. Same as `unsubscribe`.
The events will come as 'stateChange' events to the socket.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of states like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null) => void) => void*: Callback `(error: string | null) => void`
### Files
#### <a name="readfile_w"></a>`readFile(adapter, fileName, callback)`
Read a file from ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `callback` *(error: null | undefined | Error | string, data: Buffer | string, mimeType: string) => void) => void*: Callback `(error: null | undefined | Error | string, data: Buffer | string, mimeType: string) => void`
#### <a name="readfile64_w"></a>`readFile64(adapter, fileName, callback)`
Read a file from ioBroker DB as base64 string
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `callback` *(error: null | undefined | Error | string, base64?: string, mimeType?: string) => void) => void*: Callback `(error: null | undefined | Error | string, base64: string, mimeType: string) => void`
#### <a name="writefile64_w"></a>`writeFile64(adapter, fileName, data64, options, callback?)`
Write a file into ioBroker DB as base64 string
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `data64` *string*: file content as base64 string
* `options` *{mode?: number} | ((error: null | undefined | Error | string) => void)*: optional `{mode: 0x0644}`
* `callback?` *(error: null | undefined | Error | string) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="writefile_w"></a>`writeFile(adapter, fileName, data, options, callback?)`
Write a file into ioBroker DB as text
This function is overloaded in admin (because admin accepts only base64)
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `data` *string*: file content as text
* `options` *{mode?: number} | ((error: null | undefined | Error | string) => void)*: optional `{mode: 0x0644}`
* `callback?` *(error: null | undefined | Error | string) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="unlink_w"></a>`unlink(adapter, name, callback)`
Delete a file in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `name` *string*: file name, e.g. `main/vis-views.json`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="deletefile_w"></a>`deleteFile(adapter, name, callback)`
Delete a file in ioBroker DB (same as "unlink", but only for files)
* `adapter` *string*: instance name, e.g. `vis.0`
* `name` *string*: file name, e.g. `main/vis-views.json`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="deletefolder_w"></a>`deleteFolder(adapter, name, callback)`
Delete folder in ioBroker DB (same as `unlink`, but only for folders)
* `adapter` *string*: instance name, e.g. `vis.0`
* `name` *string*: folder name, e.g. `main`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="renamefile_w"></a>`renameFile(adapter, oldName, newName, callback)`
Rename a file in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `oldName` *string*: current file name, e.g. `main/vis-views.json`
* `newName` *string*: new file name, e.g. `main/vis-views-new.json`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="rename_w"></a>`rename(adapter, oldName, newName, callback)`
Rename file or folder in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `oldName` *string*: current file name, e.g. `main/vis-views.json`
* `newName` *string*: new file name, e.g. `main/vis-views-new.json`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="mkdir_w"></a>`mkdir(adapter, dirName, callback)`
Create a folder in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `dirName` *string*: desired folder name, e.g. `main`
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="readdir_w"></a>`readDir(adapter, dirName, options, callback?)`
Read the content of the folder in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `dirName` *string*: folder name, e.g. `main`
* `options` *object | ((error: null | undefined | Error | string, files: ioBroker.ReadDirResult[]) => void)*: for future use
* `callback?` *(error: null | undefined | Error | string, files: ioBroker.ReadDirResult[]) => void*: Callback `(error: null | undefined | Error | string, files: Array<{file: string, isDir: boolean, stats: {size: number}, modifiedAt: number, acl: {owner: string, ownerGroup: string, permissions: number, read: boolean, write: boolean}}>) => void`
#### <a name="chmodfile_w"></a>`chmodFile(adapter, fileName, options, callback?)`
Change a file mode in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `options` *{mode?: number}*: options `{mode: 0x644}`
* `callback?` *(error: string | Error | null | undefined) => void*: Callback `(error: string | Error | null | undefined) => void`
#### <a name="chownfile_w"></a>`chownFile(adapter, fileName, options, callback?)`
Change file owner in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `options` *{owner: `system.user.${string}`; ownerGroup?: `system.group.${string}`}*: options `{owner: 'system.user.user', ownerGroup: 'system.group.administrator'}` or `system.user.user`. If ownerGroup is not defined, it will be taken from an owner.
* `callback?` *(error: null | undefined | Error | string) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="fileexists_w"></a>`fileExists(adapter, fileName, callback)`
Check if the file or folder exists in ioBroker DB
* `adapter` *string*: instance name, e.g. `vis.0`
* `fileName` *string*: file name, e.g. `main/vis-views.json`
* `callback` *(error: null | undefined | Error | string, exists?: boolean) => void) => void*: Callback `(error: null | undefined | Error | string, exists?: boolean) => void`
#### <a name="subscribefiles_w"></a>`subscribeFiles(id, pattern, callback)`
Subscribe to file changes in ioBroker DB
* `id` *string*: instance name, e.g. `vis.0` or any object ID of type `meta`. `id` could have wildcards `*` too.
* `pattern` *string | string[]*: file name pattern, e.g. `main/*.json` or array of names
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="unsubscribefiles_w"></a>`unsubscribeFiles(id, pattern, callback)`
Unsubscribe from file changes in ioBroker DB
* `id` *string*: instance name, e.g. `vis.0` or any object ID of type `meta`. `id` could have wildcards `*` too.
* `pattern` *string | string[]*: file name pattern, e.g. `main/*.json` or array of names
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
<!-- WEB_METHODS_END -->
## Admin Methods
<!-- ADMIN_METHODS_START -->
### List of commands
* [`authenticate`](#authenticate_a)
* [`updateTokenExpiration`](#updatetokenexpiration_a)
* [`error`](#error_a)
* [`log`](#log_a)
* [`checkFeatureSupported`](#checkfeaturesupported_a)
* [`getHistory`](#gethistory_a)
* [`httpGet`](#httpget_a)
* [`sendTo`](#sendto_a)
* [`sendToHost`](#sendtohost_a)
* [`authEnabled`](#authenabled_a)
* [`logout`](#logout_a)
* [`listPermissions`](#listpermissions_a)
* [`getUserPermissions`](#getuserpermissions_a)
* [`getVersion`](#getversion_a)
* [`getAdapterName`](#getadaptername_a)
* [`clientSubscribe`](#clientsubscribe_a)
* [`clientUnsubscribe`](#clientunsubscribe_a)
* [`getCompactSystemConfig`](#getcompactsystemconfig_a)
* [`getAdapterInstances`](#getadapterinstances_a)
* [`getHostByIp`](#gethostbyip_a)
* [`requireLog`](#requirelog_a)
* [`readLogs`](#readlogs_a)
* [`cmdExec`](#cmdexec_a)
* [`eventsThreshold`](#eventsthreshold_a)
* [`getRatings`](#getratings_a)
* [`getCurrentInstance`](#getcurrentinstance_a)
* [`decrypt`](#decrypt_a)
* [`encrypt`](#encrypt_a)
* [`getIsEasyModeStrict`](#getiseasymodestrict_a)
* [`getEasyMode`](#geteasymode_a)
* [`getAdapters`](#getadapters_a)
* [`updateLicenses`](#updatelicenses_a)
* [`getCompactInstances`](#getcompactinstances_a)
* [`getCompactAdapters`](#getcompactadapters_a)
* [`getCompactInstalled`](#getcompactinstalled_a)
* [`getCompactSystemRepositories`](#getcompactsystemrepositories_a)
* [`getCompactRepository`](#getcompactrepository_a)
* [`getCompactHosts`](#getcompacthosts_a)
* [`delState`](#delstate_a)
* [`getStates`](#getstates_a)
* [`getForeignStates`](#getforeignstates_a)
* [`getState`](#getstate_a)
* [`setState`](#setstate_a)
* [`getBinaryState`](#getbinarystate_a)
* [`setBinaryState`](#setbinarystate_a)
* [`subscribe`](#subscribe_a)
* [`subscribeStates`](#subscribestates_a)
* [`unsubscribe`](#unsubscribe_a)
* [`unsubscribeStates`](#unsubscribestates_a)
* [`addUser`](#adduser_a)
* [`delUser`](#deluser_a)
* [`addGroup`](#addgroup_a)
* [`delGroup`](#delgroup_a)
* [`changePassword`](#changepassword_a)
* [`getObject`](#getobject_a)
* [`getObjects`](#getobjects_a)
* [`getAllObjects`](#getallobjects_a)
* [`subscribeObjects`](#subscribeobjects_a)
* [`unsubscribeObjects`](#unsubscribeobjects_a)
* [`getObjectView`](#getobjectview_a)
* [`setObject`](#setobject_a)
* [`delObject`](#delobject_a)
* [`extendObject`](#extendobject_a)
* [`getForeignObjects`](#getforeignobjects_a)
* [`delObjects`](#delobjects_a)
* [`readFile`](#readfile_a)
* [`readFile64`](#readfile64_a)
* [`writeFile64`](#writefile64_a)
* [`writeFile`](#writefile_a)
* [`unlink`](#unlink_a)
* [`deleteFile`](#deletefile_a)
* [`deleteFolder`](#deletefolder_a)
* [`renameFile`](#renamefile_a)
* [`rename`](#rename_a)
* [`mkdir`](#mkdir_a)
* [`readDir`](#readdir_a)
* [`chmodFile`](#chmodfile_a)
* [`chownFile`](#chownfile_a)
* [`fileExists`](#fileexists_a)
* [`subscribeFiles`](#subscribefiles_a)
* [`unsubscribeFiles`](#unsubscribefiles_a)
### Commands
#### <a name="authenticate_a"></a>`authenticate(callback)`
Wait till the user is authenticated.
As the user authenticates himself, the callback will be called
* `callback` *(isUserAuthenticated: boolean, isAuthenticationUsed: boolean) => void) => void*: Callback `(isUserAuthenticated: boolean, isAuthenticationUsed: boolean) => void`
#### <a name="updatetokenexpiration_a"></a>`updateTokenExpiration(accessToken, callback)`
After the access token is updated, this command must be called to update the session (Only for OAuth2)
* `accessToken` *string*: New access token
* `callback` *(error: string | undefined | null, success?: boolean) => void) => void*: Callback `(error: string | undefined | null, success?: boolean) => void`
#### <a name="error_a"></a>`error(error)`
Write error into ioBroker log
* `error` *Error | string*: Error object or error text
#### <a name="log_a"></a>`log(text, level)`
Write log entry into ioBroker log
* `text` *string*: log text
* `level` *ioBroker.LogLevel*: one of `['silly', 'debug', 'info', 'warn', 'error']`. The default is 'debug'.
#### <a name="checkfeaturesupported_a"></a>`checkFeatureSupported(feature, callback)`
Check if the same feature is supported by the current js-controller
* `feature` *SupportedFeature*: feature name like `CONTROLLER_LICENSE_MANAGER`
* `callback` *(error: string | Error | null | undefined, isSupported?: boolean) => void) => void*: callback `(error: string | Error | null | undefined, isSupported: boolean) => void`
#### <a name="gethistory_a"></a>`getHistory(id, options, callback)`
Get the history data from the specific instance
* `id` *string*: object ID
* `options` *ioBroker.GetHistoryOptions*: History options
* `callback` *(error: string | Error | null | undefined, result: ioBroker.GetHistoryResult) => void) => void*: callback `(error: string | Error | null | undefined, result: ioBroker.GetHistoryResult) => void`
#### <a name="httpget_a"></a>`httpGet(url, callback)`
Read content of HTTP(s) page server-side (without CORS and stuff)
* `url` *string*: Page URL
* `callback` *(error: Error | null | undefined | string, result?: {status: number; statusText: string}, data?: string) => void*: callback `(error: Error | null, result?: { status: number; statusText: string }, data?: string) => void`
#### <a name="sendto_a"></a>`sendTo(adapterInstance, command, message, callback)`
Send the message to specific instance
* `adapterInstance` *string*: instance name, e.g. `history.0`
* `command` *string*: command name
* `message` *any*: the message is instance-dependent
* `callback` *(result: any) => void) => void*: callback `(result: any) => void`
#### <a name="sendtohost_a"></a>`sendToHost(host, command, message, callback)`
Send a message to the specific host.
Host can answer to the following commands: `cmdExec, getRepository, getInstalled, getInstalledAdapter, getVersion, getDiagData, getLocationOnDisk, getDevList, getLogs, getHostInfo, delLogs, readDirAsZip, writeDirAsZip, readObjectsAsZip, writeObjectsAsZip, checkLogging, updateMultihost`.
* `host` *string*: Host name. With or without 'system.host.' prefix
* `command` * 'shell' | 'cmdExec' | 'getRepository' | 'getInstalled' | 'getInstalledAdapter' | 'getVersion' | 'getDiagData' | 'getLocationOnDisk' | 'getDevList' | 'getLogs' | 'getLogFile' | 'getLogFiles' | 'getHostInfo' | 'getHostInfoShort' | 'delLogs' | 'readDirAsZip' | 'writeDirAsZip' | 'readObjectsAsZip' | 'writeObjectsAsZip' | 'checkLogging' | 'updateMultihost' | 'upgradeController' | 'upgradeAdapterWithWebserver' | 'getInterfaces' | 'upload' | 'rebuildAdapter' | 'readBaseSettings' | 'writeBaseSettings' | 'addNotification' | 'clearNotifications' | 'getNotifications' | 'updateLicenses' | 'upgradeOsPackages' | 'restartController' | 'sendToSentry'*: Host command
* `message` *any*: the message is command-specific
* `callback` *(result: {error?: string; result?: any}) => void) => void*: callback `(result: { error?: string; result?: any }) => void`
#### <a name="authenabled_a"></a>`authEnabled(callback)`
Ask server is authentication enabled, and if the user authenticated
* `callback` *(isUserAuthenticated: boolean | Error | string, isAuthenticationUsed: boolean) => void) => void*: callback `(isUserAuthenticated: boolean | Error | string, isAuthenticationUsed: boolean) => void`
#### <a name="logout_a"></a>`logout(callback)`
Logout user
* `callback` *ioBroker.ErrorCallback*: callback `(error?: Error) => void`
#### <a name="listpermissions_a"></a>`listPermissions(callback)`
List commands and permissions
* `callback` *(permissions: Record< string, {type: 'object' | 'state' | 'users' | 'other' | 'file' | ''; operation: SocketOperation} >) => void*: callback `(permissions: Record<string, { type: 'object' | 'state' | 'users' | 'other' | 'file' | ''; operation: SocketOperation }>) => void`
#### <a name="getuserpermissions_a"></a>`getUserPermissions(callback)`
Get user permissions
* `callback` *(error: string | null | undefined, userPermissions?: SocketACL | null) => void) => void*: callback `(error: string | null | undefined, userPermissions?: SocketACL | null) => void`
#### <a name="getversion_a"></a>`getVersion(callback)`
Get the adapter version. Not the socket-classes version!
* `callback` *(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void*: callback `(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void`
#### <a name="getadaptername_a"></a>`getAdapterName(callback)`
Get adapter name: "iobroker.ws", "iobroker.socketio", "iobroker.web", "iobroker.admin"
* `callback` *(error: string | Error | null | undefined, adapterName: string) => void) => void*: callback `(error: string | Error | null | undefined, version: string | undefined, adapterName: string) => void`
#### <a name="clientsubscribe_a"></a>`clientSubscribe(targetInstance, messageType, data, callback)`
Client subscribes to specific instance's messages.
Client informs a specific instance about subscription on its messages.
After subscription, the socket will receive "im" messages from the desired instance
The target instance MUST acknowledge the subscription and return result
* `targetInstance` *string*: Instance name, e.g., 'cameras.0'
* `messageType` *string*: Message type, e.g., 'startRecording/cam1'
* `data` *any*: Optional data object, e.g., {width: 640, height: 480}
* `callback` *(error: string | null | Error | undefined, result?: {accepted: boolean; heartbeat?: number; error?: string}) => void*: Callback `(error: string | null, result?:{ accepted: boolean; heartbeat?: number; error?: string; }) => void`
#### <a name="clientunsubscribe_a"></a>`clientUnsubscribe(targetInstance, messageType, callback)`
Client unsubscribes from specific instance's messages.
The target instance MUST NOT acknowledge the un-subscription
* `targetInstance` *string*: Instance name, e.g., 'cameras.0'
* `messageType` *string*: Message type, e.g., 'startRecording/cam1'
* `callback` *(error: string | null | Error | undefined) => void) => void*: Callback `(error: string | null) => void`
#### <a name="getcompactsystemconfig_a"></a>`getCompactSystemConfig(callback)`
Get the system configuration in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, systemConfig?: {common: ioBroker.SystemConfigCommon; native?: {secret: string; vendor?: any}}) => void*: - Callback function `(error: string | null, systemConfig?: { common: any; native?: { secret: string } }) => void`
#### <a name="getadapterinstances_a"></a>`getAdapterInstances(adapterName, callback)`
Read all instances of the given adapter, or all instances of all adapters if adapterName is not defined
* `adapterName` *string | undefined*: adapter name, e.g. `history`. To get all instances of all adapters, just place here "".
* `callback` *(error: null | undefined | Error | string, instanceList?: ioBroker.InstanceObject[]) => void) => void*: callback `(error: null | undefined | Error | string, instanceList?: ioBroker.InstanceObject[]) => void`
### Admin
#### <a name="gethostbyip_a"></a>`getHostByIp(ip, callback?)`
Read the host object by IP address.
* `ip` *string*: - IP address, e.g., `192.168.1.1`. IPv4 or IPv6
* `callback?` *(error: string | null | Error | undefined, hostObject?: ioBroker.HostObject | null) => void*: - Callback function `(ip: string, obj: ioBroker.HostObject | null) => void`
#### <a name="requirelog_a"></a>`requireLog(isEnabled, callback?)`
Activate or deactivate logging events. Events will be sent to the socket as `log` events. Adapter must have `common.logTransporter = true`.
* `isEnabled` *boolean*: - Is logging enabled
* `callback?` *(error: string | null | Error | undefined) => void*: - Callback function `(error: string | null) => void`
#### <a name="readlogs_a"></a>`readLogs(host, callback?)`
Get the log files from the given host.
* `host` *string*: - Host ID, e.g., `system.host.raspberrypi`
* `callback?` *(error: string | null | Error | undefined, list?: {fileName: string; size: number}[]) => void*: - Callback function `(error: string | null, list?: { fileName: string; size: number }[]) => void`
#### <a name="cmdexec_a"></a>`cmdExec(host, id, cmd, callback?)`
Execute the shell command on host/controller.
The following response commands are expected: `cmdStdout`, `cmdStderr`, `cmdExit`.
* `host` *string*: - Host name, e.g., `system.host.raspberrypi`
* `id` *number*: - Session ID, e.g., `Date.now()`. This session ID will come in events `cmdStdout`, `cmdStderr`, `cmdExit`
* `cmd` *string*: - Command to execute
* `callback?` *(error: string | null | Error | undefined) => void*: - Callback function `(error: string | null) => void`
#### <a name="eventsthreshold_a"></a>`eventsThreshold(isActive)`
Enable or disable the event threshold. Used only for admin to limit the number of events to the front-end.
* `isActive` *boolean*: - If true, then events will be limited
#### <a name="getratings_a"></a>`getRatings(update, callback?)`
Get the ratings of adapters.
* `update` *boolean | ((error: string | null | Error | undefined, ratings?: Ratings) => void)*: - If true, the ratings will be read from the central server, if false from the local cache
* `callback?` *(error: string | null | Error | undefined, ratings?: Ratings) => void*: - Callback function `(error: string | null, ratings?: Ratings) => void`
#### <a name="getcurrentinstance_a"></a>`getCurrentInstance(callback)`
Get the current instance name, like "admin.0"
* `callback` *(error: string | null | Error | undefined, namespace: string) => void) => void*: - Callback function `(error: string | null, namespace?: string) => void`
#### <a name="decrypt_a"></a>`decrypt(encryptedText, callback)`
Decrypts text with the system secret key.
* `encryptedText` *string*: - Encrypted text
* `callback` *(error: string | null | Error | undefined, decryptedText?: string) => void) => void*: - Callback function `(error: string | null, decryptedText?: string) => void`
#### <a name="encrypt_a"></a>`encrypt(plainText, callback)`
Encrypts text with the system secret key.
* `plainText` *string*: - Plain text to encrypt
* `callback` *(error: string | null | Error | undefined, encryptedText?: string) => void) => void*: - Callback function `(error: string | null, encryptedText?: string) => void`
#### <a name="getiseasymodestrict_a"></a>`getIsEasyModeStrict(callback)`
Get if the admin has easy mode enabled.
* `callback` *(error: string | null | Error | undefined, isEasyModeStrict?: boolean) => void) => void*: - Callback function `(error: string | null, isEasyModeStrict?: boolean) => void`
#### <a name="geteasymode_a"></a>`getEasyMode(callback)`
Get easy mode configuration.
* `callback` *(error: string | null | Error | undefined, easyModeConfig?: {strict: boolean; configs: InstanceConfig[]}) => void*: - Callback function `(error: string | null, easyModeConfig?: { strict: boolean; configs: InstanceConfig[] }) => void`
#### <a name="getadapters_a"></a>`getAdapters(adapterName, callback)`
Get all adapter as objects.
* `adapterName` *string*: - Optional adapter name
* `callback` *(error: string | null | Error | undefined, result?: ioBroker.AdapterObject[]) => void) => void*: - Callback function `(error: string | null, results?: ioBroker.Object[]) => void`
#### <a name="updatelicenses_a"></a>`updateLicenses(login, password, callback)`
Read software licenses (vis, knx, ...) from ioBroker.net cloud for given user
* `login` *string*: - Cloud login
* `password` *string*: - Cloud password
* `callback` *(error: string | null | Error | undefined, result?: License[]) => void) => void*: - Callback function `(error: string | null, results?: License[]) => void`
#### <a name="getcompactinstances_a"></a>`getCompactInstances(callback)`
Get all instances in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, result?: Record<string, CompactInstanceInfo>) => void) => void*: - Callback function `(error: string | null, results?: Record<string, { adminTab: boolean; name: string; icon: string; enabled: boolean }>) => void`
#### <a name="getcompactadapters_a"></a>`getCompactAdapters(callback)`
Get all adapters in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, result?: Record<string, CompactAdapterInfo>) => void) => void*: - Callback function `(error: string | null, results?: Record<string, { icon: string; v: string; iv: string }>) => void`
#### <a name="getcompactinstalled_a"></a>`getCompactInstalled(host, callback)`
Get all installed adapters in a compact form to save bandwidth.
* `host` *string*: - Host name, e.g., `system.host.raspberrypi`
* `callback` *(result?: Record<string, {version: string}>) => void) => void*: - Callback function `(error: string | null, results?: Record<string, { version: string }>) => void`
#### <a name="getcompactsystemrepositories_a"></a>`getCompactSystemRepositories(callback)`
Get system repositories in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, systemRepositories?: CompactSystemRepository) => void) => void*: - Callback function `(error: string | null, systemRepositories?: { common: any; native?: { repositories: Record<string, { json: { _repoInfo: any } } } }) => void`
#### <a name="getcompactrepository_a"></a>`getCompactRepository(host, callback)`
Get the repository in a compact form to save bandwidth.
* `host` *string*: - Host name, e.g., `system.host.raspberrypi`
* `callback` *(result: Record<string, {version: string; icon?: string}>) => void) => void*: - Callback function `(error: string | null, results?: Record<string, { version: string; icon?: string }>) => void`
#### <a name="getcompacthosts_a"></a>`getCompactHosts(callback)`
Get all hosts in a compact form to save bandwidth.
* `callback` *(error: string | null | Error | undefined, hosts?: CompactHost[]) => void) => void*: - Callback function `(error: string | null, results?: Record<string, { common: { name: string; icon: string; color: string; installedVersion: string }; native: { hardware: { networkInterfaces: any[] } } }>) => void`
### States
#### <a name="delstate_a"></a>`delState(id, callback?)`
Delete a state. The corresponding object will be deleted too.
* `id` *string*: - State ID
* `callback?` *(error: string | null | Error | undefined) => void*: - Callback function `(error: string | null) => void`
#### <a name="getstates_a"></a>`getStates(pattern, callback)`
Get states by pattern of current adapter
* `pattern` *string | string[] | undefined*: optional pattern, like `system.adapter.*` or array of state IDs. If the pattern is omitted, you will get ALL states of current adapter
* `callback` *(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void) => void*: callback `(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void`
#### <a name="getforeignstates_a"></a>`getForeignStates(pattern, callback)`
Same as getStates
* `pattern` *string | string[]*: pattern like `system.adapter.*` or array of state IDs
* `callback` *(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void) => void*: callback `(error: null | undefined | Error | string, states?: Record<string, ioBroker.State>) => void`
#### <a name="getstate_a"></a>`getState(id, callback)`
Get a state by ID
* `id` *string*: State ID, e.g. `system.adapter.admin.0.memRss`
* `callback` *(error: null | undefined | Error | string, state?: ioBroker.State) => void) => void*: Callback `(error: null | undefined | Error | string, state?: ioBroker.State) => void`
#### <a name="setstate_a"></a>`setState(id, state, callback)`
Set a state by ID
* `id` *string*: State ID, e.g. `system.adapter.admin.0.memRss`
* `state` *ioBroker.SettableState*: State value or object, e.g. `{val: 123, ack: true}`
* `callback` *(error: null | undefined | Error | string, state?: ioBroker.State) => void) => void*: Callback `(error: null | undefined | Error | string, state?: ioBroker.State) => void`
#### <a name="getbinarystate_a"></a>`getBinaryState(id, callback)`
Get a binary state by ID
* `id` *string*: State ID, e.g. `javascript.0.binary`
* `callback` *(error: null | undefined | Error | string, base64?: string) => void) => void*: Callback `(error: null | undefined | Error | string, base64?: string) => void`
#### <a name="setbinarystate_a"></a>`setBinaryState(id, _base64, callback)`
Set a binary state by ID
* `id` *string*: State ID, e.g. `javascript.0.binary`
* `_base64` *string*: State value as base64 string. Binary states have no acknowledged flag.
* `callback` *(error: null | undefined | Error | string) => void) => void*: Callback `(error: null | undefined | Error | string) => void`
#### <a name="subscribe_a"></a>`subscribe(pattern, callback)`
Subscribe to state changes by pattern.
The events will come as 'stateChange' events to the socket.
* `pattern` *string | string[]*: Pattern like `system.adapter.*` or array of states like `['system.adapter.admin.0.memRss', 'system.adapter.admin.0.memHeapTotal']`
* `callback` *(error: string | null) => void) => void*: Callback `(error: string | null) => void`
#### <a name="subscribestates_a"></a>`subscribeStates(pattern, callback)`
Subscribe to state changes by