UNPKG

@w2a-iiot/parsers

Version:
1,256 lines (1,255 loc) 457 kB
import * as v from "valibot"; //#region ../parsers/src/schemas/index.d.ts declare function createUplinkInputSchema(): v.ObjectSchema<{ /** * The uplink payload byte array, where each byte is represented by an integer between 0 and 255. */ readonly bytes: v.ArraySchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 255, undefined>, v.IntegerAction<number, undefined>]>, undefined>; /** * The uplink message LoRaWAN `fPort` */ readonly fPort: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 224, undefined>, v.IntegerAction<number, undefined>]>, undefined>; /** * ISO 8601 string representation of the time the message was received by the network server. */ readonly recvTime: v.OptionalSchema<v.StringSchema<undefined>, undefined>; }, "Uplink input should be an object with `bytes` and optional `fPort` and `recvTime` properties.">; declare function createHexUplinkInputSchema(): v.SchemaWithPipe<readonly [v.UnionSchema<[v.ObjectSchema<{ readonly bytes: v.SchemaWithPipe<readonly [v.StringSchema<undefined>]>; readonly fPort: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 255, undefined>, v.IntegerAction<number, undefined>]>, undefined>; readonly recvTime: v.OptionalSchema<v.StringSchema<undefined>, undefined>; }, undefined>, v.StringSchema<undefined>], undefined>, v.TransformAction<string | { bytes: string; fPort?: number | undefined; recvTime?: string | undefined; }, { bytes: string; fPort?: number | undefined; recvTime?: string | undefined; }>]>; type UplinkInput = v.InferOutput<ReturnType<typeof createUplinkInputSchema>>; type HexUplinkInput = v.InferOutput<ReturnType<typeof createHexUplinkInputSchema>>; //#endregion //#region ../parsers/src/types.d.ts interface GenericSuccessfulUplinkOutput { warnings?: string[]; data: object; errors?: never; } interface GenericUplinkOutputFailure { errors: string[]; warnings?: never; data?: never; } type DownlinkFrame = number[]; interface DownlinkOutputFailure { errors: string[]; warnings?: never; fPort?: never; bytes?: never; } interface MultipleDownlinkOutputFailure { errors: string[]; warnings?: never; fPort?: never; frames?: never; } type DownlinkOutput = { fPort: number; bytes: DownlinkFrame; warnings?: string[]; errors?: never; } | DownlinkOutputFailure; type MultipleDownlinkOutput = { fPort: number; frames: DownlinkFrame[]; warnings?: string[]; errors?: never; } | MultipleDownlinkOutputFailure; type GenericUplinkOutput<TData extends GenericSuccessfulUplinkOutput = GenericSuccessfulUplinkOutput> = TData | GenericUplinkOutputFailure; interface Range { start: number; end: number; } interface Channel$1<TName extends string = string> extends Range { adjustMeasurementRangeDisallowed?: true; name: TName; } //#endregion //#region ../parsers/src/codecs/codec.d.ts type Codec<TProtocol extends string, TCodecName extends string, TData extends GenericUplinkOutput, TChannelName extends string | never, TEncoder extends (((input: any) => DownlinkOutput) | undefined) = undefined, TMultipleEncoder extends (((input: any) => MultipleDownlinkOutput) | undefined) = undefined> = { name: TCodecName; protocol: TProtocol; adjustRoundingDecimals: (decimals: number) => void; adjustMeasuringRange: (name: TChannelName, range: { start: number; end: number; }) => void; getChannels: () => Channel$1[]; canTryDecode: (input: UplinkInput) => boolean; decode: (input: UplinkInput) => TData; } & (undefined extends TEncoder ? {} : { encode: TEncoder; }) & (undefined extends TMultipleEncoder ? {} : { encodeMultiple: TMultipleEncoder; }); type AnyCodec = (Codec<any, any, any, never, any, any> & { encode?: (input: any) => DownlinkOutput; encodeMultiple?: (input: any) => MultipleDownlinkOutput; }) | (Codec<any, any, never, any, any, any> & { encode?: (input: any) => DownlinkOutput; encodeMultiple?: (input: any) => MultipleDownlinkOutput; }); //#endregion //#region ../parsers/src/codecs/protocols.d.ts /** * TULIP2 protocol identifier. * Used for legacy devices with basic message handling (0x00-0x09 message types). */ declare const TULIP2_PROTOCOL: "TULIP2"; /** * TULIP3 protocol identifier. * Used for advanced devices with comprehensive sensor support (0x10-0x17 message types). */ declare const TULIP3_PROTOCOL: "TULIP3"; //#endregion //#region ../parsers/src/codecs/tulip2/index.d.ts interface TULIP2Channel extends Channel$1 { channelId: number; } type Encoder<TInput = any> = (input: TInput) => DownlinkOutput; type MultipleEncoder<TInput = any> = (input: TInput) => MultipleDownlinkOutput; type EncoderFactory<TInput = any> = (options: { getChannels: () => TULIP2Channel[]; }) => Encoder<TInput>; type MultipleEncoderFactory<TInput = any> = (options: { getChannels: () => TULIP2Channel[]; }) => MultipleEncoder<TInput>; type ReturnOfFactory<TFactory extends EncoderFactory<any> | MultipleEncoderFactory<any> | undefined> = TFactory extends ((...args: any[]) => infer TResult) ? TResult : undefined; type Handler<TChannels extends TULIP2Channel[] = TULIP2Channel[], TReturn extends GenericUplinkOutput = GenericUplinkOutput> = (input: UplinkInput, options: { roundingDecimals: number; channels: TChannels; }) => TReturn; interface MessageHandlers<TChannels extends TULIP2Channel[] = TULIP2Channel[], TReturn extends GenericUplinkOutput = GenericUplinkOutput> { 0x00?: Handler<TChannels, TReturn>; 0x01?: Handler<TChannels, TReturn>; 0x02?: Handler<TChannels, TReturn>; 0x03?: Handler<TChannels, TReturn>; 0x04?: Handler<TChannels, TReturn>; 0x05?: Handler<TChannels, TReturn>; 0x06?: Handler<TChannels, TReturn>; 0x07?: Handler<TChannels, TReturn>; 0x08?: Handler<TChannels, TReturn>; 0x09?: Handler<TChannels, TReturn>; 0x0A?: Handler<TChannels, TReturn>; 0x0B?: Handler<TChannels, TReturn>; 0x0C?: Handler<TChannels, TReturn>; 0x0D?: Handler<TChannels, TReturn>; } type ReturnTypeOfHandlers<TChannels extends TULIP2Channel[], THandlers extends MessageHandlers<TChannels, any>> = { [K in keyof THandlers]: THandlers[K] extends Handler<TChannels, infer TReturn> ? TReturn : never }[keyof THandlers]; type TULIP2AdjustableChannelNames<TChannels extends TULIP2Channel[]> = { [K in keyof TChannels]: TChannels[K] extends TULIP2Channel ? (TChannels[K]['adjustMeasurementRangeDisallowed'] extends true ? never : TChannels[K]['name']) : never }[number]; /** * Type alias for a TULIP2 codec with protocol identification. * Wrapper around base Codec type that fixes the protocol to TULIP2 and passes through all other type parameters. */ type TULIP2Codec<TChannels extends TULIP2Channel[], TName extends string, THandlers extends MessageHandlers<TChannels>, TEncoderFactory extends EncoderFactory<any> | undefined = undefined, TMultipleEncoderFactory extends MultipleEncoderFactory<any> | undefined = undefined> = Codec<typeof TULIP2_PROTOCOL, `${TName}TULIP2`, ReturnTypeOfHandlers<TChannels, THandlers>, TULIP2AdjustableChannelNames<TChannels>, ReturnOfFactory<TEncoderFactory>, ReturnOfFactory<TMultipleEncoderFactory>>; //#endregion //#region ../parsers/src/devices/A2G/parser/index.d.ts declare function useParser(): { adjustRoundingDecimals: (decimals: number) => void; adjustMeasuringRange: (channel: never, range: { start: number; end: number; }) => void; decodeUplink: (input: UplinkInput) => GenericUplinkOutput<ReturnTypeOfHandlers<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { 1: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 1; measurement: { channels: [{ channelId: 0; channelName: "pressure"; value: number; }] | [{ channelId: 0; channelName: "pressure"; value: number; }, { channelId: 1; channelName: "flow"; value: number; }, { channelId: 2; channelName: "input_1"; value: number; }, { channelId: 3; channelName: "input_2"; value: number; }, { channelId: 4; channelName: "input_3"; value: number; }, { channelId: 5; channelName: "input_4"; value: number; }, { channelId: 6; channelName: "relay_status_1"; value: number; }, { channelId: 7; channelName: "relay_status_2"; value: number; }]; }; }; warnings?: string[] | undefined; }>; 4: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 4; technicalAlarms: { TemperatureInput4SignalOverload: boolean; TemperatureInput3SignalOverload: boolean; VoltageInput2SignalOverload: boolean; VoltageInput1SignalOverload: boolean; ModbusCommunicationError: boolean; AnalogOutput2SignalOverload: boolean; AnalogOutput1SignalOverload: boolean; PressureSignalOverload: boolean; }; }; warnings?: string[] | undefined; }>; 5: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 5; deviceAlarms: { ADCConverterError: boolean; PressureSensorNoResponseError: boolean; PressureSensorTimeoutError: boolean; FactoryOptionsWriteError: boolean; FactoryOptionsDeleteError: boolean; InvalidFactoryOptionsError: boolean; UserSettingsInvalidError: boolean; UserSettingsReadWriteError: boolean; ZeroOffsetOverRangeError: boolean; InvalidSignalSourceSpecifiedError: boolean; AnalogOutput2OverTemperatureError: boolean; AnalogOutput2LoadFaultError: boolean; AnalogOutput2OverRangeError: boolean; AnalogOutput1OverTemperatureError: boolean; AnalogOutput1LoadFaultError: boolean; AnalogOutput1OverRangeError: boolean; }; }; warnings?: string[] | undefined; }>; 7: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 7; deviceInformation: { productId: 13; productIdName: "A2G"; productSubId: number; productSubIdName: "LoRaWAN" | "MIOTY" | "Unknown"; sensorFirmwareVersion: string; sensorHardwareVersion: string; hardwareAssemblyTypeId: number; hardwareAssemblyTypeName: "A2G HE0 Full Assembly" | "A2G HE1 1AO Assembly" | "A2G HE2 Modbus Assembly" | "A2G HE3 Modular Assembly" | "A2G LC1 LC1VAO" | "A2G LC2 CT" | "A2G LC3 BAT"; serialNumber: string; channelConfigurations: [{ measurand: 3; measurandName: "Pressure (gauge)" | "Pressure (absolute)" | "Pressure (differential)"; measurementRangeStart: number; measurementRangeEnd: number; unit: 1 | 2 | 3 | 4 | 5; unitName: "mbar" | "Pa" | "kPa" | "mmWC" | "inWC"; }] | [{ measurand: 3; measurandName: "Pressure (gauge)" | "Pressure (absolute)" | "Pressure (differential)"; measurementRangeStart: number; measurementRangeEnd: number; unit: 1 | 2 | 3 | 4 | 5; unitName: "mbar" | "Pa" | "kPa" | "mmWC" | "inWC"; }, { measurand: 6; measurandName: "Flow (vol.)" | "Flow (mass)"; unit: 10 | 11 | 12 | 13 | 14 | 15; unitName: "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 70; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 71; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 72; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 73; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }]; }; }; warnings?: string[] | undefined; }>; 8: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 8; deviceStatistic: { batteryLevelNewEvent: boolean; batteryLevelPercent: number; }; }; warnings?: string[] | undefined; }>; }>>; decodeHexUplink: (input: HexUplinkInput) => GenericUplinkOutput<ReturnTypeOfHandlers<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { 1: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 1; measurement: { channels: [{ channelId: 0; channelName: "pressure"; value: number; }] | [{ channelId: 0; channelName: "pressure"; value: number; }, { channelId: 1; channelName: "flow"; value: number; }, { channelId: 2; channelName: "input_1"; value: number; }, { channelId: 3; channelName: "input_2"; value: number; }, { channelId: 4; channelName: "input_3"; value: number; }, { channelId: 5; channelName: "input_4"; value: number; }, { channelId: 6; channelName: "relay_status_1"; value: number; }, { channelId: 7; channelName: "relay_status_2"; value: number; }]; }; }; warnings?: string[] | undefined; }>; 4: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 4; technicalAlarms: { TemperatureInput4SignalOverload: boolean; TemperatureInput3SignalOverload: boolean; VoltageInput2SignalOverload: boolean; VoltageInput1SignalOverload: boolean; ModbusCommunicationError: boolean; AnalogOutput2SignalOverload: boolean; AnalogOutput1SignalOverload: boolean; PressureSignalOverload: boolean; }; }; warnings?: string[] | undefined; }>; 5: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 5; deviceAlarms: { ADCConverterError: boolean; PressureSensorNoResponseError: boolean; PressureSensorTimeoutError: boolean; FactoryOptionsWriteError: boolean; FactoryOptionsDeleteError: boolean; InvalidFactoryOptionsError: boolean; UserSettingsInvalidError: boolean; UserSettingsReadWriteError: boolean; ZeroOffsetOverRangeError: boolean; InvalidSignalSourceSpecifiedError: boolean; AnalogOutput2OverTemperatureError: boolean; AnalogOutput2LoadFaultError: boolean; AnalogOutput2OverRangeError: boolean; AnalogOutput1OverTemperatureError: boolean; AnalogOutput1LoadFaultError: boolean; AnalogOutput1OverRangeError: boolean; }; }; warnings?: string[] | undefined; }>; 7: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 7; deviceInformation: { productId: 13; productIdName: "A2G"; productSubId: number; productSubIdName: "LoRaWAN" | "MIOTY" | "Unknown"; sensorFirmwareVersion: string; sensorHardwareVersion: string; hardwareAssemblyTypeId: number; hardwareAssemblyTypeName: "A2G HE0 Full Assembly" | "A2G HE1 1AO Assembly" | "A2G HE2 Modbus Assembly" | "A2G HE3 Modular Assembly" | "A2G LC1 LC1VAO" | "A2G LC2 CT" | "A2G LC3 BAT"; serialNumber: string; channelConfigurations: [{ measurand: 3; measurandName: "Pressure (gauge)" | "Pressure (absolute)" | "Pressure (differential)"; measurementRangeStart: number; measurementRangeEnd: number; unit: 1 | 2 | 3 | 4 | 5; unitName: "mbar" | "Pa" | "kPa" | "mmWC" | "inWC"; }] | [{ measurand: 3; measurandName: "Pressure (gauge)" | "Pressure (absolute)" | "Pressure (differential)"; measurementRangeStart: number; measurementRangeEnd: number; unit: 1 | 2 | 3 | 4 | 5; unitName: "mbar" | "Pa" | "kPa" | "mmWC" | "inWC"; }, { measurand: 6; measurandName: "Flow (vol.)" | "Flow (mass)"; unit: 10 | 11 | 12 | 13 | 14 | 15; unitName: "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 70; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 71; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 72; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }, { measurand: 73; measurandName: "Input 1" | "Input 2" | "Input 3" | "Input 4"; unit: 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 22 | 31 | 32 | 21 | 23 | 24 | 45 | 46 | 30 | 40 | 41; unitName: "°C" | "°F" | "mbar" | "Pa" | "kPa" | "V" | "ppm" | "mmWC" | "inWC" | "[m³/s] cubic metre per second" | "[m³/h] cubic metre per hour (cbm/h)" | "[l/s] litre per second" | "[cfm] cubic feet per minute" | "[m/s]" | "[ft/min]" | "None" | "% rH" | "[g/m³]" | "[g/ft³]" | "[kJ/kg]" | "[BTU/lb]" | "normalized" | "[%] percent" | "bin"; measurementRangeStart?: number | undefined; measurementRangeEnd?: number | undefined; }]; }; }; warnings?: string[] | undefined; }>; 8: Handler<[{ readonly channelId: 0; readonly name: "pressure"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 1; readonly name: "flow"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 2; readonly name: "input_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 3; readonly name: "input_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 4; readonly name: "input_3"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 5; readonly name: "input_4"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 6; readonly name: "relay_status_1"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }, { readonly channelId: 7; readonly name: "relay_status_2"; readonly start: number; readonly end: number; readonly adjustMeasurementRangeDisallowed: true; }], { data: { configurationId: number; messageType: 8; deviceStatistic: { batteryLevelNewEvent: boolean; batteryLevelPercent: number; }; }; warnings?: string[] | undefined; }>; }>>; }; //#endregion //#region ../parsers/src/schemas/tulip2/downlink.d.ts interface Tulip2EncodeFeatureFlags { /** * Maximum allowed configurationId value for actions that include configurationId. * Used by the generated action schema validators. */ maxConfigId: number; /** * Enables `startUpTime` on per-channel configuration object schemas. * If omitted/false, `startUpTime` is not accepted. */ channelsStartupTime?: boolean; /** * Enables `measureOffset` on per-channel configuration object schemas. * If omitted/false, `measureOffset` is not accepted. */ channelsMeasureOffset?: boolean; /** * Enables `isBLEEnabled` in mainConfiguration schema. */ mainConfigBLE?: boolean; /** * Switches mainConfiguration from dual measuring rates * (`measuringRateWhenNoAlarm` + `measuringRateWhenAlarm`) * to single `measuringRate`. */ mainConfigSingleMeasuringRate?: boolean; /** * Channel keys that must be boolean-only in configuration actions. * * Example: `['channel1']` * - `channel1: true | false` is allowed * - `channel1: { alarms: ... }` is rejected by schema * * This also affects TypeScript output types (`TULIP2ConfigurationAction`) so * listed channels are inferred as `true | false` only, while other channels * still allow full channel configuration objects. */ channelsBooleanOnly?: readonly [`channel${number}`, ...`channel${number}`[]]; } interface Tulip2DownlinkSpanLimitFactors { /** * The maximum span factor for the dead band, meaning that the allowed dead band will be at most span * this factor. * Default is 1 (100%). * Only set if the dead band range is restricted to a smaller range than the full span, e.g. 10% of the span would be a factor of 0.1. */ deadBandMaxSpanFactor?: number; /** * The maximum span factor for the slope, meaning that the allowed slope will be at most span * this factor. * Default is 1 (100%). * Only set if the slope range is restricted to a smaller range than the full span, e.g. 10% of the span would be a factor of 0.1. */ slopeMaxSpanFactor?: number; /** * The minimum span factor for the measure offset, meaning that the allowed measure offset will be at least +/- span * this factor. * Default is 1 (100%). * Only set if the offset range is restricted to a smaller range than the full span, e.g. +/- 5% of the span would be a factor of 0.05. */ measureOffsetMinSpanFactor?: number; /** * The maximum span factor for the measure offset, meaning that the allowed measure offset will be at most +/- span * this factor. * Default is 1 (100%). * Only set if the offset range is restricted to a smaller range than the full span, e.g. +/- 5% of the span would be a factor of 0.05. */ measureOffsetMaxSpanFactor?: number; } declare function createConfigurationIdSchema(maxConfigId: number): v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<"configurationId needs to be a number">, v.MinValueAction<number, 1, "configurationId needs to be at least 1">, v.MaxValueAction<number, number, `configurationId needs to be at most ${number}`>, v.IntegerAction<number, "configurationId needs to be an integer">]>, undefined>; declare function createByteLimitSchema(): v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.IntegerAction<number, undefined>]>, undefined>; type TULIP2BaseActionEntries<TAction extends string, TObjectExtension extends v.ObjectEntries> = { deviceAction: v.LiteralSchema<TAction, undefined>; } & TObjectExtension; type TULIP2ActionEntriesWithConfigurationId<TAction extends string, TObjectExtension extends v.ObjectEntries> = TULIP2BaseActionEntries<TAction, TObjectExtension> & { configurationId: ReturnType<typeof createConfigurationIdSchema>; }; type TULIP2ActionEntriesWithByteLimit<TAction extends string, TObjectExtension extends v.ObjectEntries> = TULIP2BaseActionEntries<TAction, TObjectExtension> & { byteLimit: ReturnType<typeof createByteLimitSchema>; }; type TULIP2ActionEntriesWithConfigurationIdAndByteLimit<TAction extends string, TObjectExtension extends v.ObjectEntries> = TULIP2ActionEntriesWithConfigurationId<TAction, TObjectExtension> & TULIP2ActionEntriesWithByteLimit<TAction, TObjectExtension>; type Tulip2DownlinkMainConfigBase = v.ObjectSchema<{ publicationFactorWhenAlarm: v.NumberSchema<undefined>; publicationFactorWhenNoAlarm: v.NumberSchema<undefined>; measuringRateWhenNoAlarm: v.NumberSchema<undefined>; measuringRateWhenAlarm: v.NumberSchema<undefined>; }, undefined>; type Tulip2DownlinkMainConfigWithBLE = v.ObjectSchema<{ publicationFactorWhenAlarm: v.NumberSchema<undefined>; publicationFactorWhenNoAlarm: v.NumberSchema<undefined>; isBLEEnabled: v.BooleanSchema<undefined>; measuringRateWhenNoAlarm: v.NumberSchema<undefined>; measuringRateWhenAlarm: v.NumberSchema<undefined>; }, undefined>; type Tulip2DownlinkMainConfigSingleRate = v.ObjectSchema<{ publicationFactorWhenAlarm: v.NumberSchema<undefined>; publicationFactorWhenNoAlarm: v.NumberSchema<undefined>; measuringRate: v.NumberSchema<undefined>; }, undefined>; type Tulip2DownlinkMainConfigWithBLEAndSingleRate = v.ObjectSchema<{ publicationFactorWhenAlarm: v.NumberSchema<undefined>; publicationFactorWhenNoAlarm: v.NumberSchema<undefined>; isBLEEnabled: v.BooleanSchema<undefined>; measuringRate: v.NumberSchema<undefined>; }, undefined>; type Tulip2DownlinkMainConfiguration<TFeatureFlags extends Tulip2EncodeFeatureFlags> = TFeatureFlags['mainConfigBLE'] extends true ? TFeatureFlags['mainConfigSingleMeasuringRate'] extends true ? Tulip2DownlinkMainConfigWithBLEAndSingleRate : Tulip2DownlinkMainConfigWithBLE : TFeatureFlags['mainConfigSingleMeasuringRate'] extends true ? Tulip2DownlinkMainConfigSingleRate : Tulip2DownlinkMainConfigBase; type Tulip2DownlinkChannelSchemaBase = v.ObjectSchema<{ alarms: v.OptionalSchema<v.ObjectSchema<{ deadBand: v.NumberSchema<undefined>; lowThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; highThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; lowThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; highThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; risingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; fallingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>, undefined>; }, undefined>; type Tulip2DownlinkChannelSchemaWithStartup = v.ObjectSchema<{ alarms: v.OptionalSchema<v.ObjectSchema<{ deadBand: v.NumberSchema<undefined>; lowThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; highThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; lowThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; highThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; risingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; fallingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>, undefined>; startUpTime: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>; type Tulip2DownlinkChannelSchemaWithOffset = v.ObjectSchema<{ alarms: v.OptionalSchema<v.ObjectSchema<{ deadBand: v.NumberSchema<undefined>; lowThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; highThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; lowThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; highThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; risingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; fallingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>, undefined>; measureOffset: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>; type Tulip2DownlinkChannelSchemaWithBoth = v.ObjectSchema<{ alarms: v.OptionalSchema<v.ObjectSchema<{ deadBand: v.NumberSchema<undefined>; lowThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; highThreshold: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; lowThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; highThresholdWithDelay: v.OptionalSchema<v.ObjectSchema<{ value: v.NumberSchema<undefined>; delay: v.NumberSchema<undefined>; }, undefined>, undefined>; risingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; fallingSlope: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>, undefined>; startUpTime: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; measureOffset: v.OptionalSchema<v.NumberSchema<undefined>, undefined>; }, undefined>; type Tulip2DownlinkChannelSchema<TFeatureFlags extends Tulip2EncodeFeatureFlags> = TFeatureFl