@w2a-iiot/parsers
Version:
WIKA JavaScript parsers
1,256 lines (1,255 loc) • 457 kB
text/typescript
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