@w2a-iiot/raw-javascript-parsers
Version:
This packages contain the raw built javascript parsers for WIKA's IIoT devices.
2 lines • 136 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 ALARM_EVENTS={triggered:0,disappeared:1},PROCESS_ALARM_TYPES={"low threshold":1,"high threshold":2,"falling slope":4,"rising slope":8,"low threshold with delay":16,"high threshold with delay":32},TECHNICAL_ALARM_TYPES={"SSM communication error":1,"SSM identity error":128},DEVICE_ALARM_TYPES={"low battery error":1,"duty cycle alarm":4,"configuration error":8},MEASUREMENT_ALARM_TYPES={MV_STAT_ERROR:1,MV_STAT_WARNING:2,MV_STAT_LIM_HI:4,MV_STAT_LIM_LO:8,MV_STAT_WARNING_2:16},PRODUCT_IDS_BY_ID={15:`NETRIS1`,16:`NETRIS©1 BLE+LPWAN`,17:`NETRIS©1 BLE`},SENSOR_IDS_BY_ID={0:`RTD`,1:`E-Signal`,2:`TRW`},LPWAN_IDS_BY_ID={0:`Reserved`,1:`mioty`,2:`LoRaWAN`},LPP_MEASURANDS_BY_ID={1:`Temperature`,13:`Current`,14:`Voltage`,18:`Relative`},LPP_UNITS_BY_ID={1:`°C`,2:`°F`,88:`V`,90:`mA`,100:`%`};Object.keys(LPP_MEASURANDS_BY_ID).map(e=>Number.parseInt(e,10)),Object.values(LPP_MEASURANDS_BY_ID),Object.keys(LPP_UNITS_BY_ID).map(e=>Number.parseInt(e,10)),Object.values(LPP_UNITS_BY_ID),Object.keys(PRODUCT_IDS_BY_ID).map(e=>Number.parseInt(e)),Object.values(PRODUCT_IDS_BY_ID),Object.keys(SENSOR_IDS_BY_ID).map(e=>Number.parseInt(e)),Object.values(SENSOR_IDS_BY_ID),Object.keys(LPWAN_IDS_BY_ID).map(e=>Number.parseInt(e)),Object.values(LPWAN_IDS_BY_ID);function createNETRIS1TULIP2GetConfigurationSchema(){return createTULIP2DownlinkActionSchemaFactory(31)({action:`getConfiguration`,extension:{mainConfiguration:optional(literal(!0)),processAlarmConfiguration:optional(literal(!0))}})}function createNETRIS1TULIP2ResetBatterySchema(){return createTULIP2DownlinkActionSchemaFactory(31)({action:`resetBatteryIndicator`,meta:{byteLimit:!1}})}const NETRIS1TULIP2_CHANNEL_0={name:`measurement`,channelId:0,defaultRange:{start:0,end:10}};function createTULIP2NETRIS1Channels(){return[{channelId:NETRIS1TULIP2_CHANNEL_0.channelId,name:NETRIS1TULIP2_CHANNEL_0.name,start:NETRIS1TULIP2_CHANNEL_0.defaultRange.start,end:NETRIS1TULIP2_CHANNEL_0.defaultRange.end}]}const NETRIS1_DOWNLINK_FEATURE_FLAGS={maxConfigId:31,channelsStartupTime:!1,channelsMeasureOffset:!1,mainConfigBLE:!1,mainConfigSingleMeasuringRate:!1},NETRIS1_COMMANDS={RESET_FACTORY:1,SET_MAIN_CONFIG:2,GET_MAIN_CONFIG:4,RESET_BATTERY:5,SET_PROCESS_ALARM:32,GET_PROCESS_ALARM:64};function getChannelKeys(e){return Object.keys(e).filter(e=>/^channel\d+$/.test(e))}function formatMainConfigurationInput(e){return e.mainConfiguration}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 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 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 buildDownlinkFrame(e,t){if(e.length===0)throw Error(`No Downlink commands were provided to build the downlink frame.`);let n=[t.configId];for(let t of e)n.push(...t);if(n.length===0)throw Error(`No bytes were generated for the downlink frame.`);if(n.length>t.byteLimit)throw Error(`Downlink frame exceeds byte limit of ${t.byteLimit} bytes (got ${n.length} bytes).`);return 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 buildMainConfigCommand(e){if(!e)return[];let t=e.measuringRateWhenNoAlarm*e.publicationFactorWhenNoAlarm,n=e.measuringRateWhenAlarm*e.publicationFactorWhenAlarm;if(e.measuringRateWhenNoAlarm<2||e.measuringRateWhenNoAlarm>604800)throw Error(`measuringRateWhenNoAlarm must be between 2 and 604800 seconds.`);if(e.measuringRateWhenAlarm<2||e.measuringRateWhenAlarm>604800)throw Error(`measuringRateWhenAlarm must be between 2 and 604800 seconds.`);if(e.publicationFactorWhenNoAlarm<1||e.publicationFactorWhenNoAlarm>604800)throw Error(`publicationFactorWhenNoAlarm must be between 1 and 604800.`);if(e.publicationFactorWhenAlarm<1||e.publicationFactorWhenAlarm>604800)throw Error(`publicationFactorWhenAlarm must be between 1 and 604800.`);if(t>604800)throw Error(`The product of measuringRateWhenNoAlarm and publicationFactorWhenNoAlarm must not exceed 604_800 seconds (7 days).`);if(n>604800)throw Error(`The product of measuringRateWhenAlarm and publicationFactorWhenAlarm must not exceed 604_800 seconds (7 days).`);let r=[NETRIS1_COMMANDS.SET_MAIN_CONFIG];return pushUint32(r,e.measuringRateWhenNoAlarm),pushUint16(r,e.publicationFactorWhenNoAlarm),pushUint32(r,e.measuringRateWhenAlarm),pushUint16(r,e.publicationFactorWhenAlarm),r.push(0),r}function buildProcessAlarmCommand(e){let t=e?.channel0;if(t===void 0)return[];let n=t,r=[NETRIS1_COMMANDS.SET_PROCESS_ALARM,0];if(n===!0)return r.push(0,0),r.push(0),r;pushUint16(r,n.deadBand);let i=0;return n.lowThreshold!==void 0&&(i|=128),n.highThreshold!==void 0&&(i|=64),n.fallingSlope!==void 0&&(i|=32),n.risingSlope!==void 0&&(i|=16),n.lowThresholdWithDelay!==void 0&&(i|=8),n.highThresholdWithDelay!==void 0&&(i|=4),r.push(i),n.lowThreshold!==void 0&&pushUint16(r,n.lowThreshold),n.highThreshold!==void 0&&pushUint16(r,n.highThreshold),n.fallingSlope!==void 0&&pushUint16(r,n.fallingSlope),n.risingSlope!==void 0&&pushUint16(r,n.risingSlope),n.lowThresholdWithDelay!==void 0&&(pushUint16(r,n.lowThresholdWithDelay.value),pushUint16(r,n.lowThresholdWithDelay.delay)),n.highThresholdWithDelay!==void 0&&(pushUint16(r,n.highThresholdWithDelay.value),pushUint16(r,n.highThresholdWithDelay.delay)),r}function NETRIS1TULIP2EncodeHandler(e,t=!1){switch(e.deviceAction){case`resetToFactory`:{let e=encodeResetToFactory();return t?formatMultipleDownlinkOutput([e]):formatDownlinkOutput(e)}case`resetBatteryIndicator`:{let n=encodeResetBatteryIndicator(e);return t?formatMultipleDownlinkOutput([n]):formatDownlinkOutput(n)}case`getConfiguration`:return encodeGetConfiguration(e,t);case`configuration`:return encodeDownlinkConfiguration(e,t);default:throw Error(`Unknown device action`)}}function encodeResetToFactory(){return buildDownlinkFrame([[NETRIS1_COMMANDS.RESET_FACTORY]],{configId:1,maxConfigId:NETRIS1_DOWNLINK_FEATURE_FLAGS.maxConfigId,byteLimit:1/0})}function encodeResetBatteryIndicator(e){let t=e.configurationId??1;return buildDownlinkFrame([[NETRIS1_COMMANDS.RESET_BATTERY,0]],{configId:t,maxConfigId:NETRIS1_DOWNLINK_FEATURE_FLAGS.maxConfigId,byteLimit:1/0})}function encodeDownlinkConfiguration(e,t){let n=e.configurationId??1,r=e.byteLimit??51,i=[],a=buildMainConfigCommand(formatMainConfigurationInput(e));a.length>0&&i.push(a);let o=buildProcessAlarmCommand(formatProcessAlarmInput(e));if(o.length>0&&i.push(o),i.length===0)throw Error(`No configuration commands were provided for the downlink frame.`);let s=buildDownlinkFrames(i,{configId:n,maxConfigId:NETRIS1_DOWNLINK_FEATURE_FLAGS.maxConfigId,byteLimit:r});if(t)return formatMultipleDownlinkOutput(s);if(s.length>1)throw Error(`Encoding produced ${s.length} frames but single encoder can only return one frame. Use encodeMultiple() or increase byteLimit.`);return formatDownlinkOutput(s[0])}function encodeGetConfiguration(e,t){let n=[];if(e.mainConfiguration&&n.push([NETRIS1_COMMANDS.GET_MAIN_CONFIG]),e.processAlarmConfiguration&&n.push([NETRIS1_COMMANDS.GET_PROCESS_ALARM,0]),n.length===0)throw Error(`No get configuration commands were provided.`);let r=(`configurationId`in e?e.configurationId:void 0)??1,i=(`byteLimit`in e?e.byteLimit:void 0)??1/0,a=buildDownlinkFrame(n,{configId:r,maxConfigId:NETRIS1_DOWNLINK_FEATURE_FLAGS.maxConfigId,byteLimit:i});return t?formatMultipleDownlinkOutput([a]):formatDownlinkOutput(a)}const ERROR_VALUE=65535,handleDataMessage=(e,t)=>{if(e.bytes.length!==5)throw Error(`Data message (0x01/0x02) requires 5 bytes, but received ${e.bytes.length} bytes`);let n=e.bytes[0],r=e.bytes[1],i=e.bytes[3]<<8|e.bytes[4],a=i===ERROR_VALUE?ERROR_VALUE:roundValue(TULIPValueToValue(i,t.channels[0]),t.roundingDecimals);if(a===ERROR_VALUE)throw Error(`Invalid data for channel - measurement : 0xffff, 65535`);return{data:{configurationId:r,messageType:n,measurement:{channels:[{channelId:0,channelName:`measurement`,value:a}]}}}},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=[];for(let n=3;n<e.bytes.length;n+=3){let i=e.bytes[2]&15,a=(e.bytes[n]&128)>>7,o=e.bytes[n]&63,s={lowThreshold:!!(o&PROCESS_ALARM_TYPES[`low threshold`]),highThreshold:!!(o&PROCESS_ALARM_TYPES[`high threshold`]),fallingSlope:!!(o&PROCESS_ALARM_TYPES[`falling slope`]),risingSlope:!!(o&PROCESS_ALARM_TYPES[`rising slope`]),lowThresholdDelay:!!(o&PROCESS_ALARM_TYPES[`low threshold with delay`]),highThresholdDelay:!!(o&PROCESS_ALARM_TYPES[`high threshold with delay`])},c=o===PROCESS_ALARM_TYPES[`rising slope`]||o===PROCESS_ALARM_TYPES[`falling slope`],l=e.bytes[n+1]<<8|e.bytes[n+2],u=c?slopeValueToValue(l,t.channels[0]):TULIPValueToValue(l,t.channels[0]);r.push({sensorId:0,channelId:i,channelName:`measurement`,event:a,eventName:Object.keys(ALARM_EVENTS).find(e=>ALARM_EVENTS[e]===a),alarmFlags:s,value:roundValue(u,t.roundingDecimals)})}let i=[],a={data:{messageType:3,configurationId:n,processAlarms:r}};for(let e of r)e.value===ERROR_VALUE&&i.push(`Invalid data for channel - ${e.channelName} : 0xffff, 65535`);return i.length>0&&(a.warnings=i),a},handleTechnicalAlarmMessage=e=>{if(e.bytes.length!==5)throw Error(`Technical alarm message (0x04) requires 5 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=(e.bytes[3]<<8|e.bytes[4])&32767,r=[];return Object.entries(TECHNICAL_ALARM_TYPES).forEach(([e,t])=>{(n&t)!==0&&r.push(e)}),{data:{messageType:4,configurationId:t,technicalAlarms:[{sensorId:0,alarmType:n,alarmTypeNames:r}]}}},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])&32767,r=[];return Object.entries(DEVICE_ALARM_TYPES).forEach(([e,t])=>{(n&t)!==0&&r.push(e)}),{data:{messageType:5,configurationId:t,deviceAlarm:{alarmType:n,alarmTypeNames:r}}}},handleDeviceIdentificationMessage=e=>{if(e.bytes.length<29)throw Error(`Device identification message (0x07) requires at least 29 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=e.bytes[2],r=PRODUCT_IDS_BY_ID[n]??`Unknown`,i=e.bytes[3],a=i&31,o=SENSOR_IDS_BY_ID[a]??`Unknown`,s=i>>5&7,c=LPWAN_IDS_BY_ID[s]??`Unknown`,l=`${o} ${c}`,u=`${e.bytes[4]>>4&15}.${e.bytes[4]&15}.${e.bytes[5]}`,d=`${e.bytes[6]>>4&15}.${e.bytes[6]&15}.${e.bytes[7]}`,f=e.bytes.slice(8,19),p=f.length-1;for(;p>=0&&f[p]===0;)p--;let m=String.fromCharCode(...f.slice(0,p+1)),h=intTuple4ToFloat32WithThreshold([e.bytes[19],e.bytes[20],e.bytes[21],e.bytes[22]]),g=intTuple4ToFloat32WithThreshold([e.bytes[23],e.bytes[24],e.bytes[25],e.bytes[26]]),_=e.bytes[27],v=LPP_MEASURANDS_BY_ID[_]??`Unknown`,y=e.bytes[28];return{data:{messageType:7,configurationId:t,deviceInformation:{productId:n,productIdName:r,sensorId:a,sensorIdName:o,lpwanId:s,lpwanIdName:c,wirelessModuleFirmwareVersion:u,wirelessModuleHardwareVersion:d,serialNumber:m,measurementRangeStart:h,measurementRangeEnd:g,measurand:_,measurandName:v,unit:y,unitName:LPP_UNITS_BY_ID[y]??`Unknown`,productSubId:i,productSubIdName:l}}}},handleKeepAliveMessage=e=>{if(e.bytes.length!==3)throw Error(`Keep alive message (0x08) requires 3 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=e.bytes[2];return{data:{messageType:8,configurationId:t,deviceStatistic:{batteryLevelNewEvent:(n&128)>>7==1,batteryLevelPercent:n&127}}}},handleChannelFailureAlarmMessage=e=>{if(e.bytes.length!==5)throw Error(`Channel failure alarm message (0x0A) requires 5 bytes, but received ${e.bytes.length} bytes`);let t=e.bytes[1],n=e.bytes[2]&15,r=(e.bytes[3]<<8|e.bytes[4])&32767,i=[];return Object.entries(MEASUREMENT_ALARM_TYPES).forEach(([e,t])=>{(r&t)!==0&&i.push(e)}),{data:{messageType:10,configurationId:t,channelFailureAlarm:{sensorId:0,channelId:n,channelName:`measurement`,alarmType:r,alarmTypeNames:i}}}},netris1EncoderFactory=e=>{let t=NETRIS1_DOWNLINK_FEATURE_FLAGS;return n=>NETRIS1TULIP2EncodeHandler(validateTULIP2DownlinkInput(n,e.getChannels(),t,[createNETRIS1TULIP2GetConfigurationSchema(),createNETRIS1TULIP2ResetBatterySchema()]))},netris1MultipleEncodeFactory=e=>{let t=NETRIS1_DOWNLINK_FEATURE_FLAGS;return n=>NETRIS1TULIP2EncodeHandler(validateTULIP2DownlinkInput(n,e.getChannels(),t,[createNETRIS1TULIP2GetConfigurationSchema(),createNETRIS1TULIP2ResetBatterySchema()]),!0)};function createTULIP2NETRIS1Codec(){return defineTULIP2Codec({deviceName:NETRIS1_NAME,roundingDecimals:4,channels:createTULIP2NETRIS1Channels(),handlers:{1:handleDataMessage,2:handleDataMessage,3:handleProcessAlarmMessage,4:handleTechnicalAlarmMessage,5:handleDeviceAlarmMessage,7:handleDeviceIdentificationMessage,8:handleKeepAliveMessage,10:handleChannelFailureAlarmMessage},encoderFactory:netris1EncoderFactory,multipleEncodeFactory:netris1MultipleEncodeFactory})}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=optional(pipe(number(),integer(),minValue(0)))),t.overTemperatureCmChip&&(n.overTemperatureCmChip=optional(pipe(number(),integer(),minValue(-40),maxValue(85)))),t.underTemperatureCmChip&&(n.underTemperatureCmChip=optional(pipe(number(),integer(),minValue(-40),maxValue(85)))),t.downlinkAnswerTimeout&&(n.downlinkAnswerTimeout=optional(pipe(number(),integer(),minValue(0)))),t.fetchAdditionalDownlinkTimeInterval&&(n.fetchAdditionalDownlinkTimeInterval=optional(pipe(number(),integer(),minValue(0)))),t.enableBleAdvertising&&(n.enableBleAdvertising=optional(boolean())),object(n)}function createSensorWriteMultipleSchema(e){let t=Object.entries(e).reduce((e,[t,n])=>(t.startsWith(`channel`)&&(e[t]=optional(createChannelWriteMultipleSchema(n))),e),{});return object(_objectSpread2({configuration:optional(createSensorConfigurationWriteSchema(e))},t))}function createWriteInputDataMultipleSchema(e){let t=Object.entries(e).reduce((e,[t,n])=>(t.startsWith(`sensor`)&&(e[t]=optional(createSensorWriteMultipleSchema(n))),e),{});return object(_objectSpread2({communicationModule:optional(object({configuration:optional(createCommunicationModuleConfigurationWriteSchema(e))}))},t))}function createDownlinkMetadataSchema(){return object({byteLimit:optional(pipe(number(),integer(),minValue(11))),startingFrameCounter:optional(pipe(number(),integer(),minValue(0),maxValue(31))),autoApplyConfig:optional(boolean())})}function createReadRegistersActionMultipleSchema(e){return object({action:literal(`readRegisters`),metadata:optional(createDownlinkMetadataSchema()),input:createReadInputDataMultipleSchema(e)})}function createWriteRegistersActionMultipleSchema(e){return object({action:literal(`writeRegisters`),metadata:optional(createDownlinkMetadataSchema()),input:createWriteInputDataMultipleSchema(e)})}function createForceCloseSessionActionSchema(){return object({action:literal(`forceCloseSession`),metadata:optional(createDownlinkMetadataSchema())})}function createRestoreDefaultConfigurationActionSchema(){return object({action:literal(`restoreDefaultConfiguration`),metadata:optional(createDownlinkMetadataSchema())})}function createNewBatteryInsertedActionSchema(){return object({action:literal(`newBatteryInserted`),metadata:optional(createDownlinkMetadataSchema())})}function createGetAlarmStatusActionSchema(e){return object({action:literal(`getAlarmStatus`),metadata:optional(createDownlinkMetadataSchema()),input:createGetAlarmStatusSchema(e)})}function createTULIP3DownlinkMultipleSchema(e){return variant(`action`,[createReadRegistersActionMultipleSchema(e),createWriteRegistersActionMultipleSchema(e),createForceCloseSessionActionSchema(),createRestoreDefaultConfigurationActionSchema(),createNewBatteryInsertedActionSchema(),createGetAlarmStatusActionSchema(e)])}function encodeForceCloseSession(e){return[3,1]}function encodeRestoreDefaultConfiguration(e){return[3,2]}function encodeNewBatteryInserted(e){return[3,3]}function isRequestingAllTargets(e,t){if(!e)return!0;let n=Object.keys(t).filter(e=>e.startsWith(`sensor`));for(let r of n){let n=e[r],i=t[r];if(!i||typeof i!=`object`)continue;if(!n)return!1;let a=Object.keys(i).filter(e=>e.startsWith(`channel`));for(let e of a)if(!n[e])return!1}return!0}function encodeGetAlarmStatus(e,t){let n=0;if(e.processAlarmRequested&&(n|=1),e.cmAlarmRequested&&(n|=2),e.sensorAlarmRequested&&(n|=4),e.channelAlarmRequested&&(n|=8),n===0)throw Error(`At least one alarm type must be requested`);let r=[4,1,n];if(isRequestingAllTargets(e.targets,t))return r;let i=e.targets,a=[],o=Object.keys(i).filter(e=>e.startsWith(`sensor`)).sort();for(let e of o){let t=i[e];if(!t)continue;let n=Number.parseInt(e.replace(`sensor`,``))-1,r=Object.keys(t).filter(e=>e.startsWith(`channel`)).sort();for(let e of r){if(!t[e])continue;let r=Number.parseInt(e.replace(`channel`,``))-1,i=(n&3)<<6|(r&7)<<3;a.push(i)}}return[...r,...a]}function encodeForceCloseSessionComplete(e){let t=encodeForceCloseSession({});if(t.length>e.byteLimit)throw Error(`Frame size ${t.length} exceeds limit of ${e.byteLimit} bytes`);return{fPort:1,frames:[t]}}function encodeRestoreDefaultConfigurationComplete(e){let t=encodeRestoreDefaultConfiguration({});if(t.length>e.byteLimit)throw Error(`Frame size ${t.length} exceeds limit of ${e.byteLimit} bytes`);return{fPort:1,frames:[t]}}function encodeNewBattery