@things-factory/integration-modbus 9.0.24 → 9.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/connector/modbus-tcp.d.ts +0 -1
- package/dist-server/engine/connector/modbus-tcp.js +8 -9
- package/dist-server/engine/connector/modbus-tcp.js.map +1 -1
- package/dist-server/engine/task/modbus-read.js +1 -1
- package/dist-server/engine/task/modbus-read.js.map +1 -1
- package/dist-server/engine/task/modbus-write-single.js +1 -1
- package/dist-server/engine/task/modbus-write-single.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Connection, Connector } from '@things-factory/integration-base';
|
|
2
2
|
export declare class ModbusTCPConnector implements Connector {
|
|
3
3
|
ready(connectionConfigs: any): Promise<void>;
|
|
4
|
-
checkConnectionInstance(domain: any, connectionName: any): boolean;
|
|
5
4
|
connect(connection: any): Promise<void>;
|
|
6
5
|
disconnect(connection: Connection): Promise<void>;
|
|
7
6
|
get parameterSpec(): {
|
|
@@ -14,15 +14,14 @@ class ModbusTCPConnector {
|
|
|
14
14
|
await Promise.all(connectionConfigs.map(this.connect.bind(this)));
|
|
15
15
|
integration_base_1.ConnectionManager.logger.info('modbus-tcp connections are ready');
|
|
16
16
|
}
|
|
17
|
-
checkConnectionInstance(domain, connectionName) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
17
|
+
// async checkConnectionInstance(domain, connectionName): Promise<boolean> {
|
|
18
|
+
// try {
|
|
19
|
+
// const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)
|
|
20
|
+
// return !!(connection?.client?.connectionState !== 'online')
|
|
21
|
+
// } catch (e) {
|
|
22
|
+
// return false
|
|
23
|
+
// }
|
|
24
|
+
// }
|
|
26
25
|
async connect(connection) {
|
|
27
26
|
var [host, port = 502] = connection.endpoint.split(':');
|
|
28
27
|
var { params: { keepalive = true } } = connection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import * as modbus from 'jsmodbus'\nimport { Socket } from 'net'\nimport PQueue from 'p-queue'\nimport PromiseSocket from 'promise-socket'\n\nimport { Connection, ConnectionManager, Connector } from '@things-factory/integration-base'\nimport { sleep } from '@things-factory/utils'\n\nconst debug = require('debug')('things-factory:modbus-tcp-connector')\n\nexport class ModbusTCPConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('modbus-tcp connections are ready')\n }\n\n checkConnectionInstance(domain, connectionName): boolean {\n try {\n const connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n return !!(connection?.client?.connectionState !== 'online')\n } catch (e) {\n return false\n }\n }\n\n async connect(connection) {\n var [host, port = 502] = connection.endpoint.split(':')\n var {\n params: { keepalive = true }\n } = connection\n\n try {\n /*\n try to keep connecting if keepalive is true\n */\n var clientIdx = 1\n var connected: boolean = false\n var looped: boolean = true\n while (true) {\n var clientSocket = new Socket()\n clientSocket = new Socket()\n var promiseSocket = new PromiseSocket(clientSocket)\n\n var client = new modbus.client.TCP(clientSocket, clientIdx++, 10000)\n\n clientSocket.on('error', async ex => {\n debug(ex)\n ConnectionManager.logger.error(`modbus tcp connection error: ${ex}`)\n })\n\n clientSocket.on('close', async () => {\n debug(`modbus tcp connection closed`)\n if (keepalive && !looped) {\n await this.disconnect(connection)\n await this.connect(connection)\n }\n })\n\n debug(`connecting to ${connection.endpoint}...`)\n\n looped = true\n await promiseSocket\n .connect(port, host)\n .then(() => {\n connected = true\n })\n .catch(ex => {\n promiseSocket && promiseSocket.destroy()\n })\n\n // if the current connections have the connection with the same name, the current try should be stopped.\n if (!keepalive || connected) {\n looped = false\n break\n }\n\n await sleep(1000)\n }\n\n var queue = new PQueue({ concurrency: 1 })\n ConnectionManager.addConnectionInstance(connection, {\n readModBus: async function (objectType, address, quantity, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'descrete input':\n response = await client.readDiscreteInputs(address, quantity)\n break\n case 'input register':\n response = await client.readInputRegisters(address, quantity)\n break\n case 'holding register':\n response = await client.readHoldingRegisters(address, quantity)\n break\n default:\n response = await client.readCoils(address, quantity)\n }\n\n var data = response && response.response._body.valuesAsArray.slice(0, quantity)\n logger.info(`${JSON.stringify(data)}`)\n return {\n data\n }\n })\n },\n writeSingleModBus: async function (objectType, address, value, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'holding register':\n await client.writeSingleRegister(address, parseInt(value))\n response = await client.readHoldingRegisters(address, 1)\n break\n default:\n await client.writeSingleCoil(address, !!Number(value))\n response = await client.readCoils(address, 1)\n }\n\n var data = response && response.response._body.valuesAsArray[0]\n logger.info(data)\n return {\n data\n }\n })\n },\n close: function () {\n queue.clear()\n keepalive = false\n promiseSocket.destroy()\n }\n })\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (ex) {\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) failed to connect`)\n throw ex\n }\n }\n\n async disconnect(connection: Connection) {\n var { close } = ConnectionManager.removeConnectionInstance(connection)\n close()\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'checkbox',\n name: 'keepalive',\n label: 'keepalive',\n property: {\n value: 'checked'\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['modbus']\n }\n\n get help() {\n return 'integration/connector/modbus-tcp'\n }\n}\n\nConnectionManager.registerConnector('modbus-tcp', new ModbusTCPConnector())\n"]}
|
|
1
|
+
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import * as modbus from 'jsmodbus'\nimport { Socket } from 'net'\nimport PQueue from 'p-queue'\nimport PromiseSocket from 'promise-socket'\n\nimport { Connection, ConnectionManager, Connector } from '@things-factory/integration-base'\nimport { sleep } from '@things-factory/utils'\n\nconst debug = require('debug')('things-factory:modbus-tcp-connector')\n\nexport class ModbusTCPConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('modbus-tcp connections are ready')\n }\n\n // async checkConnectionInstance(domain, connectionName): Promise<boolean> {\n // try {\n // const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n // return !!(connection?.client?.connectionState !== 'online')\n // } catch (e) {\n // return false\n // }\n // }\n\n async connect(connection) {\n var [host, port = 502] = connection.endpoint.split(':')\n var {\n params: { keepalive = true }\n } = connection\n\n try {\n /*\n try to keep connecting if keepalive is true\n */\n var clientIdx = 1\n var connected: boolean = false\n var looped: boolean = true\n while (true) {\n var clientSocket = new Socket()\n clientSocket = new Socket()\n var promiseSocket = new PromiseSocket(clientSocket)\n\n var client = new modbus.client.TCP(clientSocket, clientIdx++, 10000)\n\n clientSocket.on('error', async ex => {\n debug(ex)\n ConnectionManager.logger.error(`modbus tcp connection error: ${ex}`)\n })\n\n clientSocket.on('close', async () => {\n debug(`modbus tcp connection closed`)\n if (keepalive && !looped) {\n await this.disconnect(connection)\n await this.connect(connection)\n }\n })\n\n debug(`connecting to ${connection.endpoint}...`)\n\n looped = true\n await promiseSocket\n .connect(port, host)\n .then(() => {\n connected = true\n })\n .catch(ex => {\n promiseSocket && promiseSocket.destroy()\n })\n\n // if the current connections have the connection with the same name, the current try should be stopped.\n if (!keepalive || connected) {\n looped = false\n break\n }\n\n await sleep(1000)\n }\n\n var queue = new PQueue({ concurrency: 1 })\n ConnectionManager.addConnectionInstance(connection, {\n readModBus: async function (objectType, address, quantity, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'descrete input':\n response = await client.readDiscreteInputs(address, quantity)\n break\n case 'input register':\n response = await client.readInputRegisters(address, quantity)\n break\n case 'holding register':\n response = await client.readHoldingRegisters(address, quantity)\n break\n default:\n response = await client.readCoils(address, quantity)\n }\n\n var data = response && response.response._body.valuesAsArray.slice(0, quantity)\n logger.info(`${JSON.stringify(data)}`)\n return {\n data\n }\n })\n },\n writeSingleModBus: async function (objectType, address, value, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'holding register':\n await client.writeSingleRegister(address, parseInt(value))\n response = await client.readHoldingRegisters(address, 1)\n break\n default:\n await client.writeSingleCoil(address, !!Number(value))\n response = await client.readCoils(address, 1)\n }\n\n var data = response && response.response._body.valuesAsArray[0]\n logger.info(data)\n return {\n data\n }\n })\n },\n close: function () {\n queue.clear()\n keepalive = false\n promiseSocket.destroy()\n }\n })\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (ex) {\n ConnectionManager.logger.info(\n `modbus-tcp connection(${connection.name}:${connection.endpoint}) failed to connect`\n )\n throw ex\n }\n }\n\n async disconnect(connection: Connection) {\n var { close } = ConnectionManager.removeConnectionInstance(connection)\n close()\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'checkbox',\n name: 'keepalive',\n label: 'keepalive',\n property: {\n value: 'checked'\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['modbus']\n }\n\n get help() {\n return 'integration/connector/modbus-tcp'\n }\n}\n\nConnectionManager.registerConnector('modbus-tcp', new ModbusTCPConnector())\n"]}
|
|
@@ -5,7 +5,7 @@ const integration_base_1 = require("@things-factory/integration-base");
|
|
|
5
5
|
const debug = require('debug')('things-factory:modbus-read');
|
|
6
6
|
async function modbusRead(step, { logger, domain, data }) {
|
|
7
7
|
var { connection, params: { objectType = 'coil', address, quantity = 1, accessorAddress } } = step;
|
|
8
|
-
var connectionInstance = integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connection);
|
|
8
|
+
var connectionInstance = await integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connection);
|
|
9
9
|
if (!connectionInstance) {
|
|
10
10
|
debug(`no connection : ${connection}`);
|
|
11
11
|
throw new Error(`no connection : ${connection}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modbus-read.js","sourceRoot":"","sources":["../../../server/engine/task/modbus-read.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,uEAAkF;AAElF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,CAAA;AAE5D,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IACtD,IAAI,EACF,UAAU,EACV,MAAM,EAAE,EAAE,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,eAAe,EAAE,EACxE,GAAG,IAAI,CAAA;IAER,IAAI,kBAAkB,GAAG,oCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"modbus-read.js","sourceRoot":"","sources":["../../../server/engine/task/modbus-read.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,uEAAkF;AAElF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,CAAA;AAE5D,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IACtD,IAAI,EACF,UAAU,EACV,MAAM,EAAE,EAAE,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,eAAe,EAAE,EACxE,GAAG,IAAI,CAAA;IAER,IAAI,kBAAkB,GAAG,MAAM,oCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAChG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;QACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAA,cAAM,EAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACnE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;QAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAA;IACvC,IAAI,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACzE,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,UAAU,CAAC,aAAa,GAAG;IACzB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC;SAC9E;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;KACjB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,kBAAkB;KAC1B;CACF,CAAA;AAED,UAAU,CAAC,IAAI,GAAG,8BAA8B,CAAA;AAEhD,+BAAY,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { ConnectionManager, TaskRegistry } from '@things-factory/integration-base'\n\nconst debug = require('debug')('things-factory:modbus-read')\n\nasync function modbusRead(step, { logger, domain, data }) {\n var {\n connection,\n params: { objectType = 'coil', address, quantity = 1, accessorAddress }\n } = step\n\n var connectionInstance = await ConnectionManager.getConnectionInstanceByName(domain, connection)\n if (!connectionInstance) {\n debug(`no connection : ${connection}`)\n throw new Error(`no connection : ${connection}`)\n }\n\n address = accessorAddress ? access(accessorAddress, data) : address\n if (isNaN(address)) {\n debug(`invalid number address : ${address}`)\n throw new Error(`invalid number address : ${address}`)\n }\n\n var { readModBus } = connectionInstance\n var content = await readModBus(objectType, address, quantity, { logger })\n debug(`result : ${JSON.stringify(content)}`)\n return content\n}\n\nmodbusRead.parameterSpec = [\n {\n type: 'select',\n name: 'objectType',\n label: 'object-type',\n property: {\n options: ['', 'coil', 'descrete input', 'input register', 'holding register']\n }\n },\n {\n type: 'number',\n name: 'address',\n label: 'address'\n },\n {\n type: 'number',\n name: 'quantity',\n label: 'quantity'\n },\n {\n type: 'scenario-step-input',\n name: 'accessorAddress',\n label: 'accessor-address'\n }\n]\n\nmodbusRead.help = 'integration/task/modbus-read'\n\nTaskRegistry.registerTaskHandler('modbus-read', modbusRead)\n"]}
|
|
@@ -5,7 +5,7 @@ const integration_base_1 = require("@things-factory/integration-base");
|
|
|
5
5
|
const debug = require('debug')('things-factory:modbus-write-single');
|
|
6
6
|
async function modbusWriteSingle(step, { logger, domain, data }) {
|
|
7
7
|
var { connection, params: { objectType = 'coil', accessorAddress, address, accessor, value } } = step;
|
|
8
|
-
var connectionInstance = integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connection);
|
|
8
|
+
var connectionInstance = await integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connection);
|
|
9
9
|
if (!connectionInstance) {
|
|
10
10
|
debug(`no connection : ${connection}`);
|
|
11
11
|
throw new Error(`no connection : ${connection}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modbus-write-single.js","sourceRoot":"","sources":["../../../server/engine/task/modbus-write-single.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,uEAAkF;AAElF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oCAAoC,CAAC,CAAA;AAEpE,KAAK,UAAU,iBAAiB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7D,IAAI,EACF,UAAU,EACV,MAAM,EAAE,EAAE,UAAU,GAAG,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAC3E,GAAG,IAAI,CAAA;IAER,IAAI,kBAAkB,GAAG,oCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"modbus-write-single.js","sourceRoot":"","sources":["../../../server/engine/task/modbus-write-single.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,uEAAkF;AAElF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oCAAoC,CAAC,CAAA;AAEpE,KAAK,UAAU,iBAAiB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7D,IAAI,EACF,UAAU,EACV,MAAM,EAAE,EAAE,UAAU,GAAG,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAC3E,GAAG,IAAI,CAAA;IAER,IAAI,kBAAkB,GAAG,MAAM,oCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAChG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;QACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAA,cAAM,EAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACnE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;QAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,qDAAqD;IACrD,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACjD,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,CAAA;IAC9C,IAAI,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7E,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,iBAAiB,CAAC,aAAa,GAAG;IAChC;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC;SAC1C;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;KACjB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;KACf;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,kBAAkB;KAC1B;CACF,CAAA;AAED,iBAAiB,CAAC,IAAI,GAAG,sCAAsC,CAAA;AAE/D,+BAAY,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { ConnectionManager, TaskRegistry } from '@things-factory/integration-base'\n\nconst debug = require('debug')('things-factory:modbus-write-single')\n\nasync function modbusWriteSingle(step, { logger, domain, data }) {\n var {\n connection,\n params: { objectType = 'coil', accessorAddress, address, accessor, value }\n } = step\n\n var connectionInstance = await ConnectionManager.getConnectionInstanceByName(domain, connection)\n if (!connectionInstance) {\n debug(`no connection : ${connection}`)\n throw new Error(`no connection : ${connection}`)\n }\n\n address = accessorAddress ? access(accessorAddress, data) : address\n if (isNaN(address)) {\n debug(`invalid number address : ${address}`)\n throw new Error(`invalid number address : ${address}`)\n }\n\n // determine accessor or value as a input value value\n value = accessor ? access(accessor, data) : value\n if (isNaN(value)) {\n throw new Error(`invalid number value : ${value}`)\n }\n\n var { writeSingleModBus } = connectionInstance\n var content = await writeSingleModBus(objectType, address, value, { logger })\n return content\n}\n\nmodbusWriteSingle.parameterSpec = [\n {\n type: 'select',\n name: 'objectType',\n label: 'object-type',\n property: {\n options: ['', 'coil', 'holding register']\n }\n },\n {\n type: 'number',\n name: 'address',\n label: 'address'\n },\n {\n type: 'number',\n name: 'value',\n label: 'value'\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor-value'\n },\n {\n type: 'scenario-step-input',\n name: 'accessorAddress',\n label: 'accessor-address'\n }\n]\n\nmodbusWriteSingle.help = 'integration/task/modbus-write-single'\n\nTaskRegistry.registerTaskHandler('modbus-write-single', modbusWriteSingle)\n"]}
|