add mapper. add v2 handler. add tag description short and full versions. delete topic[1-5].

This commit is contained in:
Первов Артем
2026-06-10 01:44:31 +03:00
parent 926a01640b
commit 07eae3dfb4
14 changed files with 1165 additions and 99 deletions

View 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)
}