diff --git a/app/src/handlers/demo-modbus.ts b/app/src/handlers/demo-modbus.ts index 682e6a9..5f1ac11 100644 --- a/app/src/handlers/demo-modbus.ts +++ b/app/src/handlers/demo-modbus.ts @@ -27,7 +27,7 @@ function toMetrics(values: number[], timestamp: string): DemoModbusMetric[] { return values.map((value, index) => ({ edge: EDGE, timestamp, - tag: `${EDGE}.modbus.${index + 1}`, + tag: `register-${index}`, value, })) } @@ -42,11 +42,11 @@ async function postMetrics(metrics: DemoModbusMetric[]): Promise { } } - console.log('edge5.modbus.posted', { count: metrics.length }) + console.log(`${EDGE}.modbus.posted ${metrics.length} metrics`) } export const handleDemoModbus: TopicHandler = async (topic, payload) => { - console.log('edge5.modbus.received', { topic, bytes: payload.length }) + console.log(`${EDGE}.modbus.received ${topic} ${payload.length} bytes`) const values = parseValues(payload) const metrics = toMetrics(values, new Date().toISOString()) diff --git a/app/src/handlers/edge5i-modbus.ts b/app/src/handlers/edge5i-modbus.ts new file mode 100644 index 0000000..ced2861 --- /dev/null +++ b/app/src/handlers/edge5i-modbus.ts @@ -0,0 +1,54 @@ +import { postCloudIngest } from '../cloud-ingest.js' +import type { TopicHandler } from '../types.js' + +const EDGE = 'edge5i' +const REGISTER_COUNT = 100 + +type DemoModbusMetric = { + edge: string + timestamp: string + tag: string + value: number +} + +function parseValues(payload: Buffer): number[] { + const values = JSON.parse(payload.toString('utf8')) as number[] + assertRegisterCount(values) + return values +} + +function assertRegisterCount(values: number[]): void { + if (values.length !== REGISTER_COUNT) { + throw new Error(`Expected ${REGISTER_COUNT} modbus values, got ${values.length}`) + } +} + +function toMetrics(values: number[], timestamp: string): DemoModbusMetric[] { + return values.map((value, index) => ({ + edge: EDGE, + timestamp, + tag: `register-${index}`, + value, + })) +} + +async function postMetrics(metrics: DemoModbusMetric[]): Promise { + for (const metric of metrics) { + const response = await postCloudIngest(metric) + + if (!response.ok) { + const text = await response.text() + throw new Error(text) + } + } + + console.log(`${EDGE}.modbus.posted ${metrics.length} metrics`) +} + +export const handle: TopicHandler = async (topic, payload) => { + console.log(`${EDGE}.modbus.received ${topic} ${payload.length} bytes`) + + const values = parseValues(payload) + const metrics = toMetrics(values, new Date().toISOString()) + await postMetrics(metrics) +} diff --git a/app/src/handlers/index.ts b/app/src/handlers/index.ts index 1b943d3..f76f3e3 100644 --- a/app/src/handlers/index.ts +++ b/app/src/handlers/index.ts @@ -5,6 +5,8 @@ import { handleDemoModbus } from './demo-modbus.js' import { handleEdge5ModbusV2 } from './edge5-modbus-v2.js' import { handleEdge5Video } from './edge5-video.js' +import { handle as interpretation } from './edge5i-modbus.js' + const DEMO_PLC_TOPIC = 'data/demo/plc/v1' const DEMO_MODBUS_TOPIC = 'data/demo/modbus/v1' const EDGE5_MODBUS_TOPIC = 'data/edge5/modbus/v2' @@ -14,3 +16,5 @@ register(DEMO_PLC_TOPIC, handleDemoPlc) register(DEMO_MODBUS_TOPIC, handleDemoModbus) register(EDGE5_MODBUS_TOPIC, handleEdge5ModbusV2) register(EDGE5_VIDEO_TOPIC, handleEdge5Video) + +register('data/edge5i/modbus', interpretation); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..248dec6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "mqtt-ingest", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}