add mapper. add v2 handler. add tag description short and full versions. delete topic[1-5].
This commit is contained in:
71
app/src/handlers/edge5-modbus-v2.ts
Normal file
71
app/src/handlers/edge5-modbus-v2.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { createMetricMapper, type MappedMetric } from '../mapping.js'
|
||||
import type { TopicHandler } from '../types.js'
|
||||
|
||||
export const TOPIC = 'data/edge5/modbus/v2'
|
||||
|
||||
const mapper = createMetricMapper({
|
||||
filePath:
|
||||
process.env.EDGE5_MODBUS_V2_MAPPING_FILE ??
|
||||
new URL('../mappings/edge5-modbus.json', import.meta.url),
|
||||
})
|
||||
const REGISTER_COUNT = mapper.tagCount
|
||||
const postUrl =
|
||||
process.env.CLOUD_INGEST_URL ?? 'https://demo.backend.drill.greact.ru/ingest'
|
||||
|
||||
function parseValues(payload: Buffer): number[] {
|
||||
let value: unknown
|
||||
|
||||
try {
|
||||
value = JSON.parse(payload.toString('utf8')) as unknown
|
||||
} catch {
|
||||
throw new Error(`Expected JSON number[${REGISTER_COUNT}]`)
|
||||
}
|
||||
|
||||
if (
|
||||
Array.isArray(value) &&
|
||||
value.length === REGISTER_COUNT &&
|
||||
value.every((item) => typeof item === 'number' && Number.isFinite(item))
|
||||
) {
|
||||
return value
|
||||
}
|
||||
|
||||
throw new Error(`Expected JSON number[${REGISTER_COUNT}]`)
|
||||
}
|
||||
|
||||
async function postMetrics(metrics: MappedMetric[]): Promise<void> {
|
||||
const response = await fetch(postUrl, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'content-type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(metrics),
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text()
|
||||
console.error('edge5.modbus.v2.post_error', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
body: text.slice(0, 500),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
console.log('edge5.modbus.v2.posted', { count: metrics.length })
|
||||
}
|
||||
|
||||
export const handleEdge5ModbusV2: TopicHandler = async (topic, payload) => {
|
||||
console.log('edge5.modbus.v2.received', { topic, bytes: payload.length })
|
||||
|
||||
let values: number[]
|
||||
|
||||
try {
|
||||
values = parseValues(payload)
|
||||
} catch (err) {
|
||||
console.warn('edge5.modbus.v2.invalid_payload', { topic, err })
|
||||
return
|
||||
}
|
||||
|
||||
const metrics = mapper.mapValues(values, Date.now())
|
||||
await postMetrics(metrics)
|
||||
}
|
||||
Reference in New Issue
Block a user