@w2a-iiot/raw-javascript-parsers
Version:
This packages contain the raw built javascript parsers for WIKA's IIoT devices.
2 lines • 140 kB
JavaScript
var __commonJSMin=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);function _typeof(e){"@babel/helpers - typeof";return _typeof=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},_typeof(e)}function toPrimitive(e,n){if(_typeof(e)!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,n||`default`);if(_typeof(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(e)}function toPropertyKey(e){var r=toPrimitive(e,`string`);return _typeof(r)==`symbol`?r:r+``}function _defineProperty(e,t,n){return(t=toPropertyKey(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?ownKeys(Object(n),!0).forEach(function(t){_defineProperty(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function getGlobalConfig(e){return{lang:e?.lang??void 0,message:e?.message,abortEarly:e?.abortEarly??void 0,abortPipeEarly:e?.abortPipeEarly??void 0}}function _stringify(e){var t;let n=typeof e;return n===`string`?`"${e}"`:n===`number`||n===`bigint`||n===`boolean`?`${e}`:n===`object`||n===`function`?(e&&((t=Object.getPrototypeOf(e))==null||(t=t.constructor)==null?void 0:t.name))??`null`:n}function _addIssue(e,t,n,r,i){let a=i&&`input`in i?i.input:n.value,o=i?.expected??e.expects??null,s=i?.received??_stringify(a),l={kind:e.kind,type:e.type,input:a,expected:o,received:s,message:`Invalid ${t}: ${o?`Expected ${o} but r`:`R`}eceived ${s}`,requirement:e.requirement,path:i?.path,issues:i?.issues,lang:r.lang,abortEarly:r.abortEarly,abortPipeEarly:r.abortPipeEarly},u=e.kind===`schema`,d=i?.message??e.message??(e.reference,l.lang,void 0)??(u?(l.lang,void 0):null)??r.message??(l.lang,void 0);d!==void 0&&(l.message=typeof d==`function`?d(l):d),u&&(n.typed=!1),n.issues?n.issues.push(l):n.issues=[l]}function _getStandardProps(e){return{version:1,vendor:`valibot`,validate(t){return e[`~run`]({value:t},getGlobalConfig())}}}function _joinExpects(e,t){let n=[...new Set(e)];return n.length>1?`(${n.join(` ${t} `)})`:n[0]??`never`}function getDotPath(e){if(e.path){let t=``;for(let n of e.path)if(typeof n.key==`string`||typeof n.key==`number`)t?t+=`.${n.key}`:t+=n.key;else return null;return t}return null}const HEXADECIMAL_REGEX=/^(?:0[hx])?[\da-fA-F]+$/u;function hexadecimal(e){return{kind:`validation`,type:`hexadecimal`,reference:hexadecimal,async:!1,expects:null,requirement:HEXADECIMAL_REGEX,message:e,"~run"(e,t){return e.typed&&!this.requirement.test(e.value)&&_addIssue(this,`hexadecimal`,e,t),e}}}function integer(e){return{kind:`validation`,type:`integer`,reference:integer,async:!1,expects:null,requirement:Number.isInteger,message:e,"~run"(e,t){return e.typed&&!this.requirement(e.value)&&_addIssue(this,`integer`,e,t),e}}}function maxValue(e,t){return{kind:`validation`,type:`max_value`,reference:maxValue,async:!1,expects:`<=${e instanceof Date?e.toJSON():_stringify(e)}`,requirement:e,message:t,"~run"(e,t){return e.typed&&!(e.value<=this.requirement)&&_addIssue(this,`value`,e,t,{received:e.value instanceof Date?e.value.toJSON():_stringify(e.value)}),e}}}function minValue(e,t){return{kind:`validation`,type:`min_value`,reference:minValue,async:!1,expects:`>=${e instanceof Date?e.toJSON():_stringify(e)}`,requirement:e,message:t,"~run"(e,t){return e.typed&&!(e.value>=this.requirement)&&_addIssue(this,`value`,e,t,{received:e.value instanceof Date?e.value.toJSON():_stringify(e.value)}),e}}}function transform(e){return{kind:`transformation`,type:`transform`,reference:transform,async:!1,operation:e,"~run"(e){return e.value=this.operation(e.value),e}}}function getFallback(e,t,n){return typeof e.fallback==`function`?e.fallback(t,n):e.fallback}function getDefault(e,t,n){return typeof e.default==`function`?e.default(t,n):e.default}function array(e,t){return{kind:`schema`,type:`array`,reference:array,expects:`Array`,async:!1,item:e,message:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){let n=e.value;if(Array.isArray(n)){e.typed=!0,e.value=[];for(let i=0;i<n.length;i++){let a=n[i],o=this.item[`~run`]({value:a},t);if(o.issues){let s={type:`array`,origin:`value`,input:n,key:i,value:a};for(let t of o.issues){var r;t.path?t.path.unshift(s):t.path=[s],(r=e.issues)==null||r.push(t)}if(e.issues||=o.issues,t.abortEarly){e.typed=!1;break}}o.typed||(e.typed=!1),e.value.push(o.value)}}else _addIssue(this,`type`,e,t);return e}}}function boolean(e){return{kind:`schema`,type:`boolean`,reference:boolean,expects:`boolean`,async:!1,message:e,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return typeof e.value==`boolean`?e.typed=!0:_addIssue(this,`type`,e,t),e}}}function literal(e,t){return{kind:`schema`,type:`literal`,reference:literal,expects:_stringify(e),async:!1,literal:e,message:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return e.value===this.literal?e.typed=!0:_addIssue(this,`type`,e,t),e}}}function number(e){return{kind:`schema`,type:`number`,reference:number,expects:`number`,async:!1,message:e,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return typeof e.value==`number`&&!isNaN(e.value)?e.typed=!0:_addIssue(this,`type`,e,t),e}}}function object(e,t){return{kind:`schema`,type:`object`,reference:object,expects:`Object`,async:!1,entries:e,message:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){let n=e.value;if(n&&typeof n==`object`){e.typed=!0,e.value={};for(let i in this.entries){let a=this.entries[i];if(i in n||(a.type===`exact_optional`||a.type===`optional`||a.type===`nullish`)&&a.default!==void 0){let o=i in n?n[i]:getDefault(a),s=a[`~run`]({value:o},t);if(s.issues){let a={type:`object`,origin:`value`,input:n,key:i,value:o};for(let t of s.issues){var r;t.path?t.path.unshift(a):t.path=[a],(r=e.issues)==null||r.push(t)}if(e.issues||=s.issues,t.abortEarly){e.typed=!1;break}}s.typed||(e.typed=!1),e.value[i]=s.value}else if(a.fallback!==void 0)e.value[i]=getFallback(a);else if(a.type!==`exact_optional`&&a.type!==`optional`&&a.type!==`nullish`&&(_addIssue(this,`key`,e,t,{input:void 0,expected:`"${i}"`,path:[{type:`object`,origin:`key`,input:n,key:i,value:n[i]}]}),t.abortEarly))break}}else _addIssue(this,`type`,e,t);return e}}}function optional(e,t){return{kind:`schema`,type:`optional`,reference:optional,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return e.value===void 0&&(this.default!==void 0&&(e.value=getDefault(this,e,t)),e.value===void 0)?(e.typed=!0,e):this.wrapped[`~run`](e,t)}}}function picklist(e,t){return{kind:`schema`,type:`picklist`,reference:picklist,expects:_joinExpects(e.map(_stringify),`|`),async:!1,options:e,message:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return this.options.includes(e.value)?e.typed=!0:_addIssue(this,`type`,e,t),e}}}function string(e){return{kind:`schema`,type:`string`,reference:string,expects:`string`,async:!1,message:e,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){return typeof e.value==`string`?e.typed=!0:_addIssue(this,`type`,e,t),e}}}function _subIssues(e){let t;if(e)for(let n of e)t?t.push(...n.issues):t=n.issues;return t}function union(e,t){return{kind:`schema`,type:`union`,reference:union,expects:_joinExpects(e.map(e=>e.expects),`|`),async:!1,options:e,message:t,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){let n,r,i;for(let a of this.options){let o=a[`~run`]({value:e.value},t);if(o.typed)if(o.issues)r?r.push(o):r=[o];else{n=o;break}else i?i.push(o):i=[o]}if(n)return n;if(r){if(r.length===1)return r[0];_addIssue(this,`type`,e,t,{issues:_subIssues(r)}),e.typed=!0}else if(i?.length===1)return i[0];else _addIssue(this,`type`,e,t,{issues:_subIssues(i)});return e}}}function variant(e,t,n){return{kind:`schema`,type:`variant`,reference:variant,expects:`Object`,async:!1,key:e,options:t,message:n,get"~standard"(){return _getStandardProps(this)},"~run"(e,t){let n=e.value;if(n&&typeof n==`object`){let r,i=0,a=this.key,o=[],s=(e,c)=>{for(let l of e.options){if(l.type===`variant`)s(l,new Set(c).add(l.key));else{let e=!0,s=0;for(let t of c){let r=l.entries[t];if(t in n?r[`~run`]({typed:!1,value:n[t]},{abortEarly:!0}).issues:r.type!==`exact_optional`&&r.type!==`optional`&&r.type!==`nullish`){e=!1,a!==t&&(i<s||i===s&&t in n&&!(a in n))&&(i=s,a=t,o=[]),a===t&&o.push(l.entries[t].expects);break}s++}if(e){let e=l[`~run`]({value:n},t);(!r||!r.typed&&e.typed)&&(r=e)}}if(r&&!r.issues)break}};if(s(this,new Set([this.key])),r)return r;_addIssue(this,`type`,e,t,{input:n[a],expected:_joinExpects(o,`|`),path:[{type:`object`,origin:`value`,input:n,key:a,value:n[a]}]})}else _addIssue(this,`type`,e,t);return e}}}function pipe(...e){return _objectSpread2(_objectSpread2({},e[0]),{},{pipe:e,get"~standard"(){return _getStandardProps(this)},"~run"(t,n){for(let r of e)if(r.kind!==`metadata`){if(t.issues&&(r.kind===`schema`||r.kind===`transformation`)){t.typed=!1;break}(!t.issues||!n.abortEarly&&!n.abortPipeEarly)&&(t=r[`~run`](t,n))}return t}})}function safeParse(e,t,n){let r=e[`~run`]({value:t},getGlobalConfig(n));return{typed:r.typed,success:!r.issues,output:r.value,issues:r.issues}}function summarize(e){let t=``;for(let n of e){t&&(t+=`
`),t+=`× ${n.message}`;let e=getDotPath(n);e&&(t+=`\n → at ${e}`)}return t}function checkChannelsValidity(e,t){let n=new Set;e.forEach(e=>{if(e.start>=e.end)throw t?Error(`Invalid channel range in codec ${t}: ${e.start} >= ${e.end} in channel ${e.name}`):Error(`Invalid channel range: ${e.start} >= ${e.end} in channel ${e.name}`);if(n.has(e.name))throw t?Error(`Duplicate channel name found in codec ${t}: ${e.name}`):Error(`Duplicate channel name found: ${e.name}`);n.add(e.name)})}function checkCodecsValidity(e){if(e.length===0)throw Error(`At least one codec must be provided`);e.forEach(e=>{checkChannelsValidity(e.getChannels(),e.name)}),e.forEach((t,n)=>{if(e.filter((e,t)=>t!==n).some(e=>e.name===t.name))throw Error(`Codec names must be unique. Duplicate found: ${t.name}`)});let t=e[0].getChannels().map(e=>e.name);e.forEach((e,n)=>{if(n===0)return;let r=e.getChannels().map(e=>e.name),i={missing:[],extra:[]};if(r.forEach(e=>{t.includes(e)||i.extra.push(e)}),t.forEach(e=>{r.includes(e)||i.missing.push(e)}),i.extra.length>0)throw Error(`Codec ${e.name} has extra channels not present in other codecs: ${i.extra.join(`, `)}`);if(i.missing.length>0)throw Error(`Codec ${e.name} is missing channels present in other codecs: ${i.missing.join(`, `)}`)});let n=new Map,r={};return e.forEach(e=>{e.getChannels().forEach(e=>{let t=[e.start,e.end],i=e.adjustMeasurementRangeDisallowed??!1;if(n.has(e.name)){let a=n.get(e.name);if(a[0]!==t[0]||a[1]!==t[1])throw Error(`Channel ${e.name} has inconsistent ranges across codecs: ${JSON.stringify(a)} vs ${JSON.stringify(t)}`);let o=r[e.name];if(o!==i)throw Error(`Channel ${e.name} has inconsistent adjustMeasurementRangeDisallowed settings across codecs: ${o} vs ${i}`)}else n.set(e.name,t),r[e.name]=i})}),r}function createFPortSchema(){return pipe(number(),minValue(1),maxValue(255),integer())}function createRecvTimeSchema(){return optional(string())}function createUplinkInputSchema(){return object({bytes:array(pipe(number(),minValue(0),maxValue(255),integer())),fPort:optional(pipe(number(),minValue(1),maxValue(224),integer())),recvTime:optional(string())},"Uplink input should be an object with `bytes` and optional `fPort` and `recvTime` properties.")}function createHexUplinkInputSchema(){return pipe(union([object({bytes:pipe(string()),fPort:optional(createFPortSchema()),recvTime:createRecvTimeSchema()}),string()]),transform(e=>typeof e==`string`?{bytes:e}:e))}function nstr(e,t={}){let{threshold:n=4,maxDecimals:r=10}=t;if(Number.isNaN(e))return`NaN`;if(!isFinite(e)||Number.isInteger(e))return e.toString();let i=e.toFixed(r),a=-1,o=``,s=i.indexOf(`.`),c=s>=0?s+1:i.length;for(let e=c;e<i.length;e++){let t=i[e];if(t===`0`||t===`9`){let r=1,s=e+1;for(;s<i.length&&i[s]===t;)r++,s++;if(r>=n){a=e,o=t;break}e=s-1}}if(a!==-1){let e=i.substring(0,a);if(o===`9`){let t=e,n=Number.parseFloat(t),r=t.indexOf(`.`),i=r>=0?t.length-r-1:0,a=10**-i,o=n<0?n-a:n+a;e=i>0?o.toFixed(i):o.toString()}let t=e.replace(/\.?0+$/,``);return t.endsWith(`.`)&&(t=t.slice(0,-1)),(t===`-0.`||t===`0.`||t===`-0`||t===`0`)&&(t=`0`),t}let l=i.replace(/\.?0+$/,``);return l.endsWith(`.`)&&(l=l.slice(0,-1)),(l===`-0.`||l===`0.`||l===`-0`||l===`0`)&&(l=`0`),l}function getRoundingDecimals(e,t){let n=t??4;return e===void 0||Number.isNaN(e)||e===-1/0?n:e===1/0?1/0:Math.floor(e)>=0?Math.floor(e):n}function hexStringToIntArray(e){let t=e.replaceAll(` `,``);t=t.startsWith(`0x`)?t.slice(2):t;let n=safeParse(pipe(string(),hexadecimal()),t);if(!n.success)return null;let r=[];for(let e=0;e<n.output.length;e+=2){let t=Number.parseInt(n.output.slice(e,e+2),16);r.push(t)}return r}function percentageToValue(e,t){if(t.start>=t.end)throw RangeError(`Range start must be less than range end`);return(t.end-t.start)*(e/100)+t.start}function TULIPValueToValue(e,t){return percentageToValue((e-2500)*100/1e4+0,t)}function slopeValueToValue(e,t){if(e<0||e>1e4)throw RangeError(`Slope value must be between 0 and 10_000, is ${e}`);let n=e/100,r=t.end-t.start;return n/100*r}function roundValue(e,t){if(t=typeof t==`number`?Math.min(Math.max(0,Math.floor(t)),100):void 0,Number.isInteger(e))return e;let n=nstr(e+5*2**-52,{maxDecimals:t});return n===``?0:Number.parseFloat(n)}function intTuple4ToFloat32(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,e[0]&255),n.setUint8(1,e[1]&255),n.setUint8(2,e[2]&255),n.setUint8(3,e[3]&255),n.getFloat32(0)}function intTuple4ToFloat32WithThreshold(e,t=3){t=Math.max(0,Math.floor(t));let n=intTuple4ToFloat32(e);return Number.parseFloat(nstr(n,{threshold:t}))}function defineParser(e){let{codecs:t,throwOnMultipleDecode:n=!0,parserName:r}=e,i=getRoundingDecimals(e.roundingDecimals),a=checkCodecsValidity(e.codecs);function o(e){return{errors:[s(e)]}}function s(e){return`${r} (JS): ${e}`}function c(e){let r;if(t.forEach(t=>{if(t.canTryDecode(e)){if(!r)r=t;else if(n)throw Error(`Message could not be uniquely decoded. Multiple codecs matched the input.`)}}),!r)throw Error(`Message could not be decoded. No codec matched the input.`);return r.decode(e)}function l(e){try{let t=safeParse(createUplinkInputSchema(),e);if(!t.success)throw Error(`Input is not a valid for decoding. Check your input data.`);let n=c(t.output);return n.warnings&&=n.warnings.map(s),n}catch(t){return t instanceof Error?o(t.message):o(`Unknown error occurred during decoding in parser ${r} with input ${JSON.stringify(e)}`)}}function u(e){let t=safeParse(createHexUplinkInputSchema(),e);if(!t.success)return o(`Input is not a valid for decoding. Check your input data.`);let n=hexStringToIntArray(t.output.bytes);return n?l({bytes:n,fPort:t.output.fPort,recvTime:t.output.recvTime}):o(`Input bytes is not a valid hexadecimal string.`)}function d(e){try{let n=t.find(t=>t.protocol===e.protocol);if(!n)throw Error(`Codec with protocol ${e.protocol} not found in parser. Available protocols: ${t.map(e=>e.protocol).join(`, `)}`);if(!(`encode`in n))throw Error(`Codec with protocol ${e.protocol} does not support encoding. Input could not be encoded.`);return n.encode(e.input)}catch(t){return t instanceof Error?o(t.message):o(`Unknown error occurred during encoding in parser ${r} with input ${JSON.stringify(e)}`)}}function f(e){try{let n=t.find(t=>t.protocol===e.protocol);if(!n)throw Error(`Codec with protocol ${e.protocol} not found in parser. Available protocols: ${t.map(e=>e.protocol).join(`, `)}`);if(!(`encodeMultiple`in n))throw Error(`Codec with protocol ${e.protocol} does not support multiple encoding. Input could not be encoded.`);return n.encodeMultiple(e.input)}catch(t){return t instanceof Error?o(t.message):o(`Unknown error occurred during multiple encoding in parser ${r} with input ${JSON.stringify(e)}`)}}return{decodeUplink:l,decodeHexUplink:u,encodeDownlink:d,encodeMultipleDownlinks:f,adjustMeasuringRange:(e,n)=>{if(!(e in a))throw Error(`Channel ${e} does not exist in parser ${r}. Cannot adjust measuring range.`);if(a[e])throw Error(`Channel ${e} does not allow adjusting the measuring range in parser ${r}.`);t.forEach(t=>{t.adjustMeasuringRange(e,n)})},adjustRoundingDecimals:e=>{let n=getRoundingDecimals(e,i);t.forEach(e=>{e.adjustRoundingDecimals(n)})}}}function defineTULIP2Codec(e){let t=`${e.deviceName}TULIP2`,n=getRoundingDecimals(e.roundingDecimals);checkChannelsValidity(e.channels),e.channels.forEach((e,n,r)=>{let i=r.find((t,r)=>t.channelId===e.channelId&&r!==n);if(i)throw Error(`Duplicate channel ID found: ${e.channelId} for channels ${e.name} and ${i.name} in ${t} Codec`)});function r(t){let n=t.bytes[0];return typeof n==`number`&&n in e.handlers}function i(r){let i=r.bytes[0];if(typeof i!=`number`)throw TypeError(`Input must have at least one byte for ${t} Codec`);let a=e.handlers[i];if(a)return a(r,{roundingDecimals:n,channels:e.channels});throw TypeError(`No handler registered for byte ${i} in ${t} Codec`)}function a(){return e.channels.map(e=>_objectSpread2({end:e.end,name:e.name,start:e.start},e.adjustMeasurementRangeDisallowed?{adjustMeasurementRangeDisallowed:!0}:{}))}let s={name:t,protocol:`TULIP2`,getChannels:a,canTryDecode:r,decode:i,adjustMeasuringRange:(t,n)=>{let r=e.channels.find(e=>e.name===t);if(!r)throw Error(`Channel ${t} not found in ${e.deviceName}TULIP2 Codec`);r.start=n.start,r.end=n.end},adjustRoundingDecimals:e=>{n=getRoundingDecimals(e,n)}};return e.encoderFactory&&(s.encode=e.encoderFactory({getChannels:()=>e.channels})),e.multipleEncodeFactory&&(s.encodeMultiple=e.multipleEncodeFactory({getChannels:()=>e.channels})),s}function createConfigurationIdSchema(e){return optional(pipe(number(`configurationId needs to be a number`),minValue(1,`configurationId needs to be at least 1`),maxValue(e,`configurationId needs to be at most ${e}`),integer(`configurationId needs to be an integer`)))}function createByteLimitSchema(){return optional(pipe(number(),minValue(0),integer()))}function createGenericTULIP2DownlinkActionSchema(e){let t=e.meta?.configurationId??!0,n=e.meta?.byteLimit??!0,r=e.extension??{};return object(_objectSpread2(t&&n?{deviceAction:literal(e.action),configurationId:createConfigurationIdSchema(e.maxConfigId),byteLimit:createByteLimitSchema()}:t?{deviceAction:literal(e.action),configurationId:createConfigurationIdSchema(e.maxConfigId)}:n?{deviceAction:literal(e.action),byteLimit:createByteLimitSchema()}:{deviceAction:literal(e.action)},r))}function createTULIP2DownlinkActionSchemaFactory(e){return t=>createGenericTULIP2DownlinkActionSchema({action:t.action,maxConfigId:e,extension:t.extension,meta:t.meta})}function createTulip2DownlinkMainConfigurationSchema(e){let t={publicationFactorWhenAlarm:pipe(number(),minValue(1),maxValue(2880),integer()),publicationFactorWhenNoAlarm:pipe(number(),minValue(1),maxValue(2880),integer())};return e.mainConfigBLE&&Object.assign(t,{isBLEEnabled:boolean()}),e.mainConfigSingleMeasuringRate?Object.assign(t,{measuringRate:pipe(number(),minValue(60),maxValue(86400),integer())}):Object.assign(t,{measuringRateWhenNoAlarm:pipe(number(),minValue(60),maxValue(86400),integer()),measuringRateWhenAlarm:pipe(number(),minValue(60),maxValue(86400),integer())}),object(t)}function createTulip2DownlinkChannelSchema(e,t,n){let r=e.end-e.start,i=n?.deadBandMaxSpanFactor??1,a=n?.slopeMaxSpanFactor??1,o=n?.measureOffsetMinSpanFactor??1,s=n?.measureOffsetMaxSpanFactor??1,c={alarms:optional(object({deadBand:pipe(number(),minValue(0),maxValue(r*i),transform(e=>Math.round(e/r*100*100))),lowThreshold:optional(pipe(number(),minValue(e.start),maxValue(e.end),transform(t=>Math.round((t-e.start)/r*100*100+2500)))),highThreshold:optional(pipe(number(),minValue(e.start),maxValue(e.end),transform(t=>Math.round((t-e.start)/r*100*100+2500)))),lowThresholdWithDelay:optional(object({value:pipe(number(),minValue(e.start),maxValue(e.end),transform(t=>Math.round((t-e.start)/r*100*100+2500))),delay:pipe(number(),minValue(0),maxValue(65535),integer())})),highThresholdWithDelay:optional(object({value:pipe(number(),minValue(e.start),maxValue(e.end),transform(t=>Math.round((t-e.start)/r*100*100+2500))),delay:pipe(number(),minValue(0),maxValue(65535),integer())})),risingSlope:optional(pipe(number(),minValue(0),maxValue(r*a),transform(e=>Math.round(e/r*100*100)))),fallingSlope:optional(pipe(number(),minValue(0),maxValue(r*a),transform(e=>Math.round(e/r*100*100))))}))};return t.channelsStartupTime&&Object.assign(c,{startUpTime:optional(pipe(number(),minValue(.1),maxValue(15),transform(e=>Math.round(e*10))))}),t.channelsMeasureOffset&&Object.assign(c,{measureOffset:optional(pipe(number(),minValue(-o*r),maxValue(s*r),transform(e=>Math.round(e/r*100*100))))}),object(c)}function createTULIP2DownlinkConfigurationActionSchema(e,t,n){let r=createTULIP2DownlinkActionSchemaFactory(t.maxConfigId),i=new Set(t.channelsBooleanOnly??[]),a=e.reduce((e,r)=>{let a=`channel${r.channelId}`;return i.has(a)?(e[a]=optional(union([literal(!1),literal(!0)])),e):(e[a]=optional(union([literal(!1),literal(!0),createTulip2DownlinkChannelSchema(r,t,n)])),e)},{});return r({action:`configuration`,extension:_objectSpread2({mainConfiguration:optional(createTulip2DownlinkMainConfigurationSchema(t))},a)})}function createDownlinkResetToFactorySchema(){return object({deviceAction:literal(`resetToFactory`)})}function createTULIP2DownlinkSchema(e,t,n,r){return variant(`deviceAction`,[createDownlinkResetToFactorySchema(),createTULIP2DownlinkConfigurationActionSchema(e,t,r),...n??[]])}function validateTULIP2DownlinkInput(e,t,n,r,i){let a=safeParse(createTULIP2DownlinkSchema(t,n,r,i),e);if(!a.success)throw Error(summarize(a.issues));return a.output}const PEUTULIP2_PRESSURE_CHANNEL={name:`pressure`,channelId:0,start:0,end:10},PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL={name:`device temperature`,channelId:1,start:-40,end:60};function createTULIP2PEUChannels(){return[{channelId:PEUTULIP2_PRESSURE_CHANNEL.channelId,name:PEUTULIP2_PRESSURE_CHANNEL.name,start:PEUTULIP2_PRESSURE_CHANNEL.start,end:PEUTULIP2_PRESSURE_CHANNEL.end},{channelId:PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL.channelId,name:PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL.name,start:PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL.start,end:PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL.end,adjustMeasurementRangeDisallowed:!0}]}const PEU_DOWNLINK_FEATURE_FLAGS={maxConfigId:31,channelsStartupTime:!1,channelsMeasureOffset:!0,mainConfigBLE:!1,mainConfigSingleMeasuringRate:!1},PEU_DOWNLINK_SPAN_LIMIT_FACTORS={deadBandMaxSpanFactor:1,slopeMaxSpanFactor:1,measureOffsetMinSpanFactor:1,measureOffsetMaxSpanFactor:1},PEU_COMMANDS={RESET_FACTORY:1,SET_MAIN_CONFIG:2,DISABLE_CHANNEL:17,SET_PROCESS_ALARM:32,SET_CHANNEL_PROPERTY:48};function getChannelKeys(e){return Object.keys(e).filter(e=>/^channel\d+$/.test(e))}function formatMainConfigurationInput(e){return e.mainConfiguration}function formatDisableChannelInput(e){let t={},n=!1,r=getChannelKeys(e);for(let i of r)e[i]===!1&&(t[i]=!0,n=!0);return n?t:void 0}function formatProcessAlarmInput(e){let t={},n=!1,r=getChannelKeys(e);for(let i of r){let r=e[i];r&&(r===!0?(t[i]=!0,n=!0):typeof r==`object`&&`alarms`in r&&typeof r.alarms==`object`&&(t[i]=r.alarms,n=!0))}return n?t:void 0}function formatMeasureOffsetInput(e,t){if(t?.channelsMeasureOffset===!1)return;let n={},r=!1,i=getChannelKeys(e);for(let t of i){let i=e[t];i&&typeof i==`object`&&`measureOffset`in i&&i.measureOffset!==void 0&&(n[t]={offset:i.measureOffset},r=!0)}return r?n:void 0}function ffd(e,t){if(t=Math.floor(t),t<=0)throw Error(`Limit must be greater than 0`);let n=[];return e.sort((e,t)=>t.length-e.length).forEach(e=>{let r=e.length;if(r>t)throw Error(`Packet is too big to fit in any bin`);let i=!1;for(let a of n)if(t-a.length>=r){a.push(...e),i=!0;break}i||n.push(e)}),n}function buildDownlinkFrames(e,t){if(e.length===0)throw Error(`No Downlink commands were provided for encoding.`);let n=ffd(e,t.byteLimit-1),r=[],i=t.configId;for(let e of n)r.push([i,...e]),i++,i>t.maxConfigId&&(i=t.configId);return r}function formatDownlinkOutput(e){return{bytes:e,fPort:1}}function formatMultipleDownlinkOutput(e){return{frames:e,fPort:1}}function pushUint32(e,t){e.push(t>>24&255,t>>16&255,t>>8&255,t&255)}function pushUint16(e,t){e.push(t>>8&255,t&255)}function pushSignedInt16(e,t){let n=t;t<0&&(n=65536+t),e.push(n>>8&255,n&255)}const MAX_TOTAL_INTERVAL_SECONDS=172800;function buildNetris3ResetFactoryCommand(e){return[e.resetFactory]}function buildNetris3MainConfigCommand(e,t,n){if(!t)return[];let r=t.measuringRateWhenNoAlarm*t.publicationFactorWhenNoAlarm,i=t.measuringRateWhenAlarm*t.publicationFactorWhenAlarm;if(r>MAX_TOTAL_INTERVAL_SECONDS)throw Error(`The product of measuringRateWhenNoAlarm and publicationFactorWhenNoAlarm must not exceed 172_800 seconds (48 hours).`);if(i>MAX_TOTAL_INTERVAL_SECONDS)throw Error(`The product of measuringRateWhenAlarm and publicationFactorWhenAlarm must not exceed 172_800 seconds (48 hours).`);let a=[e.setMainConfig];if(pushUint32(a,t.measuringRateWhenNoAlarm),pushUint16(a,t.publicationFactorWhenNoAlarm),pushUint32(a,t.measuringRateWhenAlarm),pushUint16(a,t.publicationFactorWhenAlarm),a.push(0),a.length>n)throw Error(`Main configuration command exceeds byte limit of ${n} bytes.`);return[a]}function buildNetris3DisableChannelCommands(e,t){if(!t)return[];let n=[];return Object.keys(t).forEach(r=>{let i=Number.parseInt(r.replace(`channel`,``),10);if(Number.isNaN(i))throw TypeError(`Invalid channel index in key: ${r}`);t[r]===!0&&n.push([e.disableChannel,0,i])}),n}function buildNetris3ProcessAlarmCommands(e,t){if(!t)return[];let n=[];return Object.keys(t).forEach(r=>{let i=Number.parseInt(r.replace(`channel`,``),10);if(Number.isNaN(i))throw TypeError(`Invalid channel index in key: ${r}`);let a=t[r],o=[e.setProcessAlarm,0,i,...buildNetris3ProcessAlarmBytes(a)];n.push(o)}),n}function buildNetris3ProcessAlarmBytes(e){let t=[];if(e===!0)return t.push(0,0),t.push(0),t;pushUint16(t,e.deadBand);let n=0;return e.lowThreshold!==void 0&&(n|=128),e.highThreshold!==void 0&&(n|=64),e.fallingSlope!==void 0&&(n|=32),e.risingSlope!==void 0&&(n|=16),e.lowThresholdWithDelay!==void 0&&(n|=8),e.highThresholdWithDelay!==void 0&&(n|=4),t.push(n),e.lowThreshold!==void 0&&pushUint16(t,e.lowThreshold),e.highThreshold!==void 0&&pushUint16(t,e.highThreshold),e.fallingSlope!==void 0&&pushUint16(t,e.fallingSlope),e.risingSlope!==void 0&&pushUint16(t,e.risingSlope),e.lowThresholdWithDelay!==void 0&&(pushUint16(t,e.lowThresholdWithDelay.value),pushUint16(t,e.lowThresholdWithDelay.delay)),e.highThresholdWithDelay!==void 0&&(pushUint16(t,e.highThresholdWithDelay.value),pushUint16(t,e.highThresholdWithDelay.delay)),t}function buildNetris3MeasureOffsetCommands(e,t){if(!t)return[];let n=[];return Object.keys(t).forEach(r=>{let i=Number.parseInt(r.replace(`channel`,``),10);if(Number.isNaN(i))throw TypeError(`Invalid channel index in key: ${r}`);let a=t[r];if(!a)return;let o=[e.setChannelProperty,0,i];pushSignedInt16(o,a.offset),n.push(o)}),n}const NETRIS3_COMMANDS={resetFactory:PEU_COMMANDS.RESET_FACTORY,setMainConfig:PEU_COMMANDS.SET_MAIN_CONFIG,disableChannel:PEU_COMMANDS.DISABLE_CHANNEL,setProcessAlarm:PEU_COMMANDS.SET_PROCESS_ALARM,setChannelProperty:PEU_COMMANDS.SET_CHANNEL_PROPERTY};function buildResetFactoryCommand(){return buildNetris3ResetFactoryCommand(NETRIS3_COMMANDS)}function buildPEUMainConfigCommand(e,t){return buildNetris3MainConfigCommand(NETRIS3_COMMANDS,e,t)}function buildPEUDisableChannelCommands(e){return buildNetris3DisableChannelCommands(NETRIS3_COMMANDS,e)}function buildPEUProcessAlarmCommands(e){return buildNetris3ProcessAlarmCommands(NETRIS3_COMMANDS,e)}function buildPEUMeasureOffsetCommands(e){return buildNetris3MeasureOffsetCommands(NETRIS3_COMMANDS,e)}function PEUTULIP2EncodeHandler(e,t=!1){switch(e.deviceAction){case`resetToFactory`:{let e=encodeResetToFactory();return t?formatMultipleDownlinkOutput([e]):formatDownlinkOutput(e)}case`configuration`:return encodeDownlinkConfiguration(e,t);default:throw Error(`Unknown device action: ${e.deviceAction}`)}}function encodeResetToFactory(){return[0,...buildResetFactoryCommand()]}function encodeDownlinkConfiguration(e,t){let n=e.configurationId??1,r=e.byteLimit??51,i=r-1,a=[...buildPEUMainConfigCommand(formatMainConfigurationInput(e),i),...buildPEUDisableChannelCommands(formatDisableChannelInput(e)),...buildPEUProcessAlarmCommands(formatProcessAlarmInput(e)),...buildPEUMeasureOffsetCommands(formatMeasureOffsetInput(e,PEU_DOWNLINK_FEATURE_FLAGS))];if(a.length===0)throw Error(`No configuration commands were provided for the downlink frame.`);let o=buildDownlinkFrames(a,{configId:n,maxConfigId:PEU_DOWNLINK_FEATURE_FLAGS.maxConfigId,byteLimit:r});if(t)return formatMultipleDownlinkOutput(o);if(o.length>1)throw Error(`Encoding produced ${o.length} frames but single encoder can only return one frame. Use encodeMultiple() or increase byteLimit.`);return formatDownlinkOutput(o[0])}const ALARM_EVENTS={triggered:0,disappeared:1},PROCESS_ALARM_TYPES={"low threshold":0,"high threshold":1,"falling slope":2,"rising slope":3,"low threshold with delay":4,"high threshold with delay":5},TECHNICAL_ALARM_TYPES={"MV_STAT channel 0":0,"MV_STAT channel 1":1,"MV_STAT channel 2":2,"MV_STAT channel 3":3,STAT_DEV:4},MV_STAT_CAUSE_OF_FAILURE_ENTRIES=[{mask:1,name:`MV_STAT_ERROR`},{mask:2,name:`MV_STAT_WARNING`}],STAT_DEV_CAUSE_OF_FAILURE_ENTRIES=[{mask:1,name:`STAT_DEV_ERROR`},{mask:2,name:`STAT_DEV_WARNING`},{mask:4,name:`STAT_DEV_RESTARTED`}],TECHNICAL_CAUSE_OF_FAILURE_ENTRIES_BY_ALARM_TYPE={[TECHNICAL_ALARM_TYPES[`MV_STAT channel 0`]]:MV_STAT_CAUSE_OF_FAILURE_ENTRIES,[TECHNICAL_ALARM_TYPES[`MV_STAT channel 1`]]:MV_STAT_CAUSE_OF_FAILURE_ENTRIES,[TECHNICAL_ALARM_TYPES[`MV_STAT channel 2`]]:MV_STAT_CAUSE_OF_FAILURE_ENTRIES,[TECHNICAL_ALARM_TYPES[`MV_STAT channel 3`]]:MV_STAT_CAUSE_OF_FAILURE_ENTRIES,[TECHNICAL_ALARM_TYPES.STAT_DEV]:STAT_DEV_CAUSE_OF_FAILURE_ENTRIES},DEVICE_ALARM_STATUS_TYPES={"low battery":1,"temperature alarm":2,"duty cycle alarm":4,"UART alarm":256},PRODUCT_SUB_ID_NAMES={LoRaWAN:0,MIOTY:1},LPP_MEASURANDS_PRESSURE={3:`Pressure (gauge)`,4:`Pressure (absolute)`,5:`Pressure (differential)`},LPP_MEASURANDS_TEMPERATURE={1:`Temperature`};_objectSpread2(_objectSpread2({},LPP_MEASURANDS_TEMPERATURE),LPP_MEASURANDS_PRESSURE);const LPP_UNITS_PRESSURE={7:`bar`,8:`mbar`,9:`µbar`,10:`Pa`,11:`hPa`,12:`kPa`,13:`MPa`,14:`psi`,15:`lbf/ft²`,16:`kN/m²`,17:`N/cm²`,18:`atm`,19:`kg/cm²`,20:`kg/mm²`,21:`µmHg`,22:`mmHg`,23:`cmHg`,24:`inHg`,25:`mmH2O`,32:`mH2O`,33:`inH2O`,34:`ftH2O`},LPP_UNITS_TEMPERATURE={1:`°C`,2:`°F`,3:`K`,4:`°R`};_objectSpread2(_objectSpread2({},LPP_UNITS_TEMPERATURE),LPP_UNITS_PRESSURE);const ERROR_VALUE=65535;function resolveCauseOfFailureName(e,t){let n=TECHNICAL_CAUSE_OF_FAILURE_ENTRIES_BY_ALARM_TYPE[e];if(!n)throw Error(`Unknown technical alarm type ${e} in technical alarm message`);let r=n.find(e=>(t&e.mask)!==0);if(!r)throw Error(`Unknown causeOfFailure ${t} for technical alarm type ${e} in technical alarm message`);return r.name}function findChannel(e,t){let n=e.find(e=>e.channelId===t);if(!n)throw Error(`Channel configuration missing for channelId ${t} in data message`);return n}const handleDataMessage=(e,t)=>{if(e.bytes.length<4||e.bytes.length>11)throw Error(`Data message (0x01/0x02) requires at least 4 and at most 11 bytes, but received ${e.bytes.length} bytes`);let n=e.bytes[0],r=e.bytes[1],i=findChannel(t.channels,PEUTULIP2_PRESSURE_CHANNEL.channelId),a=findChannel(t.channels,PEUTULIP2_DEVICE_TEMPERATURE_CHANNEL.channelId),o=[],s=[];if(e.bytes.length<5)s.push(`Not enough data to decode channel (pressure). Payload must has a length of 2 bytes, input data length: ${e.bytes.length}`);else{let n=e.bytes[3]<<8|e.bytes[4];n===ERROR_VALUE?s.push(`Invalid data for channel - pressure : 0xffff, 65535`):o.push({channelId:i.channelId,channelName:i.name,value:roundValue(TULIPValueToValue(n,i),t.roundingDecimals)})}if(e.bytes.length<7)s.push(`Not enough data to decode channel (temperature). Payload must has a length of 4 bytes, input data length: ${e.bytes.length}`);else{let n=e.bytes[5]<<8|e.bytes[6];n===ERROR_VALUE?s.push(`Invalid data for channel - device temperature : 0xffff, 65535`):o.push({channelId:a.channelId,channelName:a.name,value:roundValue(TULIPValueToValue(n,a),t.roundingDecimals)})}let c={data:{messageType:n,configurationId:r,measurement:{channels:o}}};return s.length>0&&(c.warnings=s),c},handleProcessAlarmMessage=(e,t)=>{if(e.bytes.length<6||(e.bytes.length-3)%3!=0)throw Error(`Process alarm message (0x03) requires at least 6 bytes (and target byte count 3n+3), but received ${e.bytes.length} bytes`);let n=e.bytes[1],r=[],i=[];for(let n=3;n<e.bytes.length;n+=3){let a=e.bytes[n],o=(a&120)>>3,s=a&7,c=(a&128)>>7,l=e.bytes[n+1]<<8|e.bytes[n+2],u=findChannel(t.channels,o),d;d=l===ERROR_VALUE?ERROR_VALUE:s===PROCESS_ALARM_TYPES[`falling slope`]||s===PROCESS_ALARM_TYPES[`rising slope`]?roundValue(slopeValueToValue(l,u),t.roundingDecimals):roundValue(TULIPValueToValue(l,u),t.roundingDecimals);let f=Object.entries(PROCESS_ALARM_TYPES).find(([,e])=>e===s)?.[0];if(!f)throw Error(`Unknown alarmType ${s} in process alarm message`);let p=Object.entries(ALARM_EVENTS).find(([,e])=>e===c)?.[0];if(!p)throw Error(`Unknown event ${c} in process alarm message`);r.push({channelId:o,channelName:u.name,alarmType:s,alarmTypeName:f,event:c,eventName:p,value:d}),d===ERROR_VALUE&&i.push(`Invalid data for ${String(u.name)}channel`)}let a={data:{messageType:3,configurationId:n,processAlarms:r}};return i.length>0&&(a.warnings=i),a},handleTechnicalAlarmMessage=e=>{if(e.bytes.length<6||(e.bytes.length-3)%3!=0)throw Error(`Technical alarm message (0x04) requires at least 6 bytes (and target byte count 3n+3), but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=[];for(let t=3;t<e.bytes.length;t+=3){let r=e.bytes[t],i=Object.entries(TECHNICAL_ALARM_TYPES).find(([,e])=>e===r);if(!i)throw Error(`Unknown technical alarm type ${r} in technical alarm message`);let a=i[0],o=e.bytes[t+2],s=resolveCauseOfFailureName(r,o);n.push({alarmType:r,alarmTypeName:a,causeOfFailure:o,causeOfFailureName:s})}return{data:{messageType:4,configurationId:t,technicalAlarms:n}}},handleDeviceAlarmMessage=e=>{if(e.bytes.length!==4)throw Error(`Device alarm message (0x05) requires 4 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=(e.bytes[2]<<8|e.bytes[3])>>>0,r=[];for(let e=0,t=0;e<15;e+=1){let i=1<<e;if((n&i)!==0){let e=Object.entries(DEVICE_ALARM_STATUS_TYPES).find(([,e])=>e===i);e&&(r[t]=e[0],t+=1)}}return{data:{messageType:5,configurationId:t,deviceAlarm:{alarmStatus:n,alarmStatusNames:r}}}};function resolveProductSubId(e){let t=Object.entries(PRODUCT_SUB_ID_NAMES).find(([,t])=>t===e);if(!t)throw Error(`Unknown productSubId ${e} in device identification message. Only LoRaWAN (0) is supported.`);let[n,r]=t;return{id:r,name:n}}function resolvePressureMeasurand(e){let t=LPP_MEASURANDS_PRESSURE[e];if(!t)throw Error(`Unknown pressure measurand ${e} in device identification message`);return{id:e,name:t}}function resolvePressureUnit(e){let t=LPP_UNITS_PRESSURE[e];if(!t)throw Error(`Unknown pressure unit ${e} in device identification message`);return{id:e,name:t}}function resolveTemperatureMeasurand(e){let t=LPP_MEASURANDS_TEMPERATURE[e];if(!t)throw Error(`Unknown temperature measurand ${e} in device identification message`);return{id:e,name:t}}function resolveTemperatureUnit(e){let t=LPP_UNITS_TEMPERATURE[e];if(!t)throw Error(`Unknown temperature unit ${e} in device identification message`);return{id:e,name:t}}const handleDeviceIdentificationMessage=(e,t)=>{if(e.bytes.length<26)throw Error(`Device identification message (0x07) requires at least 26 bytes, but received ${e.bytes.length} bytes`);let n=e.bytes[1],r=e.bytes[2];if(r!==15)throw Error(`Invalid productId ${r} in device identification message. Expected 15 (NETRIS3).`);let{id:i,name:a}=resolveProductSubId(e.bytes[3]),o=e.bytes[4]<<8|e.bytes[5],s=resolvePressureMeasurand(e.bytes[6]),c=intTuple4ToFloat32WithThreshold([e.bytes[7],e.bytes[8],e.bytes[9],e.bytes[10]]),l=intTuple4ToFloat32WithThreshold([e.bytes[11],e.bytes[12],e.bytes[13],e.bytes[14]]),u=resolvePressureUnit(e.bytes[15]),d=resolveTemperatureMeasurand(e.bytes[16]),f=intTuple4ToFloat32WithThreshold([e.bytes[17],e.bytes[18],e.bytes[19],e.bytes[20]]),p=intTuple4ToFloat32WithThreshold([e.bytes[21],e.bytes[22],e.bytes[23],e.bytes[24]]),m=resolveTemperatureUnit(e.bytes[25]);return{data:{messageType:7,configurationId:n,deviceInformation:{productId:r,productIdName:`NETRIS3`,productSubId:i,productSubIdName:a,sensorDeviceTypeId:o,channelConfigurations:[{channelId:t.channels[0].channelId,channelName:t.channels[0].name,measurand:s.id,measurandName:s.name,measurementRangeStart:c,measurementRangeEnd:l,unit:u.id,unitName:u.name},{channelId:t.channels[1].channelId,channelName:t.channels[1].name,measurand:d.id,measurandName:d.name,measurementRangeStart:f,measurementRangeEnd:p,unit:m.id,unitName:m.name}]}}}},handleKeepAliveMessage=e=>{if(e.bytes.length!==10)throw Error(`Keep alive message (0x08) requires 10 bytes, but received ${e.bytes.length} bytes`);return{data:{messageType:8,configurationId:e.bytes[1],deviceStatistic:{numberOfMeasurements:(e.bytes[2]<<24>>>0)+(e.bytes[3]<<16>>>0)+(e.bytes[4]<<8>>>0)+e.bytes[5]>>>0,numberOfTransmissions:(e.bytes[6]<<24>>>0)+(e.bytes[7]<<16>>>0)+(e.bytes[8]<<8>>>0)+e.bytes[9]>>>0}}}},handleExtendedDeviceIdentificationMessage=e=>{if(e.bytes.length<20||e.bytes.length>42)throw Error(`Extended device identification message (0x09) requires at least 20 and at most 42 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=e.bytes[2]&15,r=3,i={optionalFieldsMask:n,deviceHardwareVersion:``,deviceSerialNumber:``,deviceProductCode:``,deviceFirmwareVersion:``};if(n&1){let t=``;for(let n=r;n<r+12;n+=1){let r=e.bytes[n];if(r===0)break;t+=String.fromCharCode(r)}t.length>0&&(i.wikaSensorSerialNumber=t),r+=12}n&2&&(i.sensorLUID=(e.bytes[r]<<24>>>0)+(e.bytes[r+1]<<16>>>0)+(e.bytes[r+2]<<8>>>0)+e.bytes[r+3]>>>0,r+=4),n&4&&(i.sensorHardwareVersion=`${e.bytes[r]}.${e.bytes[r+1]}.${e.bytes[r+2]}`,r+=3),i.deviceHardwareVersion=`${e.bytes[r]}.${e.bytes[r+1]}.${e.bytes[r+2]}`,r+=3,n&8&&(i.sensorFirmwareVersion=`${e.bytes[r]}.${e.bytes[r+1]}.${e.bytes[r+2]}`,r+=3);let a=e.bytes[r]<<16|e.bytes[r+1]<<8|e.bytes[r+2];return i.deviceSerialNumber=`${String.fromCharCode(e.bytes[r+3])}${a.toString().padStart(6,`0`)}`,r+=4,i.deviceProductCode=String.fromCharCode(e.bytes[r],e.bytes[r+1],e.bytes[r+2],e.bytes[r+3],e.bytes[r+4],e.bytes[r+5],e.bytes[r+6]),r+=7,i.deviceFirmwareVersion=`${e.bytes[r]}.${e.bytes[r+1]}.${e.bytes[r+2]}`,{data:{messageType:9,configurationId:t,extendedDeviceInformation:i}}},peuEncoderFactory=e=>{let t=PEU_DOWNLINK_FEATURE_FLAGS;return n=>PEUTULIP2EncodeHandler(validateTULIP2DownlinkInput(n,e.getChannels(),t,void 0,PEU_DOWNLINK_SPAN_LIMIT_FACTORS))},peuMultipleEncodeFactory=e=>{let t=PEU_DOWNLINK_FEATURE_FLAGS;return n=>PEUTULIP2EncodeHandler(validateTULIP2DownlinkInput(n,e.getChannels(),t,void 0,PEU_DOWNLINK_SPAN_LIMIT_FACTORS),!0)};function createPEUTULIP2Codec(){return defineTULIP2Codec({deviceName:PEU_NETRIS3_NAME,roundingDecimals:4,channels:createTULIP2PEUChannels(),handlers:{1:handleDataMessage,2:handleDataMessage,3:handleProcessAlarmMessage,4:handleTechnicalAlarmMessage,5:handleDeviceAlarmMessage,7:handleDeviceIdentificationMessage,8:handleKeepAliveMessage,9:handleExtendedDeviceIdentificationMessage},encoderFactory:peuEncoderFactory,multipleEncodeFactory:peuMultipleEncodeFactory})}function createTargetsSchema(e){return object(Object.entries(e).reduce((e,[t,n])=>{if(!t.startsWith(`sensor`))return e;let r=n;return e[t]=optional(object(Object.entries(r).reduce((e,[t])=>(t.startsWith(`channel`)&&(e[t]=optional(boolean())),e),{}))),e},{}))}function createGetAlarmStatusSchema(e){return object({processAlarmRequested:optional(boolean()),cmAlarmRequested:optional(boolean()),sensorAlarmRequested:optional(boolean()),channelAlarmRequested:optional(boolean()),targets:optional(createTargetsSchema(e))})}function createChannelIdentificationReadSchema(e){let t=e.registerConfig.tulip3IdentificationRegisters,n={};t.measurand&&(n.measurand=optional(boolean())),t.unit&&(n.unit=optional(boolean())),t.minMeasureRange&&(n.minMeasureRange=optional(boolean())),t.maxMeasureRange&&(n.maxMeasureRange=optional(boolean())),t.minPhysicalLimit&&(n.minPhysicalLimit=optional(boolean())),t.maxPhysicalLimit&&(n.maxPhysicalLimit=optional(boolean())),t.accuracy&&(n.accuracy=optional(boolean())),t.offset&&(n.offset=optional(boolean())),t.gain&&(n.gain=optional(boolean())),t.calibrationDate&&(n.calibrationDate=optional(boolean()));let r=e.registerConfig.channelSpecificIdentificationRegisters;for(let e of Object.keys(r))n[e]=optional(boolean());return object(n)}function createChannelConfigurationReadSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n={};t.protocolDataType&&(n.protocolDataType=optional(boolean())),t.processAlarmEnabled&&(n.processAlarmEnabled=optional(boolean())),t.processAlarmDeadBand&&(n.processAlarmDeadBand=optional(boolean())),t.lowThresholdAlarmValue&&(n.lowThresholdAlarmValue=optional(boolean())),t.highThresholdAlarmValue&&(n.highThresholdAlarmValue=optional(boolean())),t.fallingSlopeAlarmValue&&(n.fallingSlopeAlarmValue=optional(boolean())),t.risingSlopeAlarmValue&&(n.risingSlopeAlarmValue=optional(boolean())),t.lowThresholdWithDelayAlarmValue&&(n.lowThresholdWithDelayAlarmValue=optional(boolean())),t.lowThresholdWithDelayAlarmDelay&&(n.lowThresholdWithDelayAlarmDelay=optional(boolean())),t.highThresholdWithDelayAlarmValue&&(n.highThresholdWithDelayAlarmValue=optional(boolean())),t.highThresholdWithDelayAlarmDelay&&(n.highThresholdWithDelayAlarmDelay=optional(boolean()));let r=e.registerConfig.channelSpecificConfigurationRegisters;for(let e of Object.keys(r))n[e]=optional(boolean());return object(n)}function createChannelReadMultipleSchema(e){return object({identification:optional(createChannelIdentificationReadSchema(e)),configuration:optional(createChannelConfigurationReadSchema(e))})}function createSensorIdentificationReadSchema(e){let t=e.registerConfig.tulip3IdentificationRegisters,n={};t.sensorType&&(n.sensorType=optional(boolean())),t.existingChannels&&(n.existingChannels=optional(boolean())),t.firmwareVersion&&(n.firmwareVersion=optional(boolean())),t.hardwareVersion&&(n.hardwareVersion=optional(boolean())),t.productionDate&&(n.productionDate=optional(boolean())),t.serialNumberPart1&&(n.serialNumberPart1=optional(boolean())),t.serialNumberPart2&&(n.serialNumberPart2=optional(boolean()));let r=e.registerConfig.sensorSpecificIdentificationRegisters;for(let e of Object.keys(r))n[e]=optional(boolean());return object(n)}function createSensorConfigurationReadSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n={};t.samplingChannels&&(n.samplingChannels=optional(boolean())),t.bootTime&&(n.bootTime=optional(boolean())),t.communicationTimeout&&(n.communicationTimeout=optional(boolean())),t.communicationRetryCount&&(n.communicationRetryCount=optional(boolean()));let r=e.registerConfig.sensorSpecificConfigurationRegisters;for(let e of Object.keys(r))n[e]=optional(boolean());return object(n)}function createCommunicationModuleIdentificationReadSchema(e){let t=e.registerConfig.tulip3IdentificationRegisters,n={};return t.productId&&(n.productId=optional(boolean())),t.productSubId&&(n.productSubId=optional(boolean())),t.channelPlan&&(n.channelPlan=optional(boolean())),t.connectedSensors&&(n.connectedSensors=optional(boolean())),t.firmwareVersion&&(n.firmwareVersion=optional(boolean())),t.hardwareVersion&&(n.hardwareVersion=optional(boolean())),t.productionDate&&(n.productionDate=optional(boolean())),t.serialNumberPart1&&(n.serialNumberPart1=optional(boolean())),t.serialNumberPart2&&(n.serialNumberPart2=optional(boolean())),object(n)}function createCommunicationModuleConfigurationReadSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n={};return t.measuringPeriodAlarmOff&&(n.measuringPeriodAlarmOff=optional(boolean())),t.measuringPeriodAlarmOn&&(n.measuringPeriodAlarmOn=optional(boolean())),t.transmissionRateAlarmOff&&(n.transmissionRateAlarmOff=optional(boolean())),t.transmissionRateAlarmOn&&(n.transmissionRateAlarmOn=optional(boolean())),t.overVoltageThreshold&&(n.overVoltageThreshold=optional(boolean())),t.underVoltageThreshold&&(n.underVoltageThreshold=optional(boolean())),t.overTemperatureCmChip&&(n.overTemperatureCmChip=optional(boolean())),t.underTemperatureCmChip&&(n.underTemperatureCmChip=optional(boolean())),t.downlinkAnswerTimeout&&(n.downlinkAnswerTimeout=optional(boolean())),t.fetchAdditionalDownlinkTimeInterval&&(n.fetchAdditionalDownlinkTimeInterval=optional(boolean())),t.enableBleAdvertising&&(n.enableBleAdvertising=optional(boolean())),object(n)}function createSensorReadMultipleSchema(e){let t=Object.entries(e).reduce((e,[t,n])=>(t.startsWith(`channel`)&&(e[t]=optional(createChannelReadMultipleSchema(n))),e),{});return object(_objectSpread2({identification:optional(createSensorIdentificationReadSchema(e)),configuration:optional(createSensorConfigurationReadSchema(e))},t))}function createReadInputDataMultipleSchema(e){let t=Object.entries(e).reduce((e,[t,n])=>(t.startsWith(`sensor`)&&(e[t]=optional(createSensorReadMultipleSchema(n))),e),{});return object(_objectSpread2({communicationModule:optional(object({identification:optional(createCommunicationModuleIdentificationReadSchema(e)),configuration:optional(createCommunicationModuleConfigurationReadSchema(e))}))},t))}function createProtocolDataTypeSchema(e){return picklist(e.measurementTypes)}function createProcessAlarmEnabledSchema(){return object({lowThreshold:optional(boolean()),highThreshold:optional(boolean()),fallingSlope:optional(boolean()),risingSlope:optional(boolean()),lowThresholdWithDelay:optional(boolean()),highThresholdWithDelay:optional(boolean())})}function createSamplingChannelsSchema(e){return object(Object.keys(e).filter(e=>e.startsWith(`channel`)).reduce((e,t)=>(e[t]=boolean(),e),{}))}function createChannelUnitNameSchema(e){return picklist(e.availableUnits)}function createChannelThresholdValueSchema(e){return pipe(number(),minValue(e.start,`Value must be >= ${e.start}`),maxValue(e.end,`Value must be <= ${e.end}`))}function createChannelRangeSpanValueSchema(e){let t=e.end-e.start;return pipe(number(),minValue(0,`Value must be >= 0`),maxValue(t,`Value must be <= ${t} (range span)`))}function createChannelIdentificationWriteSchema(e){let t=e.registerConfig.tulip3IdentificationRegisters,n={};t.unit&&(n.unit=optional(createChannelUnitNameSchema(e))),t.offset&&(n.offset=optional(number())),t.gain&&(n.gain=optional(number()));let r=e.registerConfig.channelSpecificIdentificationRegisters;for(let e of Object.keys(r))n[e]=optional(number());return object(n)}function createChannelConfigurationWriteSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n=createChannelThresholdValueSchema(e),r=createChannelRangeSpanValueSchema(e),i={};t.protocolDataType&&(i.protocolDataType=optional(createProtocolDataTypeSchema(e))),t.processAlarmEnabled&&(i.processAlarmEnabled=optional(createProcessAlarmEnabledSchema())),t.processAlarmDeadBand&&(i.processAlarmDeadBand=optional(r)),t.lowThresholdAlarmValue&&(i.lowThresholdAlarmValue=optional(n)),t.highThresholdAlarmValue&&(i.highThresholdAlarmValue=optional(n)),t.fallingSlopeAlarmValue&&(i.fallingSlopeAlarmValue=optional(r)),t.risingSlopeAlarmValue&&(i.risingSlopeAlarmValue=optional(r)),t.lowThresholdWithDelayAlarmValue&&(i.lowThresholdWithDelayAlarmValue=optional(n)),t.lowThresholdWithDelayAlarmDelay&&(i.lowThresholdWithDelayAlarmDelay=optional(pipe(number(),integer(),minValue(0)))),t.highThresholdWithDelayAlarmValue&&(i.highThresholdWithDelayAlarmValue=optional(n)),t.highThresholdWithDelayAlarmDelay&&(i.highThresholdWithDelayAlarmDelay=optional(pipe(number(),integer(),minValue(0))));let a=e.registerConfig.channelSpecificConfigurationRegisters;for(let e of Object.keys(a))i[e]=optional(number());return object(i)}function createChannelWriteMultipleSchema(e){return object({identification:optional(createChannelIdentificationWriteSchema(e)),configuration:optional(createChannelConfigurationWriteSchema(e))})}function createSensorConfigurationWriteSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n={};t.samplingChannels&&(n.samplingChannels=optional(createSamplingChannelsSchema(e))),t.bootTime&&(n.bootTime=optional(pipe(number(),integer(),minValue(0)))),t.communicationTimeout&&(n.communicationTimeout=optional(pipe(number(),integer(),minValue(0)))),t.communicationRetryCount&&(n.communicationRetryCount=optional(pipe(number(),integer(),minValue(0))));let r=e.registerConfig.sensorSpecificConfigurationRegisters;for(let e of Object.keys(r))n[e]=optional(number());return object(n)}function createCommunicationModuleConfigurationWriteSchema(e){let t=e.registerConfig.tulip3ConfigurationRegisters,n={};return t.measuringPeriodAlarmOff&&(n.measuringPeriodAlarmOff=optional(pipe(number(),integer(),minValue(0)))),t.measuringPeriodAlarmOn&&(n.measuringPeriodAlarmOn=optional(pipe(number(),integer(),minValue(0)))),t.transmissionRateAlarmOff&&(n.transmissionRateAlarmOff=optional(pipe(number(),integer(),minValue(0)))),t.transmissionRateAlarmOn&&(n.transmissionRateAlarmOn=opt