From 8e796563dd2e59a32e952d02279c1966a3b93ddd Mon Sep 17 00:00:00 2001 From: Mateus Silva Date: Fri, 31 May 2024 18:00:05 -0300 Subject: [PATCH 1/4] chore: Update npm dependencies and add unplugin-swc for faster compilation --- biome.jsonc | 2 +- package-lock.json | 254 +++++++++++++++++++++++++++++++++++ package.json | 1 + src/functions/decoder-run.ts | 6 +- tsconfig.json | 1 + vite.config.ts | 13 +- 6 files changed, 270 insertions(+), 7 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index abb48b54..7f79cf3a 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -11,7 +11,7 @@ }, "organizeImports": { "enabled": true }, "linter": { - "ignore": ["node_modules"], + "ignore": ["node_modules", "./decoders/**/v1.0.0/*.ts", "./decoders/**/v1.0.0/payload.js"], "enabled": true, "rules": { "recommended": true, diff --git a/package-lock.json b/package-lock.json index ff404ff9..793945c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "knex": "3.1.0", "moment-timezone": "0.5.45", "sqlite3": "5.1.7", + "unplugin-swc": "1.4.5", "uuid": "9.0.1", "validator": "13.12.0", "vitest": "1.6.0", @@ -598,6 +599,34 @@ "node": ">=10" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", @@ -1254,6 +1283,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -1323,6 +1365,18 @@ "prebuild-install": "^7.1.1" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -1354,6 +1408,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1447,6 +1513,30 @@ "node": "*" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1761,6 +1851,18 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1894,6 +1996,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2082,6 +2196,18 @@ "node": ">= 12" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -2094,6 +2220,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2104,6 +2239,18 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -2111,6 +2258,15 @@ "dev": true, "optional": true }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -2205,6 +2361,15 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -2586,6 +2751,15 @@ "node": ">=6" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -2737,6 +2911,18 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", @@ -2891,6 +3077,18 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -3415,6 +3613,18 @@ "node": ">=14.0.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3468,6 +3678,35 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/unplugin": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin-swc": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/unplugin-swc/-/unplugin-swc-1.4.5.tgz", + "integrity": "sha512-ltkJ70kjL53onJrypaMmKDiOvhghNUCbCxjxT6Ir0eAMIBsOfRhPt6vQtxB8R/6wYk/TfIJ2gCgdx2uKNPJRHA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "load-tsconfig": "^0.2.5", + "unplugin": "^1.10.1" + }, + "peerDependencies": { + "@swc/core": "^1.2.108" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3664,6 +3903,21 @@ "node": ">=6.0" } }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 4a413cee..fa7b952f 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "knex": "3.1.0", "moment-timezone": "0.5.45", "sqlite3": "5.1.7", + "unplugin-swc": "1.4.5", "uuid": "9.0.1", "validator": "13.12.0", "vitest": "1.6.0", diff --git a/src/functions/decoder-run.ts b/src/functions/decoder-run.ts index ea9cc611..010d4279 100644 --- a/src/functions/decoder-run.ts +++ b/src/functions/decoder-run.ts @@ -11,7 +11,7 @@ import moment from "moment-timezone"; import { buildTS } from "../helpers/build-ts"; function decoderRun(file_path: string, params = {}) { - let file = fs.readFileSync(path.join(__dirname, "../", file_path), "utf-8"); + let file = fs.readFileSync(path.join(__dirname, "../../", file_path), "utf-8"); file = buildTS(file); @@ -19,8 +19,8 @@ function decoderRun(file_path: string, params = {}) { vm.freeze(moment, "moment"); const footer = "\n ; this.payload"; return vm.run(`${file}${footer}`); -}; +} // ? It is necessary to export in this way to be used in the tests module.exports = decoderRun; // ? CommonJS -export {decoderRun }; // ? ESM +export { decoderRun }; // ? ESM diff --git a/tsconfig.json b/tsconfig.json index bf014a20..8705d6e5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "types": ["vitest/importMeta", "vitest/globals"], "target": "ES2022", "module": "ESNext", "moduleResolution": "node", diff --git a/vite.config.ts b/vite.config.ts index 142f4cac..ec5ec083 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,14 @@ -import { defineConfig } from 'vitest/config' +import swc from "unplugin-swc"; +import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - exclude: ['**/node_modules/**'], + globals: true, + exclude: ["**/node_modules/**"], }, -}) + plugins: [ + swc.vite({ + module: { type: "es6" }, + }), + ], +}); From db87af4a5d76a38e362c28d9db35f999ed11a17b Mon Sep 17 00:00:00 2001 From: Mateus Silva Date: Fri, 31 May 2024 18:00:32 -0300 Subject: [PATCH 2/4] chore: Add Advantech WISE-2410 connector and its dependencies --- .../advantech/wise-2410/assets/logo.png | Bin 0 -> 9295 bytes .../advantech/wise-2410/connector.jsonc | 13 + .../advantech/wise-2410/description.md | 1 + .../wise-2410/v1.0.0/payload-config.jsonc | 25 + .../wise-2410/v1.0.0/payload.test.ts | 153 ++ .../advantech/wise-2410/v1.0.0/payload.ts | 1277 +++++++++++++++++ 6 files changed, 1469 insertions(+) create mode 100644 decoders/connector/advantech/wise-2410/assets/logo.png create mode 100644 decoders/connector/advantech/wise-2410/connector.jsonc create mode 100644 decoders/connector/advantech/wise-2410/description.md create mode 100644 decoders/connector/advantech/wise-2410/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/advantech/wise-2410/v1.0.0/payload.test.ts create mode 100644 decoders/connector/advantech/wise-2410/v1.0.0/payload.ts diff --git a/decoders/connector/advantech/wise-2410/assets/logo.png b/decoders/connector/advantech/wise-2410/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..83df2eb079cd8f41e208e2b8053a7b68431682b9 GIT binary patch literal 9295 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 K%C$;1k^cjb5gM!j literal 0 HcmV?d00001 diff --git a/decoders/connector/advantech/wise-2410/connector.jsonc b/decoders/connector/advantech/wise-2410/connector.jsonc new file mode 100644 index 00000000..f03f4d33 --- /dev/null +++ b/decoders/connector/advantech/wise-2410/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Advantech WISE-2410", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/advantech/wise-2410/description.md b/decoders/connector/advantech/wise-2410/description.md new file mode 100644 index 00000000..6003bc46 --- /dev/null +++ b/decoders/connector/advantech/wise-2410/description.md @@ -0,0 +1 @@ +Industrial smart sensor with accelerometer and temperature sensors over LoRaWAN™ \ No newline at end of file diff --git a/decoders/connector/advantech/wise-2410/v1.0.0/payload-config.jsonc b/decoders/connector/advantech/wise-2410/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..e7d60618 --- /dev/null +++ b/decoders/connector/advantech/wise-2410/v1.0.0/payload-config.jsonc @@ -0,0 +1,25 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "WISE-2410 is a LoRaWAN wireless condition monitoring sensor integrated with an ARM Cortex-M4 processor, LoRa transceiver, 3-axis accelerometer and temperature sensor. It balances the wireless bandwidth between WISE-2410 and the gateway, so it also mitigates the data transmission fail rates between edge-devices and gateways.\n\nFeatures: \n* LoRaWAN wireless connectivity\n* Built-in 3-axis accelerometer and temperature sensor\n* On-board computing. Directly sends VRMS, ARMS, Peak, Displacement, Kurtosis, Crest factor, Skewness and Standard Deviation values to applications\n* Support battery power supply, no wiring installation needed\n* Easy settings with user friendly interfaces on WISE Studio utility\n* ISO 10816-1 compliant\n* Support wide temperature -20 ~ 80 °C (Battery-powered)\n* IP66 enclosure design\n\n \nProduct Website:\n* https://www.advantech.com/pt-br/products/b7e2306f-d561-4ca9-b0e3-33f7057e185f/wise-2410/mod_25018dc7-355c-40b4-bf9b-c93f6c73f1a0", + "install_end_text": "# Advantech WISE-2410 Dashboard Template\n\n\n\n![Template Image](https://api.tago.io/file/5bbcb03b667d7a002e56664b/advantech/smallwise2410dashimg.png)\n\n\n\nInstall the dashboard template by clicking [here](https://admin.tago.io/template/660beb6c2bbc8d00091dd697).", + "device_annotation": "Install the dashboard template by clicking [here](https://admin.tago.io/template/660beb6c2bbc8d00091dd697).", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/advantech/wise-2410/v1.0.0/payload.test.ts b/decoders/connector/advantech/wise-2410/v1.0.0/payload.test.ts new file mode 100644 index 00000000..615be206 --- /dev/null +++ b/decoders/connector/advantech/wise-2410/v1.0.0/payload.test.ts @@ -0,0 +1,153 @@ +import { describe, test, expect } from "vitest"; +import { decoderRun } from "../../../../../src/functions/decoder-run"; + +const file_path = "decoders/connector/advantech/wise-2410/v1.0.0/payload.ts" as const; + +function preparePayload(payloadHex) { + let payload = [{ variable: "payload", value: payloadHex }]; + payload = decoderRun(file_path, { payload }); + //y axis + const accelerometer_y_axis_senevent = payload.find((item) => item.variable === "accelerometer_y_axis_senevent"); + const accelerometer_y_axis_crestfactor = payload.find((item) => item.variable === "accelerometer_y_axis_crestfactor"); + const accelerometer_y_axis_kurtosis = payload.find((item) => item.variable === "accelerometer_y_axis_kurtosis"); + const accelerometer_y_axis_rms = payload.find((item) => item.variable === "accelerometer_y_axis_rms"); + const accelerometer_y_axis_peak = payload.find((item) => item.variable === "accelerometer_y_axis_peak"); + const accelerometer_y_axis_oavelocity = payload.find((item) => item.variable === "accelerometer_y_axis_oavelocity"); + const accelerometer_y_axis_skewness = payload.find((item) => item.variable === "accelerometer_y_axis_skewness"); + const accelerometer_y_axis_deviation = payload.find((item) => item.variable === "accelerometer_y_axis_deviation"); + const accelerometer_y_axis_peak_to_peak_displacement = payload.find((item) => item.variable === "accelerometer_y_axis_peak_to_peak_displacement"); + //x axis + const accelerometer_x_axis_senevent = payload.find((item) => item.variable === "accelerometer_x_axis_senevent"); + const accelerometer_x_axis_crestfactor = payload.find((item) => item.variable === "accelerometer_x_axis_crestfactor"); + const accelerometer_x_axis_kurtosis = payload.find((item) => item.variable === "accelerometer_x_axis_kurtosis"); + const accelerometer_x_axis_rms = payload.find((item) => item.variable === "accelerometer_x_axis_rms"); + const accelerometer_x_axis_peak = payload.find((item) => item.variable === "accelerometer_x_axis_peak"); + const accelerometer_x_axis_oavelocity = payload.find((item) => item.variable === "accelerometer_x_axis_oavelocity"); + const accelerometer_x_axis_skewness = payload.find((item) => item.variable === "accelerometer_x_axis_skewness"); + const accelerometer_x_axis_deviation = payload.find((item) => item.variable === "accelerometer_x_axis_deviation"); + const accelerometer_x_axis_peak_to_peak_displacement = payload.find((item) => item.variable === "accelerometer_x_axis_peak_to_peak_displacement"); + //z axis + const accelerometer_z_axis_senevent = payload.find((item) => item.variable === "accelerometer_z_axis_senevent"); + const accelerometer_z_axis_crestfactor = payload.find((item) => item.variable === "accelerometer_z_axis_crestfactor"); + const accelerometer_z_axis_kurtosis = payload.find((item) => item.variable === "accelerometer_z_axis_kurtosis"); + const accelerometer_z_axis_rms = payload.find((item) => item.variable === "accelerometer_z_axis_rms"); + const accelerometer_z_axis_peak = payload.find((item) => item.variable === "accelerometer_z_axis_peak"); + const accelerometer_z_axis_oavelocity = payload.find((item) => item.variable === "accelerometer_z_axis_oavelocity"); + const accelerometer_z_axis_skewness = payload.find((item) => item.variable === "accelerometer_z_axis_skewness"); + const accelerometer_z_axis_deviation = payload.find((item) => item.variable === "accelerometer_z_axis_deviation"); + const accelerometer_z_axis_peak_to_peak_displacement = payload.find((item) => item.variable === "accelerometer_z_axis_peak_to_peak_displacement"); + + const temphumi_senval = payload.find((item) => item.variable === "temphumi_senval"); + const temphumi_event = payload.find((item) => item.variable === "temphumi_event"); + const temphumi_status = payload.find((item) => item.variable === "temphumi_status"); + const temphumi_range = payload.find((item) => item.variable === "temphumi_range"); + + const accelerometer_time = payload.find((item) => item.variable === "accelerometer_time"); + const accelerometer_logindex = payload.find((item) => item.variable === "accelerometer_logindex"); + const device_batteryvolt = payload.find((item) => item.variable === "device_batteryvolt"); + const device_powersrc = payload.find((item) => item.variable === "device_powersrc"); + const device_events = payload.find((item) => item.variable === "device_events"); + + const parse_error = payload.find((item) => item.variable === "parse_error"); + return { + payload, + accelerometer_y_axis_senevent, + accelerometer_y_axis_crestfactor, + accelerometer_y_axis_kurtosis, + accelerometer_y_axis_rms, + accelerometer_y_axis_peak, + accelerometer_y_axis_oavelocity, + accelerometer_y_axis_skewness, + accelerometer_y_axis_deviation, + accelerometer_y_axis_peak_to_peak_displacement, + accelerometer_x_axis_senevent, + accelerometer_x_axis_crestfactor, + accelerometer_x_axis_kurtosis, + accelerometer_x_axis_rms, + accelerometer_x_axis_peak, + accelerometer_x_axis_oavelocity, + accelerometer_x_axis_peak_to_peak_displacement, + accelerometer_x_axis_skewness, + accelerometer_x_axis_deviation, + accelerometer_z_axis_senevent, + accelerometer_z_axis_crestfactor, + accelerometer_z_axis_kurtosis, + accelerometer_z_axis_rms, + accelerometer_z_axis_peak, + accelerometer_z_axis_oavelocity, + accelerometer_z_axis_peak_to_peak_displacement, + accelerometer_z_axis_skewness, + accelerometer_z_axis_deviation, + temphumi_senval, + temphumi_event, + temphumi_status, + temphumi_range, + accelerometer_time, + accelerometer_logindex, + device_batteryvolt, + device_powersrc, + device_events, + parse_error, + }; +} + +describe("Axis", () => { + test("should decode the payload correctly", () => { + const payloadHex = "817a585008070000001e7800005441e2ff0000100015000f000c0007021b000200040000001f001a001300feff9d011d000200090000001a001a001300f4ff8b01fbff0200070003000000000f6c016660091b00010000106c016696"; + const result = preparePayload(payloadHex); + + expect(result.accelerometer_y_axis_senevent?.value).toBe(0); + expect(result.accelerometer_y_axis_crestfactor?.value).toBe(4.13); + expect(result.accelerometer_y_axis_kurtosis?.value).toBe(-0.02); + expect(result.accelerometer_y_axis_rms?.value).toBe(0.019); + expect(result.accelerometer_y_axis_peak?.value).toBe(0.026); + expect(result.accelerometer_y_axis_oavelocity?.value).toBe(0.31); + expect(result.accelerometer_y_axis_skewness?.value).toBe(0.29); + expect(result.accelerometer_y_axis_deviation?.value).toBe(0.02); + expect(result.accelerometer_y_axis_peak_to_peak_displacement?.value).toBe(9); + + expect(result.accelerometer_x_axis_senevent?.value).toBe(0); + expect(result.accelerometer_x_axis_crestfactor?.value).toBe(5.19); + expect(result.accelerometer_x_axis_kurtosis?.value).toBe(0.12); + expect(result.accelerometer_x_axis_rms?.value).toBe(0.015); + expect(result.accelerometer_x_axis_peak?.value).toBe(0.021); + expect(result.accelerometer_x_axis_oavelocity?.value).toBe(0.16); + expect(result.accelerometer_x_axis_skewness?.value).toBe(0.27); + expect(result.accelerometer_x_axis_deviation?.value).toBe(0.02); + expect(result.accelerometer_x_axis_peak_to_peak_displacement?.value).toBe(4); + + expect(result.accelerometer_z_axis_senevent?.value).toBe(0); + expect(result.accelerometer_z_axis_crestfactor?.value).toBe(3.95); + expect(result.accelerometer_z_axis_kurtosis?.value).toBe(-0.12); + expect(result.accelerometer_z_axis_rms?.value).toBe(0.019); + expect(result.accelerometer_z_axis_peak?.value).toBe(0.026); + expect(result.accelerometer_z_axis_oavelocity?.value).toBe(0.26); + expect(result.accelerometer_z_axis_skewness?.value).toBe(-0.05); + expect(result.accelerometer_z_axis_deviation?.value).toBe(0.02); + expect(result.accelerometer_z_axis_peak_to_peak_displacement?.value).toBe(7); + + expect(result.temphumi_senval?.value).toBe(30.75); + expect(result.temphumi_event?.value).toBe(0); + expect(result.temphumi_status?.value).toBe(0); + expect(result.temphumi_range?.value).toBe(0); + + expect(result.accelerometer_time?.value).toBe(1711369231); + expect(result.accelerometer_logindex?.value).toBe(0); + expect(result.device_batteryvolt?.value).toBe(0); + expect(result.device_powersrc?.value).toBe(1); + expect(result.device_events?.value).toBe(0); + }); +}); + +describe("Shall not be parsed", () => { + let payload = [{ variable: "shallnotpass", value: "04096113950292" }]; + payload = decoderRun(file_path, { payload }); + + test("Output Result", () => { + expect(Array.isArray(payload)).toBe(true); + }); + + test("Not parsed Result", () => { + expect(payload).toEqual([{ variable: "shallnotpass", value: "04096113950292" }]); + }); +}); diff --git a/decoders/connector/advantech/wise-2410/v1.0.0/payload.ts b/decoders/connector/advantech/wise-2410/v1.0.0/payload.ts new file mode 100644 index 00000000..0fddc067 --- /dev/null +++ b/decoders/connector/advantech/wise-2410/v1.0.0/payload.ts @@ -0,0 +1,1277 @@ +/* eslint-disable unicorn/prefer-string-replace-all */ +/* eslint-disable unicorn/no-array-for-each */ +/* eslint-disable unicorn/prefer-string-slice */ +/* eslint-disable unicorn/prefer-date-now */ +/* eslint-disable unicorn/numeric-separators-style */ +/* eslint-disable unicorn/number-literal-case */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable unicorn/no-lonely-if */ +/* eslint-disable unicorn/prefer-at */ +/* eslint-disable unicorn/prefer-negative-index */ +/* eslint-disable no-undef */ +/* eslint-disable no-redeclare */ +/* eslint-disable curly */ +/* eslint-disable @typescript-eslint/restrict-plus-operands */ +/* eslint-disable no-var */ +// @ts-nocheck + +// Code received from Advantech, therfor after verifying with Vitor, Typescript will not be needed. + +//////////////////////////////////////////////////////////////////////////////// +// Advantech, iSensing SW team +// +// Frame Data Parser for WISE Lora modules (execute in Node-RED) +// +// version: 1.7.1 <2023/09/26> +// +//////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// User defined variables +/////////////////////////////////////// + +// If program is run in NodeRed. True: run in NodeRed, False: not run in NodeRed +var bIsRunNodeRed = false; + +// If MQTT publish message with Femto Gateway. True: publish with Femto Gateway, False: not publish with Femto Gateway +var bIsFemtoGateway = false; + +/////////////////////////////////////// +// User defined variables +/////////////////////////////////////// + +//Min Frame length +const MIN_FRAME_LENGTH = 4; + +//Header +const MASK_HEADER_FIRST_SEGMENT = 0x80; +const MASK_HEADER_ADDRESS_MODE = 0x0c; +const MASK_HEADER_ADDRESS_NONE = 0x00; +const MASK_HEADER_ADDRESS_2_OCTECT = 0x04; +const MASK_HEADER_ADDRESS_8_OCTECT = 0x08; +const MASK_HEADER_FRAME_VERSION = 0x03; + +//Payload Data +//AI +const PAYLOAD_DI_DATA = 0x00; +//DO +const PAYLOAD_DO_DATA = 0x10; +//DI +const PAYLOAD_AI_DATA = 0x30; +//Sensor +const PAYLOAD_SENSOR_DATA = 0x50; +//Device Status +const PAYLOAD_DEVICE_DATA = 0x60; +//Coil data +const PAYLOAD_COIL_DATA = 0x70; +//Register data +const PAYLOAD_REGISTER_DATA = 0x80; + +//DI +const MASK_PAYLOAD_DI_STATUS = 0x01; +const MASK_PAYLOAD_DI_VALUE = 0x02; +const MASK_PAYLOAD_DI_EVENT = 0x04; +const DI_MODE_FREQUENCY = 4; + +//DO +const MASK_PAYLOAD_DO_STATUS = 0x01; +const MASK_PAYLOAD_DO_ABSOLUTE_PULSE_OUTPUT = 0x02; +const MASK_PAYLOAD_DO_INCREMENTAL_PULSE_OUTPUT = 0x04; + +//AI +const MASK_PAYLOAD_AI_STATUS = 0x01; +const MASK_PAYLOAD_AI_RAW_VALUE = 0x02; +const MASK_PAYLOAD_AI_EVENT = 0x04; +const MASK_PAYLOAD_AI_MAX_VALUE = 0x08; +const MASK_PAYLOAD_AI_MIN_VALUE = 0x10; + +const MASK_PAYLOAD_AI_MASK2_RANGE = 0x01; + +//Sensor Range +const MASK_PAYLOAD_SENSOR_TEMP_C_TYPE = 0x00; +const MASK_PAYLOAD_SENSOR_TEMP_F_TYPE = 0x01; +const MASK_PAYLOAD_SENSOR_TEMP_K_TYPE = 0x02; +const MASK_PAYLOAD_SENSOR_HUMIDITY_TYPE = 0x03; +const MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_G = 0x04; +const MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_MS2 = 0x05; + +const MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_STATUS = 0x01; +const MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_EVENT = 0x02; +const MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_VALUE = 0x04; +const MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_MAX_VALUE = 0x08; +const MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_MIN_VALUE = 0x10; + +const MASK_PAYLOAD_SENSOR_AXIS_X_MASK = 0x01; +const MASK_PAYLOAD_SENSOR_AXIS_Y_MASK = 0x02; +const MASK_PAYLOAD_SENSOR_AXIS_Z_MASK = 0x04; + +const MASK_PAYLOAD_SENSOR_MASK2_LOGINDEX = 0x01; +const MASK_PAYLOAD_SENSOR_MASK2_TIME = 0x02; + +//Sensor Extend Mask +const MASK_PAYLOAD_SENSOR_EXTMASK_VELOCITY = 0x01; +const MASK_PAYLOAD_SENSOR_EXTMASK_PEAK = 0x02; +const MASK_PAYLOAD_SENSOR_EXTMASK_RMS = 0x04; +const MASK_PAYLOAD_SENSOR_EXTMASK_KURTOSIS = 0x08; +const MASK_PAYLOAD_SENSOR_EXTMASK_CRESTFACTOR = 0x10; +const MASK_PAYLOAD_SENSOR_EXTMASK_SKEWNESS = 0x20; +const MASK_PAYLOAD_SENSOR_EXTMASK_STDDEVIATION = 0x40; +const MASK_PAYLOAD_SENSOR_EXTMASK_DISPLACEMENT = 0x80; + +//Massive data +const MASK_PAYLOAD_SENSOR_EXTMASK_B = 0x01; +const MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_INFO = 0x01; +const MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_SEC = 0x02; +const MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_LOG = 0x04; + +//Massive Data Type +const MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_MASSIVE_TYPE = 0x03; +const MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_SAMPLE_PER_AXIS = 0x0c; +const MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_BYTES_PER_SAMPLE = 0x10; +const MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_MASSIVE_TYPE_FFT = 0x01; + +/////////////////////////////////////// +//Device Status +const MASK_DEVICE_EVENT = 0x01; +const MASK_DEVICE_POWER_SOURCE = 0x02; +const MASK_DEVICE_BATTERY_LEVEL = 0x04; +const MASK_DEVICE_BATTERY_VOLTAGE = 0x08; +const MASK_DEVICE_TIMESTAMP = 0x10; +const MASK_DEVICE_POSITION = 0x20; + +const MASK_DEVICE_POSITION_LATITUDE = 0x02; +const MASK_DEVICE_POSITION_LONGITUDE = 0x01; + +//Coil Data +const MASK_PAYLOAD_COIL_STATUS = 0x01; +const MASK_PAYLOAD_COIL_VALUE = 0x02; +const MASK_PAYLOAD_COIL_MULTI_CH = 0x04; + +//Register Data +const MASK_PAYLOAD_REGISTER_STATUS = 0x01; +const MASK_PAYLOAD_REGISTER_VALUE = 0x02; +const MASK_PAYLOAD_REGISTER_MULTI_CH = 0x04; + +/////////////////////////////////////// +// Variables +//////////////////////////////////////////// + +//input data is hex string + +var version; +var payload_mac; + +//If program executes in NodeRed, get input data from msg.payload.data +if (bIsRunNodeRed) { + if (bIsFemtoGateway) { + payloadHex = msg.payload[0].data; + payload_mac = msg.payload[0].macAddr; + } else { + payloadHex = msg.payload.data; + if (msg.payload.macAddr) { + payload_mac = msg.payload.macAddr; + } else { + payload_mac = ""; + } + } +} else { + var msg = {}; + msg.payload = ""; +} + +/* 8bit-CRC: 0x07 = x8 + x2 + x + 1 */ +var au8CRC8_Pol07_Table = [ + 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, + 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, + 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, + 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, + 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, 0xf9, + 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, + 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, + 0x7f, 0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, + 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3, +]; + +//////////////////////////////////////////// +// Functions +//////////////////////////////////////////// + +function transformData(data, parentKey = "") { + let transformed = []; + + Object.keys(data).forEach((key) => { + // Process the key to be in lowercase and replace spaces with underscores + const processedKey = key.toLowerCase().replace(/\s+/g, "_"); + // Initially form the newKey, then replace "." and "-" with "_" + let newKey = parentKey ? `${parentKey}.${processedKey}` : processedKey; + // Replace "." and "-" with "_" in the newKey + newKey = newKey.replace(/[.-]/g, "_"); + + if (typeof data[key] === "object" && data[key] !== null && !Array.isArray(data[key])) { + // Recursively call transformData for nested objects + transformed = transformed.concat(transformData(data[key], newKey)); + } else { + // Push the processed key and value to the transformed array + transformed.push({ variable: newKey, value: data[key] }); + } + }); + + return transformed; +} + +if (!bIsRunNodeRed) { + var node = function () {}; + node.warn = function (arg) { + console.log(arg); + }; + node.error = function (arg) { + console.error(arg); + }; +} + +function addZero(i) { + i = i + ""; + if (i.length < 2) { + i = "0" + i; + } + return i; +} + +function translateInt32(a, b, c, d) { + return (d << 24) + (c << 16) + (b << 8) + a; +} + +function translateInt24(a, b, c) { + return (c << 16) + (b << 8) + a; +} + +function translateInt16(a, b) { + return a + (b << 8); +} + +function convertMaskToArray(number, channelCount) { + var biArray = []; + var temp; + for (var i = 0; i < channelCount; ++i) { + temp = number; + temp = temp >> i; + biArray.push(temp & 1); + } + return biArray; +} + +function convertToSignedInt16(number) { + if ((number & 0x8000) > 0) { + number = number - 0x10000; + } + return number; +} + +function convertToSignedInt32(number) { + if ((number & 0x80000000) > 0) { + number = number - 0x100000000; + } + return number; +} + +function parseAxisData(index, bIsSensorEventExist, extMask, jsonObj, range) { + if (bIsSensorEventExist) { + jsonObj.SenEvent = translateInt16(hexArr[index++], hexArr[index++]); + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_VELOCITY) { + jsonObj.OAVelocity = translateInt16(hexArr[index++], hexArr[index++]) / 100; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_PEAK) { + if (range === MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_G) { + jsonObj.Peak = translateInt16(hexArr[index++], hexArr[index++]) / 1000; + } else { + jsonObj.Peak = translateInt16(hexArr[index++], hexArr[index++]) / 100; + } + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_RMS) { + if (range === MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_G) { + jsonObj.RMS = translateInt16(hexArr[index++], hexArr[index++]) / 1000; + } else { + jsonObj.RMS = translateInt16(hexArr[index++], hexArr[index++]) / 100; + } + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_KURTOSIS) { + jsonObj.Kurtosis = convertToSignedInt16(translateInt16(hexArr[index++], hexArr[index++])) / 100; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_CRESTFACTOR) { + jsonObj.CrestFactor = convertToSignedInt16(translateInt16(hexArr[index++], hexArr[index++])) / 100; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_SKEWNESS) { + jsonObj.Skewness = convertToSignedInt16(translateInt16(hexArr[index++], hexArr[index++])) / 100; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_STDDEVIATION) { + jsonObj.Deviation = convertToSignedInt16(translateInt16(hexArr[index++], hexArr[index++])) / 100; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_DISPLACEMENT) { + jsonObj["Peak-to-Peak Displacement"] = translateInt16(hexArr[index++], hexArr[index++]); + } + + return index; +} + +function DIParse(index) { + var length; + var mode = hexArr[index++] & 0x0f; + + if (version > 0) { + length = hexArr[index++]; + } + + var channel = hexArr[index++]; + if (version > 0) length -= 1; // channel index and mask + var channelIndex = (channel & 0xe0) >> 5; + var channelMask = channel & 0x07; + + message["DI" + channelIndex] = {}; + + if (channelMask & MASK_PAYLOAD_DI_STATUS) { + var arrBinary = convertMaskToArray(hexArr[index++], 8); + if (version > 0) length -= 1; + + message["DI" + channelIndex].status = {}; + message["DI" + channelIndex].status["Signal Logic"] = arrBinary[0]; + message["DI" + channelIndex].status["Start Counter"] = arrBinary[1]; + message["DI" + channelIndex].status["Get/Clean Counter Overflow"] = arrBinary[2]; + // message['DI'+channelIndex].status['Clean Counter Status'] = arrBinary[3]; + message["DI" + channelIndex].status["Get/Clean L2H Latch"] = arrBinary[4]; + message["DI" + channelIndex].status["Get/Clean H2L Latch"] = arrBinary[5]; + } + + message["DI" + channelIndex].mode = mode; + + if (channelMask & MASK_PAYLOAD_DI_VALUE) { + if (mode == DI_MODE_FREQUENCY) { + // frequency mode + message["DI" + channelIndex].Frequency_Value = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + } else { + message["DI" + channelIndex].Counter_Value = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + } + if (version > 0) length -= 4; + } + + if (channelMask & MASK_PAYLOAD_DI_EVENT) { + message["DI" + channelIndex].Event = hexArr[index++]; + if (version > 0) length -= 1; + } + + if (version > 0) { + if (length > 0) { + index += length; + } + } + + return index; +} + +function DOParse(index) { + var length; + var mode = hexArr[index++] & 0x0f; + + if (version > 0) { + length = hexArr[index++]; + } + + var channel = hexArr[index++]; + if (version > 0) length -= 1; // channel index and mask + var channelIndex = (channel & 0xe0) >> 5; + var channelMask = channel & 0x07; + + message["DO" + channelIndex] = {}; + + var modeText = ""; + switch (mode) { + case 0: + modeText = "DO"; + break; + case 1: + modeText = "Pulse output"; + break; + case 2: + modeText = "Low to High delay"; + break; + case 3: + modeText = "High to Low delay"; + break; + case 4: + modeText = "AI alarm drive"; + break; + } + message["DO" + channelIndex].Mode = modeText; + + if (channelMask & MASK_PAYLOAD_DO_STATUS) { + var status = convertMaskToArray(hexArr[index++], 8); + if (version > 0) length -= 1; + message["DO" + channelIndex].status = {}; + message["DO" + channelIndex].status["Signal Logic"] = status[0]; + message["DO" + channelIndex].status["Pulse Output Continue"] = status[1]; + } + if (mode == 1) { + message["DO" + channelIndex].PulsAbs = 0; + message["DO" + channelIndex].PulsInc = 0; + } + if (channelMask & MASK_PAYLOAD_DO_ABSOLUTE_PULSE_OUTPUT) { + message["DO" + channelIndex].PulsAbs = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + if (version > 0) length -= 4; + } + if (channelMask & MASK_PAYLOAD_DO_INCREMENTAL_PULSE_OUTPUT) { + message["DO" + channelIndex].PulsInc = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + if (version > 0) length -= 4; + } + + if (version > 0) { + if (length > 0) { + index += length; + } + } + + return index; +} + +function AIParse(index) { + var length; + var range = hexArr[index++] & 0x0f; + + if (version > 0) { + length = hexArr[index++]; + } + + var channel = hexArr[index++]; + if (version > 0) length -= 1; // channel index and mask + var channelIndex = (channel & 0xe0) >> 5; + var channelMask = channel & 0x1f; + + message["AI" + channelIndex] = {}; + message["AI" + channelIndex].Range = range; + + if (channelMask & MASK_PAYLOAD_AI_STATUS) { + var status = convertMaskToArray(hexArr[index++], 8); + if (version > 0) length -= 1; + message["AI" + channelIndex].status = {}; + message["AI" + channelIndex].status["Low Alarm"] = status[0]; + message["AI" + channelIndex].status["High Alarm"] = status[1]; + } + if (channelMask & MASK_PAYLOAD_AI_RAW_VALUE) { + message["AI" + channelIndex]["Raw Data"] = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + if (channelMask & MASK_PAYLOAD_AI_EVENT) { + message["AI" + channelIndex].Event = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + if (channelMask & MASK_PAYLOAD_AI_MAX_VALUE) { + message["AI" + channelIndex].MaxVal = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + if (channelMask & MASK_PAYLOAD_AI_MIN_VALUE) { + message["AI" + channelIndex].MinVal = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + + if (version > 0 && length > 0) { + var mask2 = hexArr[index++]; + length -= 1; + if (mask2 & MASK_PAYLOAD_AI_MASK2_RANGE) { + message["AI" + channelIndex].Range = hexArr[index++]; + length -= 1; + } + if (length > 0) { + index += length; + } + } + + return index; +} + +function sensorParse(index) { + var length; + var range = hexArr[index] & 0x0f; + //Temperature/Humidity + if ( + range === MASK_PAYLOAD_SENSOR_TEMP_C_TYPE || + range === MASK_PAYLOAD_SENSOR_TEMP_F_TYPE || + range === MASK_PAYLOAD_SENSOR_TEMP_K_TYPE || + range === MASK_PAYLOAD_SENSOR_HUMIDITY_TYPE + ) { + if (version > 0) { + index++; + length = hexArr[index]; + } + + message.TempHumi = {}; + message.TempHumi.Range = range; + index++; + //message.TempHumi.ChIdx = hexArr[index] & 0xE0; + mask = hexArr[index] & 0x1f; + if (version > 0) length -= 1; // channel index and mask + index++; + + //if sensor status exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_STATUS) { + message.TempHumi.Status = hexArr[index++]; + if (version > 0) length -= 1; + } + //if sensor event exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_EVENT) { + message.TempHumi.Event = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + //if sensor value exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_VALUE) { + if (range === MASK_PAYLOAD_SENSOR_HUMIDITY_TYPE) { + message.TempHumi.SenVal = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]) / 1000; + } else { + message.TempHumi.SenVal = convertToSignedInt32(translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++])) / 1000; + } + if (version > 0) length -= 4; + } + //if sensor MAX value exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_MAX_VALUE) { + message.TempHumi.SenMaxVal = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]) / 100; + if (version > 0) length -= 4; + } + //if sensor MIN value exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_MIN_VALUE) { + message.TempHumi.SenMinVal = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]) / 100; + if (version > 0) length -= 4; + } + + if (version > 0) { + // reserved + // var mask2 = hexArr[index++]; + if (length > 0) { + index += length; + } + } + } + if (range === MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_G || range === MASK_PAYLOAD_SENSOR_ACCELERATOR_TYPE_MS2) { + bIsSensorEventExist = false; + + if (version > 0) { + index++; + var length = hexArr[index]; + } + + index++; + axisMask = (hexArr[index] & 0xe0) >> 5; + + var arrAxisMask = convertMaskToArray(axisMask, 8); + var intAxisMaskEnable = 0; + arrAxisMask.forEach(function (item) { + if (item == 1) { + intAxisMaskEnable++; + } + }); + + mask = hexArr[index] & 0x1f; + index++; + extMask = hexArr[index]; //extend mask + + var arrExtMask = convertMaskToArray(extMask, 8); + var intExtMaskEnable = 0; + arrExtMask.forEach(function (item) { + if (item == 1) { + intExtMaskEnable++; + } + }); + + if (!(mask & MASK_PAYLOAD_SENSOR_EXTMASK_B)) { + message.Accelerometer = {}; + + //if sensor event exist + if (mask & MASK_PAYLOAD_SENSOR_MASK_SENSNSOR_EVENT) { + bIsSensorEventExist = true; + } + index++; + + if (axisMask & MASK_PAYLOAD_SENSOR_AXIS_X_MASK) { + message.Accelerometer["X-Axis"] = {}; + index = parseAxisData(index, bIsSensorEventExist, extMask, message.Accelerometer["X-Axis"], range); + } + if (axisMask & MASK_PAYLOAD_SENSOR_AXIS_Y_MASK) { + message.Accelerometer["Y-Axis"] = {}; + index = parseAxisData(index, bIsSensorEventExist, extMask, message.Accelerometer["Y-Axis"], range); + } + if (axisMask & MASK_PAYLOAD_SENSOR_AXIS_Z_MASK) { + message.Accelerometer["Z-Axis"] = {}; + index = parseAxisData(index, bIsSensorEventExist, extMask, message.Accelerometer["Z-Axis"], range); + } + + length = length - 2 - intAxisMaskEnable * (intExtMaskEnable * 2 + (bIsSensorEventExist ? 2 : 0)); // Length - (Axis Mask + Mask) - Extend Mask A - Axis Data + message.Accelerometer.LogIndex = 0; + if (version > 0 && length > 0) { + var mask2 = hexArr[index++]; + length -= 1; + if (mask2 & MASK_PAYLOAD_SENSOR_MASK2_LOGINDEX) { + message.Accelerometer.LogIndex = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + length -= 4; + } + if (mask2 & MASK_PAYLOAD_SENSOR_MASK2_TIME) { + message.Accelerometer.Time = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + length -= 4; + } + if (length > 0) { + index += length; + } + } + } else { + // extend mask B + index++; + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_INFO) { + var dataType = hexArr[index++]; + var sampleRate = translateInt24(hexArr[index++], hexArr[index++], hexArr[index++]); + var points = translateInt16(hexArr[index++], hexArr[index++]); + var logIndex = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var timestamp = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var totalLength = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var massType = dataType & MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_MASSIVE_TYPE; + var bytesPerSample = (dataType & MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_BYTES_PER_SAMPLE) >> 4 > 0 ? 4 : 2; + var samplesPerAxis = + massType == MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_MASSIVE_TYPE_FFT && (dataType & MASK_PAYLOAD_SENSOR_MASSIVE_DATA_TYPE_SAMPLE_PER_AXIS) >> 2 > 0 + ? points / 2.56 / 2 + : points / 2.56; + var bytesPerAxis = bytesPerSample * samplesPerAxis; + + // length = length - Massive Info + length = length - 18; + + var objData = {}; + objData.timestamp = timestamp; + objData.lastSeq = hexArr[1]; + objData.lastPayload = hexArr; + objData.logIndex = logIndex; + objData.sampleRate = sampleRate; + objData.points = points; + objData.bytesPerSample = bytesPerSample; + objData.samplesPerAxis = samplesPerAxis; + objData.bytesPerAxis = bytesPerAxis; + objData.totalLength = totalLength; + } + if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_SEC) { + var FFTDataStorage = JSON.parse(); + if (typeof FFTDataStorage.timestamp == "undefined") { + throw "FFT Data lost first packet."; + } + + var axisType = ["X", "Y", "Z"]; + if (!(axisMask & MASK_PAYLOAD_SENSOR_AXIS_X_MASK)) { + var axisIndex = axisType.indexOf("X"); + if (axisIndex > -1) { + axisType.splice(axisIndex, 1); + } + } + if (!(axisMask & MASK_PAYLOAD_SENSOR_AXIS_Y_MASK)) { + var axisIndex = axisType.indexOf("Y"); + if (axisIndex > -1) { + axisType.splice(axisIndex, 1); + } + } + if (!(axisMask & MASK_PAYLOAD_SENSOR_AXIS_Z_MASK)) { + var axisIndex = axisType.indexOf("Z"); + if (axisIndex > -1) { + axisType.splice(axisIndex, 1); + } + } + + var logIndex = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var initialOffset = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var offset = initialOffset; + // length = length - (Axis Mask + Mask + Extend Mask + Log Index + Offset) + length = length - 10; + + message.FFT = {}; + if (!(extMask & MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_INFO)) { + if (FFTDataStorage.lastSeq === hexArr[1]) { + throw "Packet of FFT Data duplicated."; + } + + if ((("0x" + (FFTDataStorage.lastSeq + 1).toString(16)) & 0xff) !== hexArr[1]) { + // lost packet + var lastPayload = FFTDataStorage.lastPayload; + var lastOffset; + if (lastPayload[6] & MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_INFO) { + lastOffset = translateInt32(lastPayload[29], lastPayload[30], lastPayload[31], lastPayload[32]) + lastPayload[4] - 28; + } else { + lastOffset = translateInt32(lastPayload[11], lastPayload[12], lastPayload[13], lastPayload[14]) + lastPayload[4] - 10; + } + + if (logIndex != FFTDataStorage.logIndex) { + // previous FFT Data lost packet and next FFT Data lost first packet + var fillLength = FFTDataStorage.bytesPerAxis * intAxisMaskEnable - 1 - lastOffset; + var logIndex = FFTDataStorage.logIndex; + + var objData = {}; + objData.LOG_INDEX = logIndex; + objData.BYTE_OFFSET = lastOffset; + objData.LENGTH = fillLength; + throw "FFT Data lost first packet."; + } + + var fillLength = offset - lastOffset; + var logIndex = FFTDataStorage.logIndex; + + lostPacketInfo.LOG_INDEX = logIndex; + lostPacketInfo.BYTE_OFFSET = lastOffset; + lostPacketInfo.LENGTH = fillLength; + } + } + + var timestamp = FFTDataStorage.timestamp; + var logIndex = FFTDataStorage.logIndex; + var sampleRate = FFTDataStorage.sampleRate; + var points = FFTDataStorage.points; + var bytesPerSample = FFTDataStorage.bytesPerSample; + var samplesPerAxis = FFTDataStorage.samplesPerAxis; + var bytesPerAxis = FFTDataStorage.bytesPerAxis; + var totalLength = FFTDataStorage.totalLength; + message.FFT.LOG_INDEX = logIndex; + message.FFT.TIME = timestamp; + message.FFT.SAMPLING_RATE = sampleRate; + message.FFT.NUMBER_OF_SAMPLES = points; + message.FFT.START_BYTE_OFFSET = offset; + var axisData = {}; + csvMessage = '"TIME","AXIS_TYPE","DATA","LOG_INDEX","BYTE_OFFSET","SAMPLE_FREQ"\n'; + for (var i = 0; i < length / bytesPerSample; i++) { + var axis = offset < bytesPerAxis ? axisType[0] : offset < bytesPerAxis * 2 ? axisType[1] : axisType[2]; + var data = bytesPerSample == 2 ? translateInt16(hexArr[index++], hexArr[index++]) : translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + var sampleIndex = (offset % bytesPerAxis) / bytesPerSample; // by axis + // sampleFreq = sampleIndex * sampling rate / number of samples + var sampleFreq = sampleIndex * (sampleRate / points); + + if (typeof axisData[axis] == "undefined") { + axisData[axis] = {}; + axisData[axis].AXIS_TYPE = axis; + axisData[axis].START_SAMPLE_INDEX = sampleIndex; + axisData[axis].END_SAMPLE_INDEX = + offset % bytesPerAxis >= (initialOffset + length) % bytesPerAxis ? samplesPerAxis - 1 : ((initialOffset + length) % bytesPerAxis) / bytesPerSample - 1; + axisData[axis].DATA = []; + } + axisData[axis].DATA.push(data); + csvMessage += timestamp + "," + axis + "," + data + "," + logIndex + "," + offset + "," + Math.floor(sampleFreq * 1000) / 1000 + "\n"; + + offset += bytesPerSample; + if (offset >= totalLength) { + index = index + (length / bytesPerSample - i - 1) * bytesPerSample; + break; + } + } + message.FFT.END_BYTE_OFFSET = offset - 1; + message.FFT.AXIS_DATA = []; + for (i in axisData) { + message.FFT.AXIS_DATA.push(axisData[i]); + } + axisData = {}; + + if (offset != bytesPerAxis * intAxisMaskEnable) { + FFTDataStorage.lastSeq = hexArr[1]; + FFTDataStorage.lastPayload = hexArr; + } else { + var objData = {}; + } + } + // TBD + // if (extMask & MASK_PAYLOAD_SENSOR_EXTMASK_MASSIVE_DATA_LOG) { + + // } + } + } + + return index; +} + +function deviceParse(index) { + var length; + message.Device = {}; + index++; + if (version > 0) { + length = hexArr[index++]; + } + mask = hexArr[index++]; + if (version > 0) length -= 1; // mask + + if (mask & MASK_DEVICE_EVENT) { + message.Device.Events = hexArr[index++]; + if (version > 0) length -= 1; + } + if (mask & MASK_DEVICE_POWER_SOURCE) { + message.Device.PowerSrc = hexArr[index++]; + if (version > 0) length -= 1; + } + if (mask & MASK_DEVICE_BATTERY_LEVEL) { + message.Device.BatteryLevel = hexArr[index++]; + if (version > 0) length -= 1; + } + if (mask & MASK_DEVICE_BATTERY_VOLTAGE) { + message.Device.BatteryVolt = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + if (mask & MASK_DEVICE_TIMESTAMP) { + message.Device.Time = translateInt32(hexArr[index++], hexArr[index++], hexArr[index++], hexArr[index++]); + if (version > 0) length -= 4; + } + if (mask & MASK_DEVICE_POSITION) { + message.Device.GNSS = {}; + var latitudeStr = ""; + var longitudeStr = ""; + if (hexArr[index] & MASK_DEVICE_POSITION_LATITUDE) { + latitudeStr = "S"; + } else { + latitudeStr = "N"; + } + if (hexArr[index] & MASK_DEVICE_POSITION_LONGITUDE) { + longitudeStr = "W"; + } else { + longitudeStr = "E"; + } + index++; + + message.Device.GNSS.Latitude = (translateInt24(hexArr[index++], hexArr[index++], hexArr[index++]) / 100000).toFixed(5) + " " + latitudeStr; + message.Device.GNSS.Longitude = (translateInt24(hexArr[index++], hexArr[index++], hexArr[index++]) / 100000).toFixed(5) + " " + longitudeStr; + if (version > 0) length -= 7; + } + + if (version > 0) { + if (length > 0) { + index += length; + } + } + + return index; +} + +function coilParse(index) { + var length; + var mask = hexArr[index++] & 0x07; + + if (version > 0) { + length = hexArr[index++]; + } + + var channel = hexArr[index++]; + if (version > 0) length -= 1; // port and channel index + var port = (channel & 0x80) >> 7; + + if (mask & MASK_PAYLOAD_COIL_MULTI_CH) { + var infoLen = channel & 0x7f; + var recordLen = hexArr[index++]; + var dataMask = hexArr[index++]; + var i, + j, + k, + maskGroup, + chMask, + ch = 0; + var isSupportStatus = (dataMask & MASK_PAYLOAD_COIL_STATUS) == MASK_PAYLOAD_COIL_STATUS; + var isSupportData = (dataMask & MASK_PAYLOAD_COIL_VALUE) == MASK_PAYLOAD_COIL_VALUE; + + for (i = 1; i <= infoLen - 2; i++) { + maskGroup = hexArr[index++]; + i++; + for (j = 0; j < 7; j++) { + if ((maskGroup & (1 << j)) == 0) { + ch += 8; + continue; + } + chMask = hexArr[index++]; + i++; + for (k = 0; k < 8; k++) { + if ((chMask & (1 << k)) == 0) { + ch += 1; + continue; + } + message["RtuCoil" + port + "-" + ch] = {}; + ch += 1; + } + } + } + if (version > 0) length -= infoLen; + + for (i = 0; i < ch; i++) { + if (typeof message["RtuCoil" + port + "-" + i] != "undefined") { + if (isSupportStatus) { + message["RtuCoil" + port + "-" + i].Status = hexArr[index++]; + if (version > 0) length -= 1; + } + if (isSupportData) { + message["RtuCoil" + port + "-" + i].Data = hexArr[index++]; + if (version > 0) length -= 1; + } + } + } + } else { + var channelIndex = channel & 0x7f; + + message["RtuCoil" + port + "-" + channelIndex] = {}; + + if (mask & MASK_PAYLOAD_COIL_STATUS) { + message["RtuCoil" + port + "-" + channelIndex].Status = hexArr[index++]; + if (version > 0) length -= 1; + } + if (mask & MASK_PAYLOAD_COIL_VALUE) { + message["RtuCoil" + port + "-" + channelIndex].Data = hexArr[index++]; + if (version > 0) length -= 1; + } + } + + if (version > 0) { + if (length > 0) { + index += length; + } + } + + return index; +} + +function registerParse(index) { + var length; + var mask = hexArr[index++] & 0x07; + + if (version > 0) { + length = hexArr[index++]; + } + + var channel = hexArr[index++]; + if (version > 0) length -= 1; // port and channel index + var port = (channel & 0x80) >> 7; + + if (mask & MASK_PAYLOAD_REGISTER_MULTI_CH) { + var infoLen = channel & 0x7f; + var recordLen = hexArr[index++]; + var dataMask = hexArr[index++]; + var i, + j, + k, + maskGroup, + chMask, + ch = 0; + var isSupportStatus = (dataMask & MASK_PAYLOAD_REGISTER_STATUS) == MASK_PAYLOAD_REGISTER_STATUS; + var isSupportData = (dataMask & MASK_PAYLOAD_REGISTER_VALUE) == MASK_PAYLOAD_REGISTER_VALUE; + + for (i = 1; i <= infoLen - 2; i++) { + maskGroup = hexArr[index++]; + i++; + for (j = 0; j < 7; j++) { + if ((maskGroup & (1 << j)) == 0) { + ch += 8; + continue; + } + chMask = hexArr[index++]; + i++; + for (k = 0; k < 8; k++) { + if ((chMask & (1 << k)) == 0) { + ch += 1; + continue; + } + message["RtuRegister" + port + "-" + ch] = {}; + ch += 1; + } + } + } + if (version > 0) length -= infoLen; + + for (i = 0; i < ch; i++) { + if (typeof message["RtuRegister" + port + "-" + i] != "undefined") { + if (isSupportStatus) { + message["RtuRegister" + port + "-" + i].Status = hexArr[index++]; + if (version > 0) length -= 1; + } + if (isSupportData) { + message["RtuRegister" + port + "-" + i].Data = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + } + } + } else { + var channelIndex = channel & 0x7f; + + message["RtuRegister" + port + "-" + channelIndex] = {}; + + if (mask & MASK_PAYLOAD_REGISTER_STATUS) { + message["RtuRegister" + port + "-" + channelIndex].Status = hexArr[index++]; + if (version > 0) length -= 1; + } + if (mask & MASK_PAYLOAD_REGISTER_VALUE) { + message["RtuRegister" + port + "-" + channelIndex].Data = translateInt16(hexArr[index++], hexArr[index++]); + if (version > 0) length -= 2; + } + } + + if (version > 0) { + if (length > 0) { + index += length; + } + } + + return index; +} + +function parsePayLoad(index) { + //var bIsDataParsed = false; + var axisMask = ""; + var mask = ""; + var extMask = ""; //extend mask + var bIsSensorEventExist = false; + + //DI + if ((hexArr[index] & 0xf0) === PAYLOAD_DI_DATA) { + index = DIParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //DO + else if ((hexArr[index] & 0xf0) === PAYLOAD_DO_DATA) { + index = DOParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //AI + else if ((hexArr[index] & 0xf0) === PAYLOAD_AI_DATA) { + index = AIParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //Sensor Type + else if ((hexArr[index] & 0xf0) === PAYLOAD_SENSOR_DATA) { + index = sensorParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //Device Status + else if ((hexArr[index] & 0xf0) === PAYLOAD_DEVICE_DATA) { + index = deviceParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //Coil Data + else if ((hexArr[index] & 0xf0) === PAYLOAD_COIL_DATA) { + index = coilParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } + + //Register Data + else if ((hexArr[index] & 0xf0) === PAYLOAD_REGISTER_DATA) { + index = registerParse(index); + + if (index < arrLength - 1) { + //1: ignore CRC + parsePayLoad(index); + } + } +} + +function getSourceAddressLength(address) { + var addressLength = 0; + + if (address != "" && address != null) { + addressLength = address.length / 2; + } + + return addressLength; +} + +function checkFrameLength() { + var addressLength = getSourceAddressLength(message.SourceAddress); + + if (message.TotalLength + addressLength + 4 != arrLength) { + //4: Frame control + Sequence number + length + CRC + return false; + } else { + return true; + } +} + +function CrcCalc(u8Arr, u16Length) { + var u16i; + var u8CRC = 0xff; + + for (u16i = 0; u16i < u16Length; u16i++) { + u8CRC = au8CRC8_Pol07_Table[u8CRC ^ u8Arr[u16i]]; + } + return u8CRC; +} + +function checkPayloadLengthAndSetStorage(hexArr, sequence) { + var sourceAddressLen = 0; + if ((hexArr[0] & MASK_HEADER_ADDRESS_MODE) === MASK_HEADER_ADDRESS_2_OCTECT) { + sourceAddressLen = 2; + } else if ((hexArr[0] & MASK_HEADER_ADDRESS_MODE) === MASK_HEADER_ADDRESS_8_OCTECT) { + sourceAddressLen = 8; + } + // (Octet)packet length - Frame Control - Frame Sequence Number - Total Length - Source Address - CRC !== payload length + if (hexArr.length - 1 - 1 - 1 - sourceAddressLen - 1 !== hexArr[2]) { + var objData = {}; + objData.sequence = sequence !== null ? sequence : hexArr[1]; + objData.time = new Date().getTime(); + objData.payload = hexArr; + + return false; + } else { + return true; + } +} + +const WISE2410Payloadd = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data" || x.variable === "payload_hex"); + +//////////////////////////////////////////// +// Main +//////////////////////////////////////////// +if (WISE2410Payloadd) { + payloadHex = WISE2410Payloadd.value; + var message = {}; //output of this program + var csvMessage = ""; // csv data output for MQTT publish + var lostPacketInfo = {}; // data for packet re-transmission + + var i, arrLength; + var hexArr = []; //translated hex arry from input string + //var payload = {}; + var hexPayloadArr = []; + var arrayIndex = 0; //index of current processing position in hexArr + + arrLength = payloadHex.length; + + try { + if (arrLength < MIN_FRAME_LENGTH || arrLength % 2 !== 0) { + msg.payload = "received frame length error"; + } + + //parse hex string to array + arrLength = arrLength / 2; + + for (i = 0; i < arrLength; i++) { + hexArr.push(parseInt(payloadHex.substring(i * 2, i * 2 + 2), 16)); //parse hex + } + + // check frame structure version + version = hexArr[0] & MASK_HEADER_FRAME_VERSION; + + //check if this is first segment + if (!(hexArr[0] & MASK_HEADER_FIRST_SEGMENT)) { + // packet reassemble + + if (payloadStorage.sequence === hexArr[1]) { + msg.payload = "Sequence number repeat. Drop this packet."; + } + + if (typeof payloadStorage.sequence == "undefined" || (("0x" + (payloadStorage.sequence + 1).toString(16)) & 0xff) !== hexArr[1]) { + msg.payload = "Sequence number error. Packet may be lost."; + } + + if (typeof payloadStorage.time == "undefined" || new Date().getTime() - payloadStorage.time > 60000) { + msg.payload = "Timeout."; + } + + var currentSeq = hexArr[1]; + + hexArr = payloadStorage.payload.concat(hexArr.slice(2, hexArr.length)); + } + + arrLength = hexArr.length; + if (bIsFemtoGateway) { + message.mac = payload_mac; + } + //get sequence number + message.SequenceNumber = hexArr[++arrayIndex]; + //get payload length + message.TotalLength = hexArr[++arrayIndex]; + + var sourceAddress = ""; + + //check WHDR header: source address + if ((hexArr[0] & MASK_HEADER_ADDRESS_MODE) === MASK_HEADER_ADDRESS_NONE) { + arrayIndex++; + message.SourceAddress = null; + } else if ((hexArr[0] & MASK_HEADER_ADDRESS_MODE) === MASK_HEADER_ADDRESS_2_OCTECT) { + console.log("2 octects source address"); + arrayIndex++; + for (i = arrayIndex; i < arrayIndex + 2; i++) { + sourceAddress = sourceAddress + addZero(hexArr[i].toString(16)); + } + message.SourceAddress = sourceAddress; + arrayIndex += 2; + } else if ((hexArr[0] & MASK_HEADER_ADDRESS_MODE) === MASK_HEADER_ADDRESS_8_OCTECT) { + console.log("8 octects source address"); + arrayIndex++; + for (i = arrayIndex; i < arrayIndex + 8; i++) { + sourceAddress = sourceAddress + addZero(hexArr[i].toString(16)); + } + message.SourceAddress = sourceAddress; + arrayIndex += 8; + } + + //check CRC + hexPayloadArr = hexArr.slice(3 + getSourceAddressLength(message.SourceAddress), hexArr.length - 1); + var calculateCRC = CrcCalc(hexPayloadArr, hexPayloadArr.length); + if (version > 0) { + calculateCRC = ~calculateCRC & 0xff; // JavaScript bitwise operators are converted to signed 32-bit integers + } + + if (calculateCRC != hexArr[hexArr.length - 1]) { + console.log("Frame CRC check failed."); + msg.payload = "Frame CRC check failed."; + } + + //check if frame legnth is correct + if (message.SourceAddress != null && !checkFrameLength()) { + console.log("Frame length error"); + msg.payload = "Frame length error"; + } + + // Parse Payload + parsePayLoad(arrayIndex); + } catch (error) { + console.log("Error: Parser failed. " + error); + msg.payload = "Error: Parser failed. " + error; + var output = [msg, null]; + if (typeof lostPacketInfo.LOG_INDEX != "undefined") { + output.push({ payload: JSON.stringify(lostPacketInfo) }); + + lostPacketInfo = {}; + } + } + + //////////////////////////////////////////// + //return data + //////////////////////////////////////////// + + if (bIsRunNodeRed) { + msg.payload = message; + var output = [msg]; + if (csvMessage.length > 0) { + output.push({ payload: csvMessage }); + if (typeof lostPacketInfo.LOG_INDEX != "undefined") { + output.push({ payload: JSON.stringify(lostPacketInfo) }); + lostPacketInfo = {}; + } + } + } else { + payload = payload.concat(transformData(message)); + } +} From b4735723b8db97768f9d8704d0e6d40dc05e2295 Mon Sep 17 00:00:00 2001 From: Mateus Silva Date: Mon, 3 Jun 2024 10:17:18 -0300 Subject: [PATCH 3/4] feat: Add ATIM sensor connectors --- .../connector/atim/dind160/assets/logo.png | Bin 0 -> 80977 bytes .../connector/atim/dind160/connector.jsonc | 13 + .../connector/atim/dind160/description.md | 1 + .../atim/dind160/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dind160/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/dind21/assets/logo.png | Bin 0 -> 69599 bytes .../connector/atim/dind21/connector.jsonc | 13 + decoders/connector/atim/dind21/description.md | 1 + .../atim/dind21/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dind21/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/dind44/assets/logo.png | Bin 0 -> 80977 bytes .../connector/atim/dind44/connector.jsonc | 13 + decoders/connector/atim/dind44/description.md | 1 + .../atim/dind44/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dind44/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/dind80/assets/logo.png | Bin 0 -> 80977 bytes .../connector/atim/dind80/connector.jsonc | 13 + decoders/connector/atim/dind80/description.md | 1 + .../atim/dind80/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dind80/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/dind88/assets/logo.png | Bin 0 -> 80977 bytes .../connector/atim/dind88/connector.jsonc | 13 + decoders/connector/atim/dind88/description.md | 1 + .../atim/dind88/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dind88/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/dinda/assets/logo.png | Bin 0 -> 63043 bytes decoders/connector/atim/dinda/connector.jsonc | 13 + decoders/connector/atim/dinda/description.md | 1 + .../atim/dinda/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dinda/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/dinrsm/assets/logo.png | Bin 0 -> 68693 bytes .../connector/atim/dinrsm/connector.jsonc | 13 + decoders/connector/atim/dinrsm/description.md | 1 + .../atim/dinrsm/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/dinrsm/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/gw/assets/logo.png | Bin 0 -> 32694 bytes decoders/connector/atim/gw/connector.jsonc | 13 + decoders/connector/atim/gw/description.md | 1 + .../atim/gw/v1.0.0/payload-config.jsonc | 11 + decoders/connector/atim/gw/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/mr2-ex/assets/logo.png | Bin 0 -> 50073 bytes .../connector/atim/mr2-ex/connector.jsonc | 13 + decoders/connector/atim/mr2-ex/description.md | 1 + .../atim/mr2-ex/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/mr2-ex/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/mr2/assets/logo.png | Bin 0 -> 42578 bytes decoders/connector/atim/mr2/connector.jsonc | 13 + decoders/connector/atim/mr2/description.md | 1 + .../atim/mr2/v1.0.0/payload-config.jsonc | 26 + decoders/connector/atim/mr2/v1.0.0/payload.js | 644 ++++++++ decoders/connector/atim/th-i/assets/logo.png | Bin 0 -> 23527 bytes decoders/connector/atim/th-i/connector.jsonc | 13 + decoders/connector/atim/th-i/description.md | 1 + .../atim/th-i/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/th-i/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/th-o/assets/logo.png | Bin 0 -> 64491 bytes decoders/connector/atim/th-o/connector.jsonc | 13 + decoders/connector/atim/th-o/description.md | 1 + .../atim/th-o/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/th-o/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/ti-g/assets/logo.png | Bin 0 -> 33339 bytes decoders/connector/atim/ti-g/connector.jsonc | 13 + decoders/connector/atim/ti-g/description.md | 1 + .../atim/ti-g/v1.0.0/payload-config.jsonc | 25 + .../connector/atim/ti-g/v1.0.0/payload.js | 1332 +++++++++++++++++ .../connector/atim/tm1d-hp/assets/logo.png | Bin 0 -> 62101 bytes .../connector/atim/tm1d-hp/connector.jsonc | 13 + .../connector/atim/tm1d-hp/description.md | 1 + .../atim/tm1d-hp/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/tm1d-hp/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/tm1p/assets/logo.png | Bin 0 -> 45958 bytes decoders/connector/atim/tm1p/connector.jsonc | 13 + decoders/connector/atim/tm1p/description.md | 1 + .../atim/tm1p/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/tm1p/v1.0.0/payload.js | 644 ++++++++ .../connector/atim/tm2d-hp/assets/logo.png | Bin 0 -> 74767 bytes .../connector/atim/tm2d-hp/connector.jsonc | 13 + .../connector/atim/tm2d-hp/description.md | 1 + .../atim/tm2d-hp/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/tm2d-hp/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/tm2p/assets/logo.png | Bin 0 -> 52331 bytes decoders/connector/atim/tm2p/connector.jsonc | 13 + decoders/connector/atim/tm2p/description.md | 1 + .../atim/tm2p/v1.0.0/payload-config.jsonc | 26 + .../connector/atim/tm2p/v1.0.0/payload.js | 644 ++++++++ decoders/connector/atim/to-g/assets/logo.png | Bin 0 -> 63187 bytes decoders/connector/atim/to-g/connector.jsonc | 13 + decoders/connector/atim/to-g/description.md | 1 + .../atim/to-g/v1.0.0/payload-config.jsonc | 25 + .../connector/atim/to-g/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/tst/assets/logo.png | Bin 0 -> 38857 bytes decoders/connector/atim/tst/connector.jsonc | 13 + decoders/connector/atim/tst/description.md | 1 + .../atim/tst/v1.0.0/payload-config.jsonc | 26 + decoders/connector/atim/tst/v1.0.0/payload.js | 1332 +++++++++++++++++ decoders/connector/atim/wl/assets/logo.png | Bin 0 -> 50590 bytes decoders/connector/atim/wl/connector.jsonc | 13 + decoders/connector/atim/wl/description.md | 1 + .../atim/wl/v1.0.0/payload-config.jsonc | 26 + decoders/connector/atim/wl/v1.0.0/payload.js | 1332 +++++++++++++++++ 100 files changed, 25359 insertions(+) create mode 100644 decoders/connector/atim/dind160/assets/logo.png create mode 100644 decoders/connector/atim/dind160/connector.jsonc create mode 100644 decoders/connector/atim/dind160/description.md create mode 100644 decoders/connector/atim/dind160/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dind160/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dind21/assets/logo.png create mode 100644 decoders/connector/atim/dind21/connector.jsonc create mode 100644 decoders/connector/atim/dind21/description.md create mode 100644 decoders/connector/atim/dind21/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dind21/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dind44/assets/logo.png create mode 100644 decoders/connector/atim/dind44/connector.jsonc create mode 100644 decoders/connector/atim/dind44/description.md create mode 100644 decoders/connector/atim/dind44/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dind44/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dind80/assets/logo.png create mode 100644 decoders/connector/atim/dind80/connector.jsonc create mode 100644 decoders/connector/atim/dind80/description.md create mode 100644 decoders/connector/atim/dind80/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dind80/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dind88/assets/logo.png create mode 100644 decoders/connector/atim/dind88/connector.jsonc create mode 100644 decoders/connector/atim/dind88/description.md create mode 100644 decoders/connector/atim/dind88/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dind88/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dinda/assets/logo.png create mode 100644 decoders/connector/atim/dinda/connector.jsonc create mode 100644 decoders/connector/atim/dinda/description.md create mode 100644 decoders/connector/atim/dinda/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dinda/v1.0.0/payload.js create mode 100644 decoders/connector/atim/dinrsm/assets/logo.png create mode 100644 decoders/connector/atim/dinrsm/connector.jsonc create mode 100644 decoders/connector/atim/dinrsm/description.md create mode 100644 decoders/connector/atim/dinrsm/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/dinrsm/v1.0.0/payload.js create mode 100644 decoders/connector/atim/gw/assets/logo.png create mode 100644 decoders/connector/atim/gw/connector.jsonc create mode 100644 decoders/connector/atim/gw/description.md create mode 100644 decoders/connector/atim/gw/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/gw/v1.0.0/payload.js create mode 100644 decoders/connector/atim/mr2-ex/assets/logo.png create mode 100644 decoders/connector/atim/mr2-ex/connector.jsonc create mode 100644 decoders/connector/atim/mr2-ex/description.md create mode 100644 decoders/connector/atim/mr2-ex/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/mr2-ex/v1.0.0/payload.js create mode 100644 decoders/connector/atim/mr2/assets/logo.png create mode 100644 decoders/connector/atim/mr2/connector.jsonc create mode 100644 decoders/connector/atim/mr2/description.md create mode 100644 decoders/connector/atim/mr2/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/mr2/v1.0.0/payload.js create mode 100644 decoders/connector/atim/th-i/assets/logo.png create mode 100644 decoders/connector/atim/th-i/connector.jsonc create mode 100644 decoders/connector/atim/th-i/description.md create mode 100644 decoders/connector/atim/th-i/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/th-i/v1.0.0/payload.js create mode 100644 decoders/connector/atim/th-o/assets/logo.png create mode 100644 decoders/connector/atim/th-o/connector.jsonc create mode 100644 decoders/connector/atim/th-o/description.md create mode 100644 decoders/connector/atim/th-o/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/th-o/v1.0.0/payload.js create mode 100644 decoders/connector/atim/ti-g/assets/logo.png create mode 100644 decoders/connector/atim/ti-g/connector.jsonc create mode 100644 decoders/connector/atim/ti-g/description.md create mode 100644 decoders/connector/atim/ti-g/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/ti-g/v1.0.0/payload.js create mode 100644 decoders/connector/atim/tm1d-hp/assets/logo.png create mode 100644 decoders/connector/atim/tm1d-hp/connector.jsonc create mode 100644 decoders/connector/atim/tm1d-hp/description.md create mode 100644 decoders/connector/atim/tm1d-hp/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/tm1d-hp/v1.0.0/payload.js create mode 100644 decoders/connector/atim/tm1p/assets/logo.png create mode 100644 decoders/connector/atim/tm1p/connector.jsonc create mode 100644 decoders/connector/atim/tm1p/description.md create mode 100644 decoders/connector/atim/tm1p/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/tm1p/v1.0.0/payload.js create mode 100644 decoders/connector/atim/tm2d-hp/assets/logo.png create mode 100644 decoders/connector/atim/tm2d-hp/connector.jsonc create mode 100644 decoders/connector/atim/tm2d-hp/description.md create mode 100644 decoders/connector/atim/tm2d-hp/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/tm2d-hp/v1.0.0/payload.js create mode 100644 decoders/connector/atim/tm2p/assets/logo.png create mode 100644 decoders/connector/atim/tm2p/connector.jsonc create mode 100644 decoders/connector/atim/tm2p/description.md create mode 100644 decoders/connector/atim/tm2p/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/tm2p/v1.0.0/payload.js create mode 100644 decoders/connector/atim/to-g/assets/logo.png create mode 100644 decoders/connector/atim/to-g/connector.jsonc create mode 100644 decoders/connector/atim/to-g/description.md create mode 100644 decoders/connector/atim/to-g/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/to-g/v1.0.0/payload.js create mode 100644 decoders/connector/atim/tst/assets/logo.png create mode 100644 decoders/connector/atim/tst/connector.jsonc create mode 100644 decoders/connector/atim/tst/description.md create mode 100644 decoders/connector/atim/tst/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/tst/v1.0.0/payload.js create mode 100644 decoders/connector/atim/wl/assets/logo.png create mode 100644 decoders/connector/atim/wl/connector.jsonc create mode 100644 decoders/connector/atim/wl/description.md create mode 100644 decoders/connector/atim/wl/v1.0.0/payload-config.jsonc create mode 100644 decoders/connector/atim/wl/v1.0.0/payload.js diff --git a/decoders/connector/atim/dind160/assets/logo.png b/decoders/connector/atim/dind160/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e12de1b6ee821f9a5a2dc7f0d335d381ef7406bb GIT binary patch literal 80977 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dind21/assets/logo.png b/decoders/connector/atim/dind21/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..314f1af2c4b84aaa5ab03441946082345c0f20ef GIT binary patch literal 69599 zcmb@u2Ut^SxAqU}SYj_@L&V-4()Qko*v8&_SI}f9u@`KBVjFw!4SN@RMFkam0|Z6H zMzMkoJ7DGeJ<*x-zUQ3p{Lgn?e;px&WS8ez>t6SLua%kIpEA+5)~p zcTBE%6>=9nm(_gxvDJAB^~-7N8$Q0!-4l0jujpTR-1;&pLyPp88Dko`HoEiWforFH z$$fNh`VYr%&t7gUd*swDU7y$IuQa~@p=-aL`QqF*g69Zgavb%I>)1_&ffxd}Ji4T$=oJ@__Ga|WnC&V19zT9ur%s)1kG4&oG2`OJi>I$gT)A@P z#JMx4u3fkg9T^c3aqj%NUX%N5eY_{^^2OlC`!^+SZq>Tgym|AsKi?L1`qa(nm`#a0 zkA4Zp|{5#->@Hxx%@t%cSKx7$x@}#KXyACc_aF4pSXLs4<#O*wP600qaCBpw_UM7 z`#7oFo`iktZf&|7?>%dB_1NgP%Oh6pJhVS9`u6?X_fnoZhOZoT;`+^FXRig0s&?s0 zjQ8BW`)|e;C{W;H;^p7Z#^)+9G-PkXA!?Z$@o~pb?>-TC%5O(NbmEN#=N4UvI8*=f z{ZntxQMKyXPeeOb*1y^s}*XFI2(0rcFdg) zLp%B}8voaV&<$})x{HoI$`L1(5)>?F0{jX>L?Rkws)*76@(DPF9 z=;u#bMI4YnIt$NB;(_zWf6k$^{`>P9)33AZO}`HG>kYrot2O9&UR;Ci=Yf7+BJ$h0aS6C*_~VSP*^3K#EA@g zz1^TQXq{i3Z!_o(Jj*`|&+GZBH<)-Gui>%LV9+?fDI885j0JJ7(cicC_jl*n`112g z{%w(Mzh0x^0RQ%jUx(CkS^u{9?B>t67=Atf_eq@lEpAQz?|-3_{?qfnc9UoI|GJhu z?L4H0r~myIvhLUZ{JI};JHP%p95$1~A$EtGuoz`lR9ug^C+A{|BRY@D3$5&lIJb!_ zm9+~0Bpxfyzh(l|q_t>Ow%n#wwO0PBIjse5%gGnQb~= zs@HKavF-oYzncI1um0bDqj5M?u|zuV-nmZ11skjvam{7$oI!l$RYbVX!LwpL#g6{R zU+0rQBis3qUlFQot>j#06E|qlT7MqGDml;cGqwnLUS;5Q65oHOkWQo6ejR}A;@lD! zqcgArT3Kh1bh1vX==F+D$2ywWAV9>VHyHI+c0eaddK(w1CqZPrM$wZpoSXM3I_GQk zl3r%dOze`#BFP{d6!yk!u&`N1qeT2DMiVh)kqnYik|bGDB$GxmOBUH68)ZqBWknVs zXHg7_QIQl`0s0iPVlf#^Mw4WcO(3DkY_gd3W&;=~nPszLHkr+4i$$-oa3TxGvhaEf z&sgO*ZU6J%UwHJt*)?&9pQtEyO6;!k z&#tlG8s#Sz35*hOB8fd?$Mi-WJFbWwAfSn76Z@qz8ueo5#GYx*5DJ5&cW8Bz*c%N2 z$d0jvM!QZgIduQ*-GA)d|7zbflIef7Z)ENNymK0{b^m|toQAFYulx4j?3zu~In}vi zKeJG*sn$UDv9lJvNy9&_mM<2Qo(Qn(t&-7Z)9dU;hf&fIEMyLk6o5yzm=zGgESpp- zXEI4fqt0w_a44H%v1?2^#bDKP2&>61g8;Hg9F>#u-C{5(?1gFun=B@s)uy#lb4d-jDBu?}9 zP5k_BCOQ?1hA(!r(Fz!d(})86KYceU28Tf=^0^_aNpYCDFiFQ%Ng85ERRMXO*vejnS%VvkpD%n)CL(%ITW}DS+(pzM!Ms^UdR*T7I zH7W`x)0#{cRt8|<)v(k7hHA2pAD0<8)?=*=h$a?Kah_6$RI1GnqAnk;$%D z%-kJds#8oXpJcMy%@&)@LOnI=6ul&=V5rVP9_wsCph;1|PqSXO$_j`FJg98HiLBMy z4Lomf=(r=j*e3^YEJ-YrWV0BpvcaY|o7o(=rXXoHquHXG#HRB**-j zYK^kRN_K(!s_HPA3=X?dT#JF#aadSTtJNsm!Fpg@*4r$cR%h31Wt&ZOC>~KJ9pm;QICAQ3Bwcr=TupQ7N>v>>d zU0EB61vKcuT$P{o7N7^lX5_w9hio!fpa>2lB*A9UnTUVF66R>tt46D;CwlA_RWXro z0x8%r1)|A%@<_HBxgxgEpf!mSYBa-kj26|dwZla1MxC7^VQ24jvR$hZ-+GB7ssy)5 z1}zj`?ofbiF2Zcku%?p1K&a};IDzX#Dp^c!+90)dBfQF>N=8*S6PG4g(plhN7OM;| zF|aD8!)Dl zL8km(MaUQ`GZi}w?;xgs<7YPW--M1ica5-kLP z%61URc3DRE2_nePCX2=5;7++o0853FQvMyX%K0qhpF|e31d<)8V>D~5te{S3rp|I0 z$ezk_a|oax!US?lq8?LnxE&}2xkrjh4hySkaOf>I@m{esW({d>w%N%qs3=RPupl~< zRonpu++?*`Sw0vP@u8()vh0L_YzN&{vQJeUpug1tch$&1FGvJN=-EsOkb<$xY!JE4 z@gO3UA3*_hL=%@sOiBcn)~c#HSt6M25+JW~AecBwVSwZs32lqRs%KmElFekX+NlhR zk%)nC=wZvC4QnG37&2~C9nd2Kdk%h5vUOk=OJcIvd5zx4JxHt;2+q+J?usf&M5E=w zP*&C=6QV2%g_kTf!zk=jSe<0l2*jscP)Jk-m~jYPBz=HWg2n*>k}QBRpl^}6Gm5&N zQfxCBwCoCH>lc$USpjc0YgL!y0XO}x5;eRaknNjA?(m= zSSvj#DXF~Kpp{jJnIPlBNhOsO1sn_niqSz(DT)rzCnAibGkid$mO^W6I2t$+657T{ zaEP!Xb`fW?A_M}9E;5VQau{raL6}(%S+?q7VKP;Q^Xb`rg@~06ES!ci;Q)51;7BJ* zBY91QRg9Dks|=s8u*e7^g~|<6RB%T0M#YX$qY#*pNxae|Xq*Nqr`icO$;_>zI7~zZ z#lV5WR%}#jJ&0*mfmhY8IuwYJ3GxbpiDHCH01q>&T0op#qhf$*BG`;@9tRnU31DNh zv;t1dRCEG^14^X7thW-QD#8xxAf&y~Vg)K$e2oIlgTUC#5*J7@hZ2zW+$0-iwG!br z*ehA4HKFTp(6tJ{V+9GhV8P1;M3{&L4RL@2#6KMzSdLzrk(8JIoG^LnbrPlp^;{7Gx#_4Y_WjRKVD%9}puu7;lptR2!Zo z$EYK$p%4l%A~P~ovB(-ol+Mg9v57)`6lDH*d@@}ifLx1#v1I@6APjS+9UK4 zkq#}^7=_Rv+s)Kva)1&Hep3)wIvG#LCJErPLcLghMMn~Ht#&Yg%wlK3GLQvEC2MR} zorz-tqaZ9>U{LtIV8IeR2Eq#GF(5MlOREBl5|zM??1#e><_I7G#YC}DV})AU1q2a1 zyv~l?Aax*DhgZW)QSHhwRCW03M4l{b>#}lGJu-+7M>F;fq+CmfGd(XGZdS(F~GT4 zJnma^fF#^3=OMcFipC7Ffac=4XoY|f#YAu5Wkyx_DM$&ES;ALgdnhE(M;$cSVWoVS zVYQTI3O5-kTQo9k5F?G{ht3);B)nCxQw^vNcFM>l$<9@Ba4{+}NN`}PmC?%DJF79= zh;Xuj*`x)lk8%J!Br?U!-deF`kYk`B|Ip1)8E%BKU=hNLv^2o`Y={V}kOf#U3gVc} zw8P4PQ(mgYXrvrK!)0VLl+_CR6wafblmiw8moS)3&_3u3#R_cUMnN<_nrv_s zvx$)66j({nX@^cv3Y%DA6Ur6;Nv}%yttzMvGC716p+Mk-VqGa_unTfSwm1+-!a0y+ zmX}fiqlE`TVN}8k3NJVvNNLsSOz3lj1yux37Uf3bI_#u4p$8AO3-W1}6?OtyPfQW% zoC<6++KCjNL2M~hNhBa30vR!|*wkZwz-I!A31bMTIGn+bhPH5g!S_)U2CQ5e^v0nj z63}&^%)hDz4HZMd0x?r8VJx5yt{hCr2tElKh42!1NKr!v;>%DLS;+q=^Z%544Pgo2 zAUY-C{{7di(kTLk?dUR=mO_hOCp1`MBUxz@Mgo-vVAcST;HU%Dfr7ytFq41|i_juE zwn33FsbmPIfw&U*2STw)h&Si$vx7J^_>~5;h8$(VxHC!s=wT!pB+7=#fWQXTpd}z6 z>_wAYsZFI(LgrHfp{C)YZZFUhzCR6f(%fsaP(~CDbWVqN1N(6tYG}$Fo6U+ zw*dwm(jjCUIcy|IwFI)pqJ{cWvT;Dn6cFJtz)=lIO!Ay0vI@>^f)P4HLo6pJP*6q^ z^$#z=Xg3Q*V9=0v)OeV_5a%!%0E;s@R{*FX7NBat5BdqpkNUzl<-HCrlFOxt!jf%5 z&0|AT4Im;o^6VPY9veh!GYBQlWdLw`k)nc2*i5Ka-U+ry!h+(GU|K+(osveU2DM@V z>TC`Y4&KQXp;Z+MvSf2WqJ(uz`GucDA8HbfT zaHwDkT$Ib=oK6!;ge4c`Fzb+5FgT*di9*l>%wQsxdXMKE_51rj;sYH2o~G{N;7LKb54tcU_k}hu}Sg$Y%Cc9luSXJakub# zJ6lY05_|+O1ri)0dPR|8n;kYTAB!GNX{8FP;u+}wiXk>ag|m@L#E&rfMA6cq zZb*MrAt-}l|8M+E;a+l?M64AR&dmur@~h;^TphnflxhT50LH*^D-H}yUXQRNPcYVv z*z7orY#eulo)GUwbtw=mu~@v3#sgj)ju3rXY*C6DHGwV!@QbB{nI$|L3&g~MscBMe zs>H9c#z{LMn;w_}xo4t?QN*FJDny2cFXV~Hq7+jKhyWskBos-3*JcGDX{|W8B#Hn( zP$cj#@!9CPP}mJLFeu{)HFga(gl?ggVz$r&FvDaento_i6Jn1R3WeGzBODB(jAAZ3 zXvY{-7$5poaw-&RxLIY_u#>QPSxSVSLn~IyB77W0>06=IpE*L6VkP%#4 zVwS=s+dy-j2K2!7!JZ%la6QCc>twFnYSaCb!+3Y1uY)}&u}r8hVL;%!%lMqMY^V~l zssX2stUoOxLe7W@P5md7STmghyTbQS@nfOd*co=K-7aC&L5bm?z@^jBGvIgu{)jLq z_VH?rL5dNS01wov1JXndhdscJO*&^g0Nx{vAd}5O0W)*Q;tOgYV^TwSu%D}O zuqpJMxNmqDyAC?qvC_m<(pLf*;Z7_K5=?Ic;s8_j6)@&Nh#@)ya9ouqg>hif+Snu= zXb7i{4Kpa%r#I(ZTSpka5Bz65~@umuk=fY5FNca6|xJETTo z1B7ltykHjzyVs^;?=d;-1immwtP*_@XXyP)5f;!XLV(N=MH=eMreFm-pM#+a#*Ui( zmv{U;f{^QM*uRx+JJ`oX2sx%ViNkR)VFeh7B{T?!qI`2K(E!9iF=FYdun{^U3apMI zA-Y;7;1aih`iP1q_29OB03pBGrb`~4&1$D#^nEbG0OnRIU zY7N&9T3caMY#p>nK~~so3I-vo%*9G%t=&q{0_pf@1PdIJ(t^WEei-R<5U&FJxKh21 z3)8FQu_zssRG=FfLfz)1kXi&PMOWv*pwxlPCWS^F_)8|!&jXoJRctexM?{i#uzD68 z(1XK>6>@fHB2E-`uwfTE6Q zahUNW40P^X3w|CKh0-Oddd^{Vh%*$xaMBO;a+73MRP zgf|e`^m0TRK_aMJ5=JA=hT!CoCX)o0B8SAazb`nF#Qu=p43kZQEx}Jcx)npK4h75pF;wAsAS9tzEAK(>PgsW{b zaU{DaPHZ6_3jxbzIk$quVX;-|zoduA4vos;|E^kS2~qnH4gX|_@NRI%z$Fd}0E>EK zg-q*(oeKrTm&1}&6`ckXm)k;iIni38nW={!zzBddMWOYErwdCGGaCRSc)|h;im0R3 zI+LFg$FAFP{h*}yGoS}X94|5o3PM@7B7gD6ISOillhW?92&#ii$Fc!|W<6%MhYzfZ2%?2lIoQu{|b26W@_4%aN=aY6+Yc zthexD5t=Nis6gf>Ik5Z<(iI2Lw3 zO+C08NRAkH)?PtNC_JFH0YQS;q@LhiXv{j4Jk^T@BcO43Azl)0HWmqaB(M+Vj041V zAdS%$PWA!@fq3*mF(IK^;G{$2|~^s19)PisUQd!oJcm*fmI4HiDE%x0){SR z0SQEx6nZY&V_33uHNZB!ILXYkkLXVef(wgqs8m151dUH{58E0?3_;Ck4HgVy+aa(~ z#-^tAhpGY*K|NtRT2PRvAG$ak4yumGB&MlHM*Lg+SYAw(g!duvITf43>%aqCF}l(W zf3SqVf**$+G9lbf=VlYI7+-j}oE4Ld&IfAOY3~>XZ5KUJXuN1zlXJ9qneS1I4k(7` z9782}KYkoQfGRfwEZioh0v-%aaq1MsfDR0PAd?PoC^27yGYcK%ULe8f0Fwb@9LkK{ z0R@KEA|GJF@Fe_ij6P%z?Q9N4H377#O57}4Mk!?dF~za%AOhsD8OBDNpZx_wp+g8p zv=>XtiU>wd7;>|4Zlo201x~A@EK=g3iu7Yia0)cvX=ga}qBG>s3Um|CQG|rsMq@=l z1R}$^LO%~DTxG0AVwl(<7sU%KGQtxlS0mcs+>SGnby!=@pce~{x`n&_7xO|z6yq$R z!ElNwP>_GEjdG_Et_$$Nc7lb-24};@IY>uLa|!>G%yF6^zcNSjlTQ6x2Efzs(wON| z>9&a!zy{Nz-GsLYJ*Dzt5J4}*3X1L^Q9=_6ZE9u60A2_iVERaC6IctF4MT_BV#pKZ z91c(dut+1JG8DF0C!AA;TtpXCMbiq3DYTMETTs@-Y=qcGx?m7Ij2gBUe4X31orf^eKQm2dRwHMUirnAHjVHXheeGOFt6|FOKer zjY5I>>}){`z;dRARg?kI6R}~|fZfz4>=UT93FjA)NV9=8f=f~-1*IfENJy$Kq*RYM z7O0Ln$qo@2wAVy}2)F}Qu@w|m^g@u~WH4o$<`D}ICSy86QqcMW(C`8^+^LC*!3pV< zA)y5Yr8g%eHiZf$VWk5=pP2I^ym<>92(C*=C$R<2DhG4XYDDxpO%d8$Oy&sBgQ|^} zDJ)c&E2bS-C$t!OAS_8C(793$%EXOR&go^yq~>ps{`noIAjpj{#h^(v&twZHg21yv ztSIdxEE&sxC&o2Di;h!||3{#5C`gcKofu8RWHix+LaH%*!iv$lbI1e~$_~iIKtoBw zkI-B~w~9d(YLq~1QKzZ#6e(y8#g64h8%V%2o-YLmf0=O)-W zXVD^4g^iAJ&qhL77?5MvZSYy-gXpZAVGm|IvK22)kF$#N0s(`nYV4G1#t2cmdUU&u zW-z^M6Z{h0BJzZe6}GJzH(ErPm}qq}RlYF4V_=V!!B8%cP6Nc*tDr@r6Rx}*zSZEveho2hkc37BEk+ zbnFv+PRy}Ur=X$uVj@GZZfJh6suW@VvG~l6IAszQ*3Qfn)D$(1e)>7(M`s380rls= z&;CaR{38OGMG=rlGv5iP&!G8!lGdNUq2Eap>X(A}`yjt~+J8zJ(VA3Y z+6*&@E+g$frt5Iz1T=$6qU)#;-8a#za?rY@p#L0svWR6;83|!W>=Xf5iCt!bN=O~< zSR4nu2h+(Glo8QkCq>Xr$XSyx`vGg%8sD%O0Bkxcus_*K^~CPNL4_Ak>g>=xj>8Qz z@*&287|OC?)$3?}qKPfIGDH_SD#$9!2mJ#unD}+jqeMO<>jnGf4)DrhLn=NgLJ>(J z<}x7c#Fj87D6E8@**TqsM@Zg-WMCY8otaClEbJbr1B_YNZR|QW3&R*POThfFgj_d3 z0(9tlC;(vx1Q9RT|L}c69D+t1Qrz(0go6pb2&RX-O0JTvqK}X3ATxhNITbi1Ok*+3 zflo`8iIFZvC?5z2QOZT*N^u6Nte7MfTP^%u)Pu7~fvB4Qs8X~~#JiZA1nf8p@PZpj zR|WGEU<7a@G@B{47Bs%uMxxiu`O?Y$kYoK7* z-zZ)SDuEqfrVirgKmj7Cv3I$C4ZaY(pBZRWpWWHlLU)LJVweufMDZ4}EMr_y8j;~< zDh-Vw5q?7Wg5``V;vHxJZ-&B&F40Y5A#~I?0Fn$8?IN%O;~i6sB1UZmo*a=`;Ms%=yRO$F;uzUr>YX8O1)r5EPZ$vfok%bySvb7tXEFkSq^HzC|EN+>Tv0hB z4Q@Xl#NfzyOhT(N4opU<2vcM@TMRuGZ5QqaR>iggUvyVYEG%>zdO?#K7mJ}m?wQ^# z`@tZ)P=DYuVMqdrX?RKi{=8Gy{?m8{LH`DmpS+j&MF2qk*ciGdw3sPFjHfZf%I6Nm zFgt^b1gK~zQz@_&7%~;Z|1f<}1tB0~Ta)p$?iicU2$6y>M(oi=$Kq!@sn)pGY&y!8 zX()gb^NZOiY-!3d(1ENW9dvL^`kn$znQ7AC2@t_fr-F5Z=E1V?py6%5z>P3P;gI5r z=r;%tn!s=lFp5tG5LOruEE2hfRmFLrdBiEZMzjeE00dFQwA?P_9~vYvodWfz8p5Vj z=Gx#3)LAZ`6H>-Cc%{yfD|&jQ0({3g(1$gO#McQ=kM)3Cu|-Vg;^N~O2tXj@iAL%z z%?h^J1|BiMEe7f+qfSenuxB0xlSn`uP6Sa&;pY=Pf*i9pG(MPlquLSBbn?+ejJMHd z)?lCuqX6*0*dys7kzyK4VOoqdgPI6e6*PxO(7;1F5n2wKd`xpdE=Xt$7Sa7fW{G2q zSrl9`Qc4tgDkIephefzG=rNcc1)ck55SFnD2oAR=40g0WvwR3Ks2`r0U{Dy4HZklW z_!nEMKtZ@uFLRZTm6Ev2~rTMAQl@U{Th+8;_Xb}om6)sL5 zh`~V|ah4iH0`(~(CI*{?sfx-MQ)C*t@nR+gl_Q!V#1{>4D~gm+9cS+YtmbH9mY>;Q znpoT@_o8LTxikDk9n)R#6Uo`}V~mu6WfO8&d`!hDvS}iLA+$RIS#nZL`~y48*)Ua2 zwu{yu!AA;WdZW*19tfLXgevAJMj%p*Mi!!$nK&&+(lXuZoV2G$hZ%{e`so+^11kT3 zj0X5*)`J;K)|GlgR|z>xH-_d1^Q__%CsZae{P1(u1!Q2V07FRlF?b_*odSsTG9UAx zN6nN1#{vaaF=$3tl>88bZ(J#5j!HyKI5{o1gntO4a&5xLMnKU}q%LE!kbUq9ekCdl zs*~eV`xuZli}tv4NC})_iX2M;9f2qZN$4L6x0jISVi;$$qG@s5s5;b0=4W6)97u2# z;TZ`L!+Q{Zhn4bCQ212T$Z#54*Qf{>=i#!u7=dU{kG_5@B!x{3TI zgtB}utX4r7VHT=Re*OVbc(aCh{0je8;943$xqy4^Z~QI1RSD`mO7sS z5+Bv%GY53p$SoTVEi?w@%MCF!M?XrqSllvk%aMV7J}pG|RKv_HA;I}{bkG^8BVQ5y z&Y2vfEkn2>yiu?qBIK0NXFaIDV$#b-6OaAF>Z2xT3~31;W>A_xRF10-Rt3J-u; zGwvNN;v4~n0{(wqlk=MS^y+_kAsX9e)@+KYsN+N4N9;XXI$E}@;gXvla=H|8&Fu=8Q-FWQw>#+}ytNnUSHXawv_8+ewI5UUy^$wmFe_EDubxGy_Y4P{>oGvbl za=GN-H#kjN*Tp{{yK)4VjlZ6U#JO(#dBm(N{+}2de;zT6%gO%hvAZ}ee{%I-#|P8P zxwLHZXBYo_uTBL77R^|fm9?z?mQn+45laH^_X~8nG;Pt+oY@9yo>bdfY3RV#y+faW zib}uY82>%={@4!@WgCR72?>ijcE8HdkhWoMm4utMqgGUksp1;+C`YvurfhO@_Nnh` z=eb*U;H3|XCr+AY8`928c731B3`V7>K!?wUjPE~ACXEQ_Q+DO$r@sFW-`b2mUgd)= zXzr7z&BwL0rnFt-KPAG&XHer0j|x<~cTukX`t{cf7q=E(7rb**$dsu+jwBhjUY(nx zPMeEcs?D*6yC3XaC6D>$uEdbdivkk2`lY5eoS9J}c}-Bw=jjDk2L<#@T=%{D=lxr^ z#?JBRHe~vm^gj9S1hm|>Y5TpMbH?vXT640EU;kc7C*t$HQr;JBbGCUz%*7G?6DytV zImpsBf8yQyMcuC+^B8w+>)Y0T51Wsz+WO1>mn#-sxj3rh+lYo~w=!cQKel_dH}a*w z+xs>dwmrkMHZQsTN0Z-!Ty9L#6)#tv~6`}+TIYMhN;$Rb%({3>yCvON=*cS&e!Xk#-YJhy&mNur zDwb{9pef!zc6C`g+{>$dnUj~zI+)vWiMm((xScy*=z3%6fsy)Nx!%VQHW-h3ML z_=z%acylSTc^}6W{i%yPh`!4x}$LVJJ?w)sg zR*mX-xW>&pcUq6@^li(cF76Mi*eCep_P+SC)t3g##vchyE4FIc;I>r)yZfvh_$Z@q ziNqD{QrErPd%r-!hO({8oxjz<-M72j_FW52`!aHQGjcy-dahkDy^%3zk7qI^q{J(ldGR9 znv%mmw#tv>T*s=Gt!ehkSJ}vz|w+ZQ%@pVt5rcjUf*F<<}^@e~~ zZ8i-be)IP|pN4vxqo!>g-s1S)^w0a78T;+)U>YtT zllUoh-m?lNmirw#eROkZYR@;3YlmK|e9<5+*%a{Z4@Zxozo)O>(52eP8(C%ENBV@+ z`SL3I#rXLb!=^O7U)(ic!+Lx6+sDkvm$1!yY|jT$YO`lQo^1$7dbhnquerhZ3wLhS z_jEvqYp!pDzfbkZidtROJ}�p7IXud5$>FEX&wg@A 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�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

G8^5t{51bRr1D*>1d{cDP`Ovo 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dind44/assets/logo.png b/decoders/connector/atim/dind44/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e12de1b6ee821f9a5a2dc7f0d335d381ef7406bb GIT binary patch literal 80977 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dind80/assets/logo.png b/decoders/connector/atim/dind80/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e12de1b6ee821f9a5a2dc7f0d335d381ef7406bb GIT binary patch literal 80977 zcmb@v1$-3g*7e)LX)Hi+*THG4?yA8uID@-OS5-Ie!7X@jXK-h58z8t#aQA^ExVr@l z-+wpEdC&Ro`+dLn{_Y)4NYd$)JkQ>1ueJ6r&X_v2s-&`JwOTBeRMo0htY@(V?c&2s zmXKE_#`v!AO}X|JD%5Fj7#2(4d4neJtDc~H=A-4VHk{ccmF5b`UZ7^;y4C9s9aSrB zT)sGX%Y>jvM-8ZtIAL+Vdk`{rG>qg9>P7tZE3cIG*CzpBle``uJqr=n-m?1@== zte?Sb$t0B$9<3f(xL@*DS)caL zI$gE-j-;R*I-=90?p5NvrNyr=>D(jU5nA@)E@KB){kmGZ|LV_Ti1Pv z_a}bvbWzSNdoI~qJU?`-!ryNjwpp3-a<=;0-u<~eLCfo@RxUggnqXAd1A9KCx_hVf zrh%^p_p?|MTI$qjP^m`y?hl^cKY!``)q7WO#oUUGjoqm;{J$pFOcm9iy|Mo3DE-votx36#CzJ2uQ(SrvMzI^%e>C>k#pFh8P_3Fio z7f+u){rK_2`}gnPy?gii_3LNPo~>E4Ch|k%iWMuKJb7~O-o0*fyRYA{e%G#D8(yrR zGiOfc*`4p)xzlDuoApoD?c2BSR`jhk&sOi;xpV2#rQGkX&$|{aS~PR!%=z=@hb`!} z>CGl{oO$EM-_xc|i~knawM(~7Q#<{&`LE3%H(k4S?Z}ZMmoHyFcI;Tgh7H@bZ6CQU z^1{UnqeqW!H=*6hlP8A_8#evKG_P0h-Me@5<}D^onl$zk_QhStW~>qn{jQbwyQdB+_#4|)vj8tT4 zOYO?pD>tg5jZr%d?ELA~*~aaf-hA`7(bHFKWT7t~@2!9IzPnkhbb+vue~diz^3&t{ zZ|96FS91UB+52bZPi?%pHg?iqlV`2?qej%L!>13;kAD4nWudI=9!A7|C=$}8hG+1m zKaa*-)-@T2j za_QvlYJXInF?Q33m}PAaMDN*raajLGU0Td&v8=_p6HAJ&JlD^^`0$S55q(xiU*EZ4 zMu$anN3UP8Ddm}uYRz5EdwuEJ`sJu&o9y9prh_iU!|K(lZ?Si%ns)o=phSt|zZCe^ z;MVkSx2Lq*8-MfLrQti)%v(03|NNWVy{Dhv-y606RDAQ(*=q2M$-7l;+S6i5kzPK6 zEOX{%wpeN$4y)88te&@z#p>(Z-fzv#f0|o$SY3)ob!%?7jsIMlOLKVnLY43MPYe8Q zx4HOi4}5J??Ka2HSO4R6tIhfI2M*rqf9^U4(^SWGv`Qt!8E|T-fiFw^FSId7^&G+LAx2Agj{TB2eH()bSI;Z%7a@8N63 z>9Gc0`ezMTkiZ)Kb9?`M{&CU&Y{GvmGCvBu%gU$!_<`|rEx4@zSbTQ#$6=j6U;pPM zf&G?SbN}~0uq*%D>pypsR~`Spmc0D)iX8v>1I=*!v%EiUNLJ|Qhu?3ie!uJvH{o@; zSy8zjxu?Kl%Mk-d<&8RfBIj1QQn$^+hr-vMz#okORc&6I!Iqmg!>04cuxoY)EAF@2 zU3Sy%wfpV9z-Pm5aEUI5&*9;-!(lj_c6m*8dK{X=V2|uhm;AB&9UiCVG@UB@XE=OT zr<0c*|GE}CXO%y4KEtkZX4B4F9d-^T+x~z2WBot>=>OeMtbV^COJtV?W$R_F*kFgm zHJ8EnPWhX6u?2QNugZGLj{eu5z>7a3JMbkxB2?L0C9upYH|VwLKMtWQf!+8KTaxB3 z-l_1%6$k|mZuQ7j$N|_c&aH4Ub|*VvbK9MY-EFsd91f4&&N`}Wke4fWI9(2%9k45k z!{j0zE~nG&uzDP%4Cm%|JodnQ9g4%vo~i7TmyJ-IZl{O6(VSj3%S91$yF4zH81gDk z#ib~UTk$BWRnZi$+v#?>6}Q{%aSOjW>H{f!E}!Ca`#e6?r}?~oV$JXLyZnmZ?f3XqzvlP;YuA46 z>c8#TkKOx;NB@&ulSBMKMcFCYUC+OEjqS2}JiH;WZ|oUcFMGz0Ib3#j+#@?cKoie^ zzG`>59I|t=XEx12QYa3;&92DaSWUa^7+dJ_*&T}C{;$3JubulJ?VD9m|3~{q*8bmj z&MI5?|HsZ**}DJdzWq15W=fqiSmeN>v!0TJHYeG~&UziHl@FVZzy7~|{y!hc z#laTaNGX>AZn<>R?E=zNlhpIEN4m{R1o|9K#jtX1x)WF>+WDc+<#)O~I$S{Y`iNvz zb^A2cG;L0|mju;pB#y4TP4ZB6nx@OEIsL4S*JoP2yxC!TJtTsusfyq9Yy5&q;FumS zQNy0f`N2$*hzNsu{I^T-f4wz!6RNgWSz|z?plZ3VTq&@&>PV&y}@tRIWSA3e6Emz5T)!|ZQjr@XA zhC*!nb(`sQ`Q1*h-RpM2BV4MfYSb>D&F6Huy?Ov91Q!e!`(UGH7;c}Zq?^^tEShg8-5NA z8I^@LRJKO7aWu_ir@S}~xhB=C=$grb>pE}pnuY?(x_qYFZ&zK4rYX=4Hziv$G`9lY z`aRS@4Y2i-3O>Sxm{B|=1-Ix?T!f@a;G164=F$mv-9~kBJ55$yv3XQ0VeNKtMmMK% z+ueY^;n#eW7=qj+4tyNf>+=v5Ufu2YvE8OiH&_z zjfzc<`xL|D)^vyB<_7FumtuOIK9AvsU_+gRdIk1@z11jSnpLqIoDdEtlmW`5`<WcFoH&7_dUS?h{PnZk&o+ zry$$iE>%};q$Z48?p4!)B#qMVcN3pnHJ55An#W4vcdDefhqNUMV2GyfWdjtK?soYg z1HhKYG);%$;@-RpLFJI1c$V7$ZUCrKdscE3S_267tkp;oi= z;0lpJHn=ZWx%U!NLNJ8WcA?4i`!9(H$PIM_1e~ zhr*RP{g4@GgUP7~2ES9WY97HLa-3`+Ke#c1K($L=D4NUX_IpjaR&q`Ec%8c4^izm{ z5HI@9R9$|*NA&})ChAC245XClQ*D0khi?qO*JFob@oTE)XMy2!Du4lmDGoMBxIE~@ zA-$Z^CnQY{t&l22kGt7c*$gySRgjcuIhxpkD9|u*%U?P1`H1?=JuI> z!|EhL?SPD7xEv;zPT4g<8dFylw+&jVxlLJb*r!1W18F=iClReXRiBNLVM4%simB>W zumR*yZ3eX0W77@EMF(^hl!9`44GJ#6XeXCVsp@WcrIP}{R81_~CeaMuPlCd8h97KxR^|T#Bkg@@G82RKDL!b<$KLV z_V6wB2-yO_`zb1LBhAZ(vLY&wrMawxvW=zpm|Tk&c+?0_lF#GSb(WTT0rhbCp(u80 zA8F3!f?nh-*UVk;Lvk4GwEA_p6e0*Pa6>kQTbUG0sr!Trb<;y6fe%i2Ik*m?*EF(= zpGztsZS0DldaPT$2yhCG7rw@FXvj$qR84Zyjf|qK*jN~!U-S3~NaP#zgmtr%%Wi5G z0LIe0!8EI=C86`tTyJ$|1*a157ecf*)eL)HC0K_{sa9*5@llmaSlYCCb-B1ARFL-_rY!a zCc*Y9V9pD?XY_U0Tf9Y&;VgY@EH^>tB;P1^n>n zHt;!cQGxRq4hkFjiafKyhumUQQHr@WJN2C$(O^|xs26c6RuxrDH6b~~1*e3bxE%)D z;9;XZ;3V0o$qkS=1SE>yXCr6Y|pUFrdi>zh?j-P;yZxs)3%N zf(Poa-wKcNyE%hfJQ?VN$4yGBAgz-%GI*PVd-#b9fpZh_yo!XUAVM1qt?m8Rc|gWdwu}E{xCcQjCCHd9GDxLa*E(JmiOvau9(o=z-nD=EDVXyIEy` z)j`n0_u;6J5CXtpU(gV;p%h319;;)E_>iMM^bN)gti(-}I(5n`s0xcmRtECVN&eY? zq#+uY0GHf{B6+N);)M|^stX>%U7@x7lsqyH9t>G!$G8{b2c+i}AcjD2c#tYOYpelQ z61*M)Qg|lPP9qyY9**f&Kvb8*uKI9IV8O&VXb*1lvZ;bY$P>vPm#8!Xoly1LAzGk@ zP!uE`fsg3(*fcjX6|Y5V8kbFtkT`Ro6Cqlpo=FKs3aTCj$IN2~(Wwbo^%Mh9CMJOh zyF>Xv?^H|}fDwuXeS`BDTpi4ZRU%i3ch=5}dLaJMEJTCbZQ%OB7bTu;#2LDn!xEcV zFRBk&4Y`2eV%jM>GDWm3P;Wy?>Z~yL0#G=AT!xi|aJc=XFqB1Z0auOs?-0;a#5_dH z5KlljTE_=Y+KEjUv_;aNzXIt22B;WOCNQW_BOnV9Jgyc*6vZdC8GsVEPl2JhWc4Yz zP$k7+2PpaY6n2E84l!|94Hd{WkozujM06%T27zzqN-6IOC5Zy*^>aU7oJVeksNg~& z7!V$j*|KeR*a+*0feJnLnRt7Cn5m7r>BZG&$%JY{-yM{B53!65C_0AKr%HL?mqZeg z1Krnb?3yf?SLiVM)34YGD9W3IEMeb#$U8t8n(K%D8cy74){3-4V^XOkd+@uVw=jR0 z81>KP@cQ|Ek^!Y^^Kgks4-=OUvEwu0fJ8f$R5xUYu@nOW2--q+1biL*Y)OBIII{#0 zt|c-86F@{DVgTXhgYqIs9P9|ei9CabP?{WYMBYK56E%=q2b~&IW2I3UxE~}CH35-? zOG%6piHISO4oPCS$WRu{$7<;gki@|2l)XgZ5#C;_Dgqa`gm?j#{WfGUH}4@B5K}rN z0S)hRA}16-k*~o#*g)zjS3#z*!B7F%mudyPxj^pQ?(m6M<@FNF#1A6ED;gg5N;U9_ z=PJsOn&C5a%BBj_MA1-Z0?f*01v?~R5kGQOUM>`UBD$2jlT#}Y%351@HDBM!aY^+4c0&*!Y2a0u>_$C6mG?E zSydpI67GPR;}B6BJP;rc38Vs|Fi3)sP{tI1NTP!MxQ03=lBjiZ8y1K&j;8lm5pAp` zTR?1xy(F}d4=`TbGu%$D3ohdK<8a9;>iF=;CuEJp96h;!>b2__QG}`_6nvWSVVfwb z)L3!~n05*n!CD-c_YPo_C81^+Dw$3;cv*X}2f>ZZa-%9_jUa=FHtbK)(%dwt^B5-h5GcKNt7I@Y>;uHPA02t(#$cm-Bf2ou5h+e5aK>(P;izp&B0Iv} zV0h3!z?LE0fgCGX>=l{p!RO#w4MY>cM8)HXKph^6ogIVj8aY609Xk;n_x*uegC7{w%*QiwP zfAZD~jiee>kso?(MP5XaZa zQ-F-#4JYJPwwLvQ)yWYd$e#`RqpG;aJyxI9FHVPOokv^{GBi%wbF`Y!kxW538X~qmxx)BcPt7wE%VY zvMN^YlFTOFQ1b{fFPkH#KfB>%>%bV%O|n*gIF2Y@t`Vk1$p!T@vAS?8buJulT7(Cd1K*IYcmNbY>}IY`$^&OcMzK#C_95dU1Rk0SQA&H4 z>%juX=>bpJBOf;cx*-b1Al11!0tPeEzz~OL!V`&pz>PM&&E}S}2Js^_aiE~{d~gYH z<$wDI?Zp%h9+Hk=^8*M_c-&(z2ArRoOy`(_%+?s>k1PhaNqO>%^iwcP9V)JwoQw^i zB9ZVuyh)pzMHH)>YK|f@ytsZa8OXlV&60wV)O<{O__vfhemzh`ITZdTRop?bm0Ex# z7tf1$iac4W-9!Pztc)=sMGyB7)&o4opK#D+Q)UN{UQ^FlatJDEc8T zAN&YERcvRJJmt^J61xl-HZ&3WENu%r4Bv)a0h#E*k)U1zh1C#e2R;EC_Mr()D?g!5 z`$b5)5!*sSFy-)wF+phl5LW~>T?&i|@`kvI7 z$a-QBA@($>c$6~O9gZ~?BfOCCvP+{7L5S;txJT@uz-TGrXX6Esl>i3-;V1p1sL}|4 zb4XVJcLN14tXSkEUJKzwt>f0ncE|@*lnx^RV8!Hy42jf`a52%-^aeo$`YdFR?#KK0 zvyspPtOZ$e%zpAln#0g|TrFfQv8Y%=7kQ zs)}MIabyY%sS_CMf+ql0L>Q?+c@%EM_uM~Z2`P(6;4iN%1FZ$5oJ_4r8;3qETYxJ; ztw8wdL?SDWlkBBNNq>Q208VmBSTy+tSBD>oX83Uo02hB8&ZSuaM5qu%QazKhaDE1B0p1|4#M*$oB4vtnBfKAiYRbaiN+umyhhQ$<4&adL;W+u@4XV>B%J z4U{G8<0G0mFnB<2f?wzxI693H{A_{@N1Ho@my(@03xF#7Cq^a5q{dMQs45T;+zw)h zW-jWJ7A{gnh74So6&y&W5qu!B@E*z-;NmwVkYRXsx@o4D{q#VvRljsbxfO^s%_>oH zqEzfox_W$Ae<&BiD)8-39m5&^u?fZH!>bUR5M6>q6qAtI2*FP&?qU)uICNG4Wl^_m zEA)~XKtM=%f%sEYqS>I{da+n>Z#BdxO(?^Z`4X6d zs1#MKKpLKKRZIY4mPrF~17z@ydJ5=r4Wg>D zp8a?QQwtS^CS_KSp%R=)hB|P9r5q7^tRN?Z+ftQqv+(};WhjL7op20L2;d5kp#ThG zgh_RQ8DQj7doU=$R*l6L!_to(NCU(WON7=sY>r+ZT`p47NfXWO1g;nhAO)ob#_hu{ z91bXUpz;D+I)qpS7@{lZ!R0w4owMU462bpLbZdjR2=$H@|)0J%>zAk(Uiw= z#*D<*QLF~!Q8gJ2baU%46=E3%O0gv3Fq2>e3>@O?fEsui47{)x2ses=lwdT5XlSzB z%HmKA98`S@BrZL4j7A<)41_Fvn?V6P-86iD>KoHAjGgHL*uyamkZKBG0Qao_4t&D& zNp%99S}3IZAIi-HiqIRDRvJ$>DS-^pk($U~(8fb3K_Y-VDOXs}c)j2TdWbb~(ZxU; zOGj4veo$)UIy#aKMITefY2VO~qOEIZ3%q_{1V0<>Qh_ev`JfMtGxB#iYDHX$PTIp#Ydzho&>Z7W(fy{qTxW&iJ_|o&_En8ci3-n;PC6w z{aEH=uXA;jO&n$p#P9{-j4P!>Qt=$XGKeEp9zDbc2%vFuLg4npo8|IP7Rt`Y327O8JxJjbGAz+nobBz?ox)G`> zM*#dW6z$TOp+n@u0>XE|@q{#q!AoP-g-4Ih7D^qc`|v}&H0n8`gCR8t2RP`|tfVO5 z%It=;(m)AZ2e*#KLWyHvb1kraI3HMs?*Vh*^nf&-Bo+yjl+eZlp$CayN|%t@8K{{! z&rGg>lBUe)h){&7!lt03xHZ_GDl;7bF9MiV1dXNr%G5N}4^n{sVeXmMyV%o&Buk1; z!}%b~z_g8`DHjUeWe3<}T{m9KzBD5=;x%y8h5!JeSw8Zk_0i;=^)5MfEzSOy*#f#BYu zuRyO5U@zT%!()}H8Bk4DmbSW&IHIv5tvzf^v@3OmzAwEl1_v*#+MU`$EGT2ZA3D{tbQRvdL2 z|8xhKDPc_r4TbAMJOk{=J%+x$yb8nSQ2c?5h$&^$S#~%g{uvSJ!Xg1`Ik1Ezx{xUt zn*2l`R<(55WTr}IN`xW`U1OvMY?qlS3@9iZi$zGtWD7J=vBIKc3r@ByLuw{J)REIN5BWD0bW3#6#f zRKf}gSgg=M@X4<;qa`Ilfmi-i=A^Gc9x9Hi4-3+`2C2eafHVyQX~7gAB27k@DBZM5 zMXuvWBRhm0`~+43MYtfHT$$Rzxn;5vmyeMod^v)Hq!pJKwSY0ehqS$zr?di#Y!2Iu zb%XGQdn2TU7y%Oy5;`{GtTE`z5$I4d>p^5eOyt1~X_d$ixfvE49%X=-+=Q4)Qo#a& zDRMzZFvZz0FmVve+?i;xz=}aVAm4cP^by1?*O)(YfjwUFFd3y3faQEL@+utynSCN! zWYKW`rTIh&ll8`WgX54xz$E2^!Cot&C{s63I~rIrdMBgFfFy7yR0*am<0PmIiZ?4u zIp;{Y>(D^r7nEkZWiW-o0q6zs&d3SsRQMqQ16KjH@P+X!0zEwNge7vwtP{&dNYZDL zTO?wB!Wp#Y-|&n% zaFK8rm>=N*A=>cpdZL@Z=vPsqfibuN4-Bw>nCLKdNG30Pu%!^fGB?Ep98t>E$n*vK zj58?%uS_&xQObN6xKARJaX4BiGWrx4<1i|4kBftf18M{`BbmGiXn0VQrp#ziwSXTG zpV4FjPgDYK28UtSST9sC>VR}(fgoj6GiU-+yG-kmXr&aB8+j2z;OuC{<5^t;751Zj+rDtf=U~G$t7bK( zpJ)@2LD*O_$E?frZ~*S?@_b$Z_HYnjgu-ZXS?~}3A%gVF*i;NuWEM&qbXTEh%29r-ht=h!ju zg%j|dq_y;|KpT1@BDKkC2ktRmmkec-@5l{d|9}eU%*+qaf}Msyf-K0KC*LvRDUVGA znsw+6ga@`b7K(2DvCHB{%D{3Uk1(ozEHiuz8-^3}d>d}CN3erAFOmdr0$whd1a`_! z(+A*D7}5`NAQFt2l?E%VK(|*$Xz?CpJPEoQXhmRQOV@!Mqd$Yc=On&4B_$X3jWs4h zm^B4(Sa_-jhCDKb<_K0L?iHKD-668M;p01); zcTi(mV4y!!df25{4&vzGVf&yT*g=p^_CnkzLfyxcnfNFq7`&COMU4h{D^Mhjdl?~S zBTeccM~B(6)Ob2FGK_E)@k0pmPP}^%Qf3S=45U+ovqIB@XCuHFqz6o10WMG$fHV*5 z`RV=qu;>^eQ)sqe(xEKbE6AZ$x@J7NLLRZv2w0&jQXtSrGEx_?RtYJN48L@K# zKxs>gJB3k9yB~AZ3NFy$rKu`}iXH++4-PQrmuC$Ehz5s;Nf4y+H%d!1F1=xFZYm&C zr9eHlvlUvw1O`AT^SQ7N9vX5opo*fP115kO7&3=%2b3N&d4kJQbZD?q`w#|jW$+eS z!_+(X2X7bC5GRSIg4jAN1HO?sCk&sVRiFX1*i?)Ku`FmEaPz<}2m^J&^@CHP+5_D? z9^s=QK%^4CfIsa6^qn2OhuFaV;HqIPltv*mBrZcDw9cgGh4L}1=wKe9!CzxY5n)7l z)8XZ*62z2*C=3I}O}m5P8W5fCB|MJ+mQEZkQxFF>NCUxz?nfbjphEM77P4;?PI>|q zebxd=P43dQ02`#INqo=^AfqsS;AVC@VALguki-#y#XZsg6NOEPKw{)U8H5OhOMt*b zq5_FBIzT@Xq@YgIXCZ53Zh+7P!|2oi1T+|cU1&eBFN{Fu9K`3L=JFm&GnNQshF5U) zWkd@XgHbIR5yTs`Vcn=!NGOs9=%68pB%`*$hglC7Yk)|?#zAPwxR&q&p1_nzA^JYj zJH*nXHz31*><>*u5!Uid22b2jGAU?MSV%v@1O{Z_>R{wS zlBK`rvl8}zA<|A1Ggty4V33QIVC9jY^pJ&;QADJfh)@Q~e@qAb=MQ+GGT_M)S!fdS zSDyUhF*XRJ^hCH)9uAUzusA1%XjroD3dy!OaoxpZD|NvH^2K97~MKqi%$?a6i0Qh#_20ynbR% zelFur_+_}V`uk*)}$4m9G2(vCu8pa7*%GsL4|#Iv|!Lj@w7pQAy!De5OMgoF@) zU_&MOsU>hI2AL@%G@t?!NG83QJplB$D}|mbuus22Qdx$l1bD$yLJ`acOk}?_f}S(5 zw^DPVs5(o}S?H-F4P|}@rv;)dp{0`ixO}KC#InqYyP5XE-XldAVq(~f*cJ~7hDcon zZJCos+zIhu{V*P2do*a##6JukTpi+>4kYBn%9Ea~F+jrG1(WEZFdN4h0uv%)0$@YZ zyMhFPhqQ0SA7Tgx0}RQ9@g~*-(7@Ob?3XxZ!k<#Z`ijrM^VhP2xzcR5ILIgZkLY4D&vbNvu>!V4pbGcom# zkP*v~q=lN`%yT5jFUlFh$wLh$yT%jR=plwk_!(v}{RtX`@Mvn2v|*VxVx|qS;kt36 zR4d61X_2lHg_|mjlBLcF_AwmgM%yu>=i)vB!xH>J6+CqdBe99wBa4m>;1N&SLD);o znPV}7sz^p$HVki=A0w1JYDZg?W)6?02sp`T1r!|mPBJoME1HirHdB>!X;BNIkgf_LN&^z)l4ov6X_=O1QLGd#+#}!$YZvnnK!aLQk)*RgZ-%Jn zu9y)a3MA5H+JPJv!o}PetyrRqQs(91Wr7VUD3+i!WP3Vl+UA`k=w#)UfL z2%`caOXRRf(Lm>ru;W1xs|auAO2|~^=qTSVK>`uQxS0eHs75oL-V*~C;(G`7gvnna za}+y@IzA&AsM8e327t^m6wJIBY+uNdc-CkT@gL~%VWYCO^hp@YMWoWjKuxk&+%|!V ziaR;7VEL+9V)g#4;<4=A+=DV`ymNlOl0si?~G>Wfg61(tCbQ8pYO`;AHdVU@sN1-B*=fp& zBq1Qny~}5s4@^U2Tj5dADntd*Km|;|Wg8S4{PN)v@GJ;0Agxq(0fH#qR)%_oX;Ufb z@(>yr5X|}kBLs$qG0t;Fq&8H8X%Lo(q3nFUVhY;ytPPr@KEXNYaiOb!yF;w~`h%gha1&NB-<`@@h9M34pxO+jKn z9vUX(Admc*T54w+70+F|bi9EWHaKsV+Rw$8$^!=0m$cLIR0OD-)HF zu7ACm_rju?z#zq;Wn4G+$mAh|5H2fg%Oo*213e_327%+T-qM!CEtK+xYLl)z(;%|B zs8}}>S|~nTZ&)sW{roKdDud8o8Hl9E#ByWo{TOm#sw6PQipLMLbm=e{Dz*?VlH5onV_ETE(ayr=_*Z zx`1?&LU05)8nlbxM8ONUctlC-1^T` zT_2q)HGf-;lb+`LX19M>^kU)aD_kSXrwA&a%-8c;f}rvTn$AB`Yj@#R_bbgb=jWTx zKj)`Ty<5zd@N~$H2M<2xt1>g}-Mojte*E0xW6xyqk1E=7_pOp7e&xsm?X?NFP=m!yH>)WoU z`#Lk%#ynGR4*6E;!@HY4u<=Gq#|mru$2BUSt5@gd%f1)5^P z=|k6wIa{p1d*q~lw7#)P1^xNOYlCVf47rm2+I?m7$#FYoENyupY}t?{`FnPYDt9__ zSdNQPgVx5Bdj4|o%NOgq)p^w}@4KdruiT&9tssA!AEMormv^)2X?>;mnG|5&+T1X%}ie;ORLmpHBnV%aud6H9SWDGWyU!k( zk)_3$HVtN$`KxrJt5d>z9~iZ}ed5qURWrSKKCtfG;A7QB9g8n)R8Ian`{Y99znd`y zqK;-8`Pa-mBlBmn)IV49_eU3#TbfL&lWtz(T2&K-rt9}kwanOX#q<2p`cey;{2tWI z^JT#MqQ~Eks#?o6Z^+JT$#*`S)ge|JACRiW#^(4OPxtr&as_@!}AqK0^4E#a@GB^bUSLG65LCsewcF!;75 z<5bJT#ixdDwzO%OEx5||#fdk*7+A4Np}`;Bma6mS&b@u=*~Nt6xh{W;>bEt1XX}>r zwj5}iJx$Ipzock+`DX0gqRK>Tr#64j)5?slS1EbT(YY@yts5HTIM60X=#^R41RE~B zUKIQI(X{Rr!}I5UVo7j3bn0eH%XbHETNVXbHuk#QXhhJW4569Z1*N+^?{I>czQYq* zww!u@_R;0^K|w3a=1G!A-M8!8kn``OqUJtZSR^cex-Dlz66I^?XqC6{nAjTIht8Ng zeelCaw~A*zVqN&LA4XZlWlynG0*Kh8Gq{;az3-=(twRY z5l5CpV;Eoz8$+@#2@XGN9P|q@rcrebj}e| z*F^r(I79UHu^T4`Hw)R4;C96=Wk!9twk$)%oEwj>3y+A1$h^d!dr9+TzvPWLn)h|b z8%s+y>T`67y=8+7my?$n(70_WN6e$yhq~Q0dR6~;_~nhpg;VxA5EJ%xTHQ89!s`9C z;_HPqL2=!C%xyoY)kbITb7yPaPZ?^7fA&0HofBSpOO0lAU5j?KdCYdsDHoA2wDi=Z zsx`;Vk+#w8YE1H6{*We1#^B3yFX@98ze)2kvdYu8&(}Ozm3h~)?SJO*yj&CVVSBsQ zm#>XqIQaa{!egp^pL@}E@7q|VeTv2}`#tmj0*)nx$K&63Leq z$QAYQ{D~@w&L6+JDM5cr-YcnUCu|XN?vFFS@9W=w`=Cjgn>H&ot3-)8ksY4q9Q61_ zif`rrh+MU01s=-eSjoSI>@w}Yp@7_+bC4b%}6PItzRU&5ap*p3)PS(;g zHPek0cQ${X9&$C~@wJ^RFRggm-Di8B+wZe=Ok87giyRr-hb-7VX3w)yTk1V{H>ywb zGq=9H+_bHgFS7OdEf3?G_%c``_D&k_Od6j*uE@ctDW#i~>U+Crg&jA~X9$m2lHfq@ zuwCCD+^S$1wsY&U$2E#xIQzkKsYU)1dn={dyM0!+RW+`jS~Yvyj1nz>8?-0Ksw=Nk zM0e`nzuF(APA#ARVfOsvZ`QXe_11GY{pgZUPtDv@>Pe|LBNrzrJgCvvd0*mp4_bU} ztGVUl=a;8if9f;vd31cP`_n(~{ra`~+AaI4Mvfcg?0qh**VV&^lN)DDNBZ=w`%cRl zRpxWP8xMaADNt={{<_0*$8Y=aIHK~>^X)>eC|=9CKT3QX)!S#(&%e5P<6p-d)~*)2 zoNwLUuvIzhO-tZtIKdqJ_xcB?-gkeOV*dD)E&F{q^I2&!x!}O{?S|%g=Bt0a&$uDe z>t`xmrb~~W{a;3eE$h{$TiuJ@A_@;KQ1^VNR7)~XS$_6Kru&6XE$vVx{I`;CGYuNt zV@ZR?jnj9Goz!Pi>be)+wJyLR6p8FG|u-MxGFO&cPwWgIv&-oCTS`|;gAWoo?2xhQJR-frf) zo9>gAjJXP5?$|qZ5oO8w;=NOcZ7a8Rv3+-iS;1NIpN#3UW5A@kvrFInWoplbGcPS3 zGo+>G@cYWC+F#mT+@bF%^|VIHJzKM%xNyFGwo>WlmUx?L*V#U6x5m7T=#uru;1}<* zHDBE|>AMNvinjeQ{_4%W@ke%_$&mN^U)g6S2!CNd9y4s(y{AJ;ZyLKY)59~dnad}) z*V}$L{`tl{S#urV*zDIq$8tVMaB{?ljh)B#f4KjC&(>XM`|GW0p7X)eg>&sS*NlH$ zZ{5DIj=iIwrTMFD#kMOmXDWH^_2~)sZ?tYbCcfnJNqe^LkN=cn($<>;FAmt!;YQag z4{zqX(s1wK$e6e*EkpBl$lmWvyF0DBbnRSy)RX!hBU@~`cjAiMl4eln17V?0GnI)< z^f7sfO`j(tqEj~7jZrDHH>?@vZ&d3pG z>`jOC>-71KHLTZ-12>~{Mc0`!bJu{+X);t=yf()?<=m}p8w(^F5I?%cK%?fLEso|Z z+NH;fOwZ>YzB2hq%&2Z{Iu86k%Kfch?=P8(p4|KOMVU$4ZlB-#w&d@-2UK|a!7Q}n z^f6j(FJ69)?=Y-fvmsHTYcq7tc-t4+ zKXax*>c%%G{%RIw%U><{$lZClb_~|$-&*s_>mG-m2d}t4F|6Xpbfw+qyWY8)x<6bk zbFKM;FSRZ&N%L^_iP)iz&hP&iwYF8K(%l{}@0oS$ramu+H`x3<=4Ixr`(6xK_crU0 zTbrKdJ#=I1;tczpyB2Kk^0Cj$>jjpqdlUcqKwHnd6cZ{>J=yZ?l;$y;{up$7_lBz1 zpWW^~=I+>C$L7{7I&tE$1mTtUU+(UhJNtC%bJIc^T`M>9j8fLMF2&+`O{4Q!5>Ai3 zS+wul*<0@SRAbf1{T~YLa<<=iam560w_9OS{#o)bh=ODh7-y* z%3|%+d(rxIn@>hL_cWWkef76nttYHG)MsnKO}B64diHnQ!Ml2WDbgg{`XeQOxw0*C zjJ=IL54$?e!eb*@jGGbXz8fD&_?uV0>{QQH+E z1v-r=u}TZcsXbcrpu~$3dmhAZ?izP?dM}M?+?VRy*^{RI^fu&=GVd|)Y-amaPpS% zjmM?#va)o~hz3{Jwtil_#_s1kZx=n;W1y|0vs}L6?IHZ>AI8kOhq8rx#ao+%5PC26x@(9D$y-dx*L zbFnp_WkX19%PHTGPrlyiW2%oVT{|lD%#pL1zJD4J)35ErW1||iza8KFM(VcT?~E$Z zY5U{&8L2wDw{*$WbJESJyC1~3+cjT0YEgXKyW=d4inr-m@JXvR1C^jvpUYd4d9#%5 zd(qmua=r@bdu{A#W`Do8Y;Mcp$etNT?_PNN!0m~}t2~LidZ_IDjSH*foE%%JPMG6p zrniGKH5~tR)#Y<(66Q>|u3hE0nMvdCJaEqb{<7?;^!~6!VQCY(YJblCazVLK8*08AH983j;}pRrHX0#_rr2mu8pdqjeGlP;I#rTPNcb( z_O==oS1>AR-|xc{cMCnfJ(It`+ZUO{a%cbXfpc?R{yy#Lg9M>vi#uE7j(T-)!q>dR z+l0I=XbCO)X?D=fps!U9EZhC&>F+tJg-)-yINkoZY32GVanr{AQDs2-sDhOeew+2S z#g{%)ueaVltZJ%ITcHuBkB_cA_|@hLW%3sBoQ=(t{M+9@lJ8sAov#weC7M)X%?(#Uab+&G~!j~np+*!ZBMCgbOi<<5ocs}O! zr-|p4s5dqD7CjhLBm2lSRcGd$_dUy_`IaP$!b|+#;JfQ^w{4-rr@yJ*Z13c!TU#zm zm~-Mgd+tryr_`KQW8LJ`Bc|pFP1A47f1eui zdFZ;aOG;#(nr6c3h~yvdKj|3MvumoR!*8W1ndrq=%aJ-$zg!6l8@RH|_&+k{DpX1h z>6c;u?wN;TEv37=cBX%u!dW)T(`&-fp=XDlEmdgu{ies7=S+Mh$g<#|S=+33`}zE< zB|mN7kySmOAnkw-Gw&qIm-$iKhC#u{s?`1R_DQd>^9@S|H-6i=$>)VhURWx|#_TC~ z^I`EG1%?JsEnjGM%9>N3_4qYBcxr4h*Mlf;(G)`(rm|GuIceXUx8GvEcX*L0vbd#D zWQDjB&h&3y41eqUFkJ7FZ|$q)N#``Syxo3t>BjOKj;0Mt-S<(V$qBQ^lvwz3>6P=@ z7xt`i_=OtXw#$IhLpG+)(JOp>^Pt@y9Nqf8p0v;sS!L+drRPQ#JoaTn**62CvsL*k zdyPKM8#9{S-M8b)h&GnITEWO;14_=Tv$)8N-OZ!E{umhidE&Qc#U~}4xT5L$ zl(CKO`YdsSU(|~I&6=}F-|}sWeM!}=_0?+^UgtUc_l(KEJh1pO+!|i*uO6|lj{nx- z`-ze_>z^1mv&WH4d-~;RFwMMpyL0siTcS$zKYArBd;M`mVpra4u^~~qPwyvKCZ;>| zxaWexDZB4`Rr=xN6*GR_K5RjjDSa2bo%T!ljO}{O{3~qcgDDxee>_|6)T=}D`u>%A z!0!((M0Ls4FM4ul($THUPfHuoIqAdA+gn(6#da&wr{10ur3%M{tlVAhR)W%Vs;pj` z+H!C1oYxLZhR2~T34vaZ+Enz>s zZ}jblIU?q~+-|Y7?^kx!+irD>rP;7*N>w#&tvjP0c8Doa@$XcRcdqXcA6qRdxus{W z9fNM94Iip^f0-}Wj^-m>C+`&NR#vS){kYa>!@OR#+uTb3v~<+nT^Yh(7q?8lXqnvf z#NC%|hJF8V_LV0(Q+#Bqs);?dUlj}ObRvC|MpIH{-nVX7pW_YBj@z|uVEZIrKiQlK zQ_pK#uvW1OY3B8xTloI0`_(^nX+G;=w$$A^ADLwt8#|=#?VX9I``#|>f39e?GDnW= zi9E0@s>Fi7l7$~!{k>6*hDFm%@n=t%`C#(g^OF4%ZrfJ*N^eVSoxCF!7GASHakh@W z&K>5xYu5hbo|x{-TWs2}>D>Hjldjb6P`GQqkV1(vtxsw3>?u9+(_2fLY2m|0A73+e z?2x#i22F=QOK>jEsOPD9#ZtEGo-sMr<~XZc7G3>3VBhPD13n)eGN?=Q9=$u=YQ7`6 z*F4hv+b^kiCrP;Crr)X^C_ZO)lTq!~PCPZiU1HNv=a4&hrj|Q2>iDj2?bjx)*m6Y9 zbh|emn(I!TapQ@L>;1V?Zs}jP*v)e(UCMxB-4>O}T6A~$l*x0atyFC2k|j-CS0c8p z*qD9B&>jW*S1#J5W2`!)v0A!>_CaeA@%SDH-T##~p%FT5g4Pu|v-ZXkl>EDXRI4=&I-s0h^ z%u6Da1H)4tyBWKv&(R8X51(srz1g%P>%v+c7~d}E&eFYy9=ka<*Aw^iKkJuRpEbT% zY|m#x{IadigJLCs(bH$o_O@=HHK-2`Xpq z^QKIyzfRuUn!0r8h)x?L_wC!5&GNo?*rR>!5^Cr3P20`x{g?VSU#ABzBj%f)LC>S= z-l}d1>;C(UxLHm1hBs2{F3M76l2$imM97kiEl*i0g{C~;B<|OPy_Vz%eek(;%i&=Y zJ5OA)cl@uv7G99^W#?SYwk4d_|Ks88*>_wzbmmpA&ZAcsH4-HpW@NUwD_UyY+chBP zGD}d>S+Na6>-v6O9z5{QDf9NiExSjwN!N18arZ<2w`rj__8z}j=Uzm`Uxp?+Td2Ib z`)>YmcfPGj)Syq?(fBX@qXvKOFg9ra)TXY;`?s$3uw0vybWQNdUk=tEcIdEqb!6LA z@4r?~Ue_#E^!BEvhn}Q-@%2M*%lpP_&)#?zT~beT=j7I+ou@PpKA5xPvP)-$d z3+$gVF>?2VLH9OQ8sz)E^YCUP3WSWv`!wmwm^lfywy!>CVLL}ek>N!urC*dgB==vw z!G}A27(Thx_uD%QWd2g-Ub0qK3YIOmIC=HAn+85zHZw!Wv$&0W7lqj^=k9v<|89vm zI;X?tSGn3JId{+a7S`$G*L73k*5+&c%d%(Jk3T-WeOHuwSIa#Eyq! z<$}ANrdsn>uRZhVyM!%o{c<;Cal-xCT5AojB_CC1b9`mX)teU`W9pW*mCn*;Li4u^ zQf+_Ger>;Cm{s)IR~|6R4oRxO*l{*NSYs^$pEvGq$qGuZme%WnA__xMv?ce=6D za-QB_NdD>l3)Ks6vbX$(!ijGe{w-%nha&FR2?ig_{b$vPrdsvrHARawiM|}0bf|T9 zUfYtw6H~nSx>&7HcV<}onXk1S%R8sMIVsQVVC(OXzHg6Co2=a6Zc6xJvwqvO;Z5qN zY}YA$+JwQEkEBdDMO_lH)qUng=ZQyy#}vKMqx;2P<;F!ETw9^%Z%3vkw>-~OXKC|8 zo^vf?5*~8wkMFth{)?P7obTpMZ@#Tc-v>L_KiT$h`u3ySuCy5PD6(avu4z5f)fMM{ zch0W4ZhXS+YVfwaE8tf|g^p&wm^Js_2#)Tg^ZJJh|zcRM~j?1!ClK<+KTsx`e?X25cO?%zo z+??*;iciQ001aNOo-Dp$QsuR~vaWjaI>F_r8g4XnYM@-?#7g2{Cw|l39RkHgA-4D z`bUcl`SaJCH7;q)Q`dv~i%KNzGjm{cN@udf_1b34Sgv=(-#L=i3|@M%-g{3?rPLqFGgp+n=Rt{uw;tED9r1^3 zm+sY=nDFlKV#9-j6C8LG?@LypSbEEG|LkHz^Csv~x8b404bvAq6`cD}FJ}phRx?9X z_a1F4Gz?A_djH|LacjI_~PB2JIqhA<#lMfKTfrNl3TH+zy0c_Ijv+C zOP1whSB_|Oc2>hi2iom>+U(P+yK(Eya6@Ub|e^DrBNj*{NL_0JLxgoW&O|KEquI(3!U8`ihvbgW6J86Q>gtCHIc>lS~m& zej74nr}u;Q_jh;sw2)8c#XZG3zf&D&XwU~LB?vpMCc4chga3SB7i(0x)tkN^1DbZH z*Iw{mvIe+0Ue%}dwA3`kD_tsBu}!NFX5Kvlu{ZmddbnfFNTz20z>n)@kzDi5>LRs` z`)S1@c57mIr1PtDin6nT-W8V`^Uh93-LAyX_mARU($ll$=ZMM&{CAwQXXAklU0WlM zhR$E~-WC6{MQbbgyUEh%8RPI)Fo`UyOapJ`WQGSJM0245X_heAjH~!vg&Hh~2A5e5 zC@8Za%pZRHy+cV(X2XnJamI={XUi58LCjiRJ&~R+bp|DIMJ}#(XN2nc7Dkr32_b2& zq^yW>pq>ZQ8COjR| zM8}J(j|3F%`L%Ym*LWxSBa1sU$BAB)*nUyqRR@CP%wUxE0G|kcrQB7c=`kytlc;rgbi69t z=C?GsDi0*NnyQ6_S0E_-(lqf`pWnbi&;ha|JnqZ(9dtAS;GJlqCUQxf8v6hMAOJ~3 zK~%;nKhXf7s+xQZrtYLsso<->M~|H$kcFfO*Z z-~N8oG;sgCSn`z_2No7J^xikOr$PxnlH>GpKTuKD*{dFiT{QS%c*ZU7{MCjoY^X`a z>zv+q*LMLA_5GxZ?!R5@f}XtprSYaW)@pHMsQ_%;`H1saWo605{v97NHq#0$>DaQL zQ8ihH;;30|?H6S&u+w<)AcXC=$ z4-Q|=cZ<^x-2rax)n}x>Sa!r{X};((1Zo5SkonaCY#KsIN$kk}^=RBsH}+T7zY0T7 zwdr_tXz8L~e{FqNTRd*uKYuLx_lNp1ZytBo67p|fe`nXlx0LTrSI=n=NL*<%N$%i| zmU*@m7Uo%ihZS|ya!Cbz-P*iJzJgz+6HE>D)Nyg+aQMnm*fN348$YEnP9lHI#Ea5n;OJ(P6lq z)h2-m_!iG(W+*GmIluw&Ene_djFvByyg+k+eli&t7&yh)Sv+eUacj%ZMlP*x@BMyc zxD?h}{^mVbH;P-&HGX(;sWz?lmcz@iarZXgbSv9+c~@jZdHgR+>~jvRZ-cb({`nVe zJg~m2txbHiuk_EK_!^cjjn8XrA8Fg5b?s8`y89cqr+vP%^4-6kaF$D4acR>lVcOP+;xYF=P%(VE#_rV0pL0SuwRAR!`4DsBQ~%%6+`h!pm_6#Z;@o z3=0tUGH$8sjD>QXZ7l9U#xg>0t~9d%C^IlvG;3=ocykauX85H2wKKL^bjg547bYvm z1}}R-#sFgxR<+(=UeXd~apwCxb{wj*?NkvDT>Cm}l*mOuqIyISB*3>rFVZH!*!-!C zRX#m-l=IJBbw{J{$h~-Ee z!`28M1vrc2TCmH>6BNWGwnxED+2#Ug6w1<$=9`#Ty=*IIOb49VLbclPQ&BTGK=?01w@n3Z8M{L@R**yldK3^EYUMVMOn5 z`r;SSHG39|ocVr*P_lbszI-PD=_SQ9Jld!}`%B?^J4vpo8p*%-?^&nnL!%bJgSF6YL9z;st?1#*SyXNFR@~ zY3UKOszwgX`?c8;Td;1z?S&=W@k#K; zWdH^tWNcfB-eWRuH8iQTIH>VwzhqW-z#Ve%%(+z1OQ7_Em+whK~AVDQn{n6>#4#j3I&h~ z0&EHffSX9C#(WK_~3gAKF6nv1>lalGjR$d=m|IwfgKg&N0m() zlD zB%xRaXm`=;JW@eJXHx)34oJa;WTc4YQM*|ffQF2s5rC+vsS5yXYVt)I&=xyZr%cVD7WCyPZ$8uq$NkJ77t(bR z0M#muEJ8@J!Mu_IDWs5JC=UWQtYkohkpiJe0gC*2z^?T5%ZzbYDEtg0iepDR{?lt?HZhYU#+qC$PK-{&pe_ZzF-ij^e*lSr_|~4e)Bg? z=fQLwO9fIO00jhG90&I6VRa6pOx4ESVGS!Fzg$bjX_tj>NO^bRc+prEDTe5a&Y&anr+qj)-b z`f35I0xMDlkj?=20}tE-!T~BE(|nl(*a-M^1{;BkFG&GE;OxEKK<|>9_CEQ_ybVX> zL`fco2^j!b%R=)~>>*}=g-Y@_uF2|!JC6Wt+QTV`RFFk5e+=ki2q{nqJgA+rO;7-S zKm}C*6D)-Z5b!L(nC(a162zyWy4P|)O^$GidnbLC zmm|aCEY9M@lXPO-_Nd3>?*M>08Mqa%y^Mkl%m8Nsz~7kwuLA!7v;izA9B8tK?`DtD z$`X3@GX`W0uK}=%(vdwiU1autY`yle?|wM?_1sSqOL9m3W6mW!d(iZ!kP>l%(Mtgc zLJuMZ3Zy`jG{*se3F?vkpg?5-%QW&^q!Ttp01X5|Vd}Ghf(4p&1qzR)5j+d-b+#de zAPqVll+f-j0*X46`8JVHlOvq+-bpWNhv*y|`L3JF3x64ZeK!EO8Q^|Aa8KT{n7j(b z1pw*;92fX50Di4110ct`bPY0|0eFqi51OiV2G9YD=c)&;akdO($-3N;7soT9-s%ZP zFnGeI2*|Nsg2teDPj#WZsRFzo6o96{VkrQVK(Iu>7NLP;Cp8fOgvfCZZ<NhvGaf4F9LQh=fB!#t&649=7(vfvA6BE02o7?GOnq6C0o z3J9hUEbN;j7^z?(JV_nTWe0*lPD%w+(GYO~28fKdmvC0fWe^sMeJD+jm^Hc#9S$mh zbU(3>0)!RYNs0y=H_+c1q)*0a7nq~HssdvHfT*E}=Y1{!sCi~M9tNO#It9oSR~ifeM_(SrT$mickVdf(Yby(FxD)9IqJepmkm6jVwWj31o^E z3{Sdy5zw6q-~dgqRS<{KagD#j&;dXn4%j9I;W?!6SzreU2J7bm9zIuH;04;eDruZf zC{XNEWl$iG)vslMOj1J$2tcz1rm$Oh6dwgcTyN3|C>Y!DgJ`nLzy(;7VJM-XAfP$M z?*IhI`YGV!b9q9)LN!dqZcgcL1SdK6sXR2nd{|F_AX2p8wQ`*4Ia@Xz3_u4U2K+fl zK=nXxNetjoHE0X-0zi5sZ)iIm54%xtDXmib2EU=S8v`7LP3;CGBE)_G(Q26 z^X(QkM<*X^qZN69TRv=;DKwfX&hZSTYEai?uT2U>DH~uxT)?t;N{MVx3R8xb5oIrv z^7g->p7{fYX%I*u8RYZ(Qt~iJK24MJ?JNx0-Y{4t0?=ugW{O=0R5NF%M@)=ligRU7 z%0{ot*KRpW0)nXSwMOl604W6eSV};$q)RK_nw4o*F#*EMIVB6lRg_+uwSS3btTU z{0ndwf?1d#98`r;P=G=McxV7*Ip6wQ-H-nP`8e!KMmS;vlt9pA4bWuGlr2pmn~%0l z5C;U_pc%^tWM7~}lL?5)0?+3=Wf)hcglarb39QJFOem0%HJS2(0ZzZRt!sAe(5T|b zLWJXt&}FFvUnRPZ%x_r2f^gLaofkJ01<6_C{xY` zMqrWzBnhGN;f`~XkpY7N&vU8aGzD)`@Yw?f1p$fmFkl?Q+rT($Gl0nhhCnUe1P@Tc z830)D0L4{!KKrn$Jb>^1(E46&70$mOgo1Eh{;tXZp;UtmSdgKe%7^KG(wdlIvy=e{ zHF=o;UZV@gWfjOE#B)p*gZyJtL1cpxHzWBt0IK2uglJFzrEFA%qRFN%sxr?4a3xxI zL?R%8L5=PSB@%NgicEwP#GO}EL3)b{LSX%;ukS}&;d5b5Has{;S!F3hwFI<)@2Ci zG6FbQEW?3tB;S@!$@5oTH4nI#M;O0MvmnRp9c^_C_*Aq0E!s0=U>bX9Q?<}Sv>VQz!6&!|Ifl)=J zGP$~=L!oS0QuQzEvE;_o!CcYIE-uFv)stG-nj|O*YxX$beTH?#D})OHqAShk&l435 z6~7f!LCLPxJJpOtkKJnvNR>`&-Dmf?4B+y%%UiGjhO-TDs0XlMgH#B13n03%0T&Dl z*kCDOGO$^<5Lmf3Sg;Hj7Yro;s0PS*9%sV(0ieA+vKt(%;$Jzp4un#s1k>{@p!wcp z@Zdlc4M7n4kcdICC{OnH13p&GX(gj;YL=VV}YoGIB|LTKakFch&pk&s16!BRAtPQ}<&wve=5|aUI11#f$HNm)3+b3m!;EEOV zdI12>cv~Ihp0(Cp_J8)!bimA~o{&AoleH-=NdH6fU({7J!FOh|O9ru6NLS!ZO+=bpWXf)5Nz(t>Smff*OP;0shtILp|o@jDLfQ%JYTqll^eP)tHC zIReWUuSm_r(?O&n-Gn%-gy0~6?%GygM^o{3R4_dX2rTxhK9Cu7daqUvC~8D)0TZS! zp*gbx1Cxn-3Kj579x=(n1)DB}@AaFW(-+@Sm5wlDKq=}jPVF$);EnqISa|f}_EWfE z?1g~Gyaqr8=5al>bv+V*>1Nl+`oS^-vs0Nq1JpXaK($v z>ufvkUbw~Ga^rOe9$&Ix(~vA9BmGG;LH;x0p-+mrKG_2-!2kdH4rl4gCKmZ-RzlWJd?);a{q^ci4;qKVpB zM{-=?9ltMk#{AJ5WF5hFSe}gZEFXytx`ZhWb#czVvrNNiVR$)^qpsFhGR)`>L*#DG zW%mr)B^~c-J__cHM%S1 z@+*_39v$J_z9U_$*Z)61((hx>un*U##CG^bae#o@DK3kP|ZlqDfvqUsF4GbqmNbnHVD+#Kc2VlfWxf?WphbaO^9$2-huP3fQ* z?Bfj~rxcBUsQIpb3B*4^NM@#H(W1Bmz~pN-%yINN+m&D(V5%C1%6)VQSs*J|7v=OU zrgfRwoJ4$!%B>1<+J~xvYhUN>WeeNHcuis)(lMh&v8wSzi05dw6>f@3Y44=c^!-r65e=22edFOl zM-c#1Eje7n*%mRYK**j}v$REH0a)OQuyZrHCPfz2W*N=eKQnxsz+SbdiJc5x?PY@7wak zfu|F(8RtcNYG7BkM^`L}ri=Exzybi3Q{PXAQos>ld$TM(UVJf%0a&ms45qw0iJO%u zADlUId%AXU_Ja@szvNWr=I4((3O-3MiAj-2_}3IkfXh?4?%Z>)59e$F|37c<9%V;$ z-T8m^sj5@=-n!j=^+G}|OG2_hpch2=ft`fN#t<<;JZ52>FykbiWPb7Q=b1ca66fJ$ zk{Of9#FNP+KTl?Ud9BP$urUO%L4oiv1Uoik?2ge33AH68p>DmU+ugVBy>+VU?B5@C zyCpDSd4XN4*Im7I)!nyhpR@Nqdw;**-E1;%*TSiBV0$y4{8G37+;bkl%BBVVE_lwy?eLZTHpWfuPI|Ob-!Ghwa)@%sd;3>Z3w_~>s~IQ#(@(OPWwP?f&$I`6 zM(sDjb`!771FF?(wQn21(ntKEgg^gUAV4qO@o@iZ&0z;FpIr3TiQ_{7rxy`jw0Zf$ zU`k<8p4-VUXROGfo{3!Zg{d>UBuC#_hXsexcdo?t>v`_>_umsmg0xnFvT*FkVUAc1 zp0;vu|0CZzdg@4n_I}9oT?bB_N%B@smghDHEb3fSzO7*7oZ*2-TaWXR-cwuZe;xd% zzrK2p-MHF~jd9n_fBR^K1U#&;QUCtG{K4Nh+++PeN`7+lqG{mNuWebz(T_2ovpp6K z;MUJP9s{3$EDQ}|Kg2fy*fWEt?|T6Z&w`6C9?Jo*9j5D3m+idh#7#$59{<)^ehZp| z#(P8F&^0SufXLmEfz z{e1SZdSc*30ax=ndD+eHtOQN&v%Z_TqCZtN`#kIu3uYVS(Vv~ z``>)&$!MYHaOhJvdNLnx&_6((6T1(bvaNcKr`LGC+`c_OnQPwZ zhix)dZ4XcrEm|P$cDqeMR&VDySS#XQw#?dSm)Lq&KK9w4OrE-R{6i1!-#G@X-T1ao zZQ2Zs{fl3n53pSK?tSj5`Dy)R^xVJvtIu-#aF0&`Y_ey8kIg@re&x)_*?xF*?ZN%~ z4_>qDCmy&yr0~E3cI*J?o<3XK8q<5#YH_{6@L27l(|>Vr*@Ag|;sajcdpZOOp!aIi z#?n3w{?CCUt-S)Pdhwx|-SyLxNawI+Wo`bl#xojo*xGRFAJ6z@z+vQI^43}-|HnAY zu-X3S=RdLQNLbf{?Tj!@yWI|XmbIbbTqkR{Gfq0@DYyUtAOJ~3K~$5q-ShqaUI$r7 zdjJm-fe_m5wn$4v2AI|?3-dg;b{66~IGVSl5rmP1t^CK=-h12L`e*Fe2H3DU&iS1` zalnSXpEw3=+3`=z^<42EZu<9)Ke{CO-~GHi{w+DT3a(rlu6*&!CpP|R&Hi7_i>9Wq zdj>fW@HCJlZ~L`>Xh*+y_>z@%ydNCAW*6U)!4ExPxVgGn7>V-KSwDT?9?wVwDn!N?# zJCAibG>Z-?D7g;M{0#8O{lWKAiP9jr23KDELgh1yg2%TOq?7Z<*a^VK zwR<}JLcVzeJKgjWAe{N)T0i3|Zy+u!4 z_Jh~Fh4KGLSQG`o`uqr+d7Oy@6aW2=ckV2Qmzm+=h$v#%SHUPbaOJ_JM;Cq&_~Wmx zf98_?Kk;LlC~Z_nyZVMMCXPg}vG3xn*?(1#ycSWu>N470k&L|F7U|OJ(Ftd_QAXIV z`m4~Mhl=KT)m{q=0p_)7wOP!(*&k5O(&|CI7v+&7O^G_u+{rq3SVeS@iiGoKGwf6n z)_2v!qlfceC+rusm?Lv-1lo-tBj!Cz@4a>3mN@|Nj<*5L2Ufx6P1_9IwuiO5VB1I5 z{^cDp8QIiLY4!<#D{=GUMRZv9?mPMyanVi6nN6Hw-s)cqB2XS5`p7ru9bp*({0#s7 zrykl9j4cdGA`j8g#nohFdt~IxtL`-59=xV|QS$4zNZj*#DvY)ou40 zyUy2ows>La;^)G=<@#9*lvbN8JMX}f)drYRpgl4V+RSS!!c<#Zpq4zLb7s~zTY$XZ zB=;IRz>+thT~y$^mOZaP(jMSi=Rvy_A7f%-99_L>vN3P8oXE_1;J`NB(&BmeWAvJP z#{k%Hd9*j%`L>POKi$3)&aODcmh`b9%HYwP;K7d{X#gX3Q1{rbdT`{_EdZbSF|eFv z;d3nHY=F%nl<2;zqcY%#;gg?$i90{JpjdWj*`cLJmL0*b-eJjuhd=Yf5B>C1e(;}w zl}|iz@=u2pO}eyO%INqTN?JtsUUazm8u2d9i*HN2g`{Za$k~|@XiHz(AWX@WR2ZHC zAZrQ~T0MYv0g-k>>nzSU9ci=QR3LI9V5|HCjBU4uGKS_r#w`XisQp(CRcN=`&}xyj z+JMS|1E8$l#3bjLj>ZIV{ok7{hc<6#13NbWxE&k5z7t^crZ4}%!?;iFUAukLdGlsi zbNW#A&CMS>%N0Lz^E`GuHNN=3$iZ!QOg(oG&vEfz)(I()JdbYt!UDX1{C%JN+}p#y$Wq}Fw813Jw-q|+oH0DvS0hQfBM+m&vsP3wFSttAzh zcn%$2gtMP%YG4YT1uvZi+O3fyoT9BTK8N(&f8b@4YiF(ayQk(K`1;Px-RY0~$*KdF z|MdqxcE^o&3~-ly(7fh_o4<7M#ZIjE+BYd(8HKR_T6tzhoQ35AH*;P+OqRCQ(Y2MRa;E_unrAuN z%q!XjHkTOkI`i5vi{BsYqIL`BRYaK99K+(=hMI-9wxBJv;#xs72D6f20y4k!{!14h zplAh#>0slSO6x3)PK-{>!ULHQc%^baQ0|1qMJN9G|CE1V*Y8$6Zr*xtk6ZWu!tL#c zHtpCt8gTS0FEw4vJa%1j=FZ=M7hmL(i{4YyU;OnXjYqD$?kDd4>tCFIbmZdjJ$Kw! zHQFC{$=(0?x+howkLMrx{P0nZ1Y?Vj1LQ|qds%RF=@q}spV(jdJ^9j?Zu$KCZ}~iU zc{4TpB>wi$77koxCdtb4PMKoxLtP85dOi|EUaKRb>45swF34N7aV^d}Z?y+6ZDlrz zsZ#zPb=op8)5>W10l)NtHH-U`BeViDJ!CI}5lSY3i0}rEv}We{vTV~kb;UFD+Q0-8 z%=OB@?Nzj7p?9!$rdde<0ic+jq54);Vm*rtFOLayKDYfi`eBIk-b7u_32ow?3piUn+$ zx1ilx`)WfEzPor=do`aKR=f>EkZL|hvyfIr0#)XwL$umwX|;*FgE~T9Z%d1~2E~F) zqUB7G`I84m-`1bRnHHutog*;3`=YkX&7t8D$~N9MsJ%G8YSUp8kCqd;&pP3utUc1} zI>kOq@)SI$15su=>XK5-%NNYIUu}*{Y9*(ad~|}p++fe%18mqS_iP^f;PZE{S(AQh zl!q0-tcMq#s6p(a58mS&szpN)SDDGh1~L{$eEKYi0q=A-*xA8S;bjvBoxLuj3C^@wtaDr!c>G>mJsiYAvt zqsOXn)Sq-iW*CeiJPN00hJgGn&C@j7gu}Jt`&JLtN6U$6yPwcx?GrQ|Q78G9k~WT= z2HBoAE1yi%#UbR@k|x?sv`IqlDnRH3q}K{D-aLNz=UdPJ2vkpYC!5DMeK7xsn@m3z zvhIez1t@o5tY5n;T)U5Z3U4TJz9K;2p#sTPC_f537;#vfwYj^4>)x+_i_*KhvK%Sd zevU8Zp6JMBUyBtwG*U=%1YE2d<+NMcenYirc}-0900L1CQir%k(OiIuMuQ2mCEK%& z{lHP#XnH8;3V*B{8h116mG%_AarC9x)lm=z&{t>b z9_gBb-})^pHg<@p{1^CD@{huwK?kK#u^1fh{~OI+LPvPrZAXj6qdUm|>D_zNu~$m-h0P=%V%0)3CK;bjpwA;9>(ifP^T)4jW4BkTt@!adQRAO1qD;%pO5(&|4aQA$(=n${b_8of4IPi6;d zMepj3#;EZIriTD#7{-^MfuF1KV!Y{CJh~tJX^QMD#9=3yv4ap=u|1`_TTD1xY*S|$ ze9aN*-p?0=lq79BvElz%$}=BtwTbIp1xtrn{t4+Fe}h6qPpWwLszF09UHD>~x4eBD zjv~C3tBJ}FezpC%+ZVp`?jT>mp{E|Rc}~dM?FyKU>j`kB7cl^zeDZran^jA9Adu-&2->mH!-36jp=+x6WariU|x~8XSDmvXf@3+Rj$jb=Zg>9yLZTy^++ zZ9BW-Kqv5pN7a~;VEta>{7oga*uD4qZT42+KI8-U>-A6Iix7&ig5oHGDG?JEz8V`Q zfbk|Q7<@s64<`~8{oRVuJGI~mqHAGZ^uc3sy=_t3p`mk_esK1D+X=6lXSTU|#lxBv z9%KCg>AZFwyV(`W+<4g_gh3*L0WU#FL8%}Wxi>FB>Y(B?ovrg>B9}lKD=seQyK0NJ z0yE8mKc#o~hq&{^iDSI>DL zSpT?OO6!_y$hQzZGsE@J&N%8%Xc8g(7{}lGmKF~Do zcmAJPtE8$)na);i6@jGpru5CfBc@&2OUP0prC{I+Z+dt=th;)nGn|5jYbKZPdFFvW z2Bj2~vJ{!yy)wJSr9$!pgMEjo{*D31-~9g4sjpCpELIbkBA$qz82&5sVcZ~T5XD)` zljb}#v4;8J?X%0W@{Qnc+IG`pYj;rvwi_Sb2)n!q z!JD=Fe1SIwp}`9ux;hEJIUMD0e|mrnr`M}*IK=eb{O5UhoN>)gdM9^6lB2)A_`xT! zk!nRne$BcH5OnL+$s4rRuV$x*1LeZ%OfKS~013dGYUsUGaoBqqB$MaE8*3V(>OE1> zH$c(2`k)1G8F)@l3BkYhxpj)7nkLRs{TKZ{nC?|^(Kqq%`d#bUxa;<-*PeOm{CA$> zSTeNr(e>Nsru0z;aKjhb%39Wsei4fG`?hU`*1j!Ix*xr^&+lwFr^q88c;MEroG#X; zaAbHopH)KY?Q|DU=h3sl-9KV~_Sicv-=pvU{LM2%Y&d;O>!AxAKAg*)MoikT$HGa_>?Na zOk;AFpyWx9H>(zXp|(4`?uKAF<)fc!+4}~-@HuGsQ(HdrZ_e|x-b;Bi<=XNVfT>4s zZ$H9sC#yL-zJ(9mf8&tjZx22A#cEBf-pZX*!;9JgX~S=RqCP7{G`uJ$uk+|thp@(NMcqGixLI+|hHY`+5&g%M93Lp6SmpwPsK%_$xOPchWO0yG7RH(D? zCK+$y!fm&Ub-R~u+xTd4FKn4_rw&Ds|G2BR;8VB#@w!;RNHJJ@;o`eNy_r-6_C8`n5i z^lnT)*=+wwvUBC`<-4M^`5o@8)owwODm4cYd5BkQ!8t2HEeGOE3kFG;R$6X=I=~vm zo7gDoN^f(ELkv}?E9n4vO+g#LQY!OVoTiN~)@1;!%ag0FyZ90PDTSn=QsP z)LFo)wMmL52`PB5*j|vgXt!G#Zw#;UT0ZlY(X;?IGDBnaSGeuR|JM&bva#{4o8Nu) z%?~_y$A;%`8^}Zh+;H)=*Zzlpm#5eM#(%lCc`0z^ndNK7>o+jWn%=W(wkKSBf@S~w z&~4jCW;gc-uAd541B~yfd;0%7h@xR~$jP5RzWCZ{2#UpFaoQi|vOiv*ZeJ00Ph5L} zE4J4Zk;s=><_ASCT;vt8&N=7Qh)7tIx}|htC-Bv{}{J;=GA%w=2P0zQ_CS-1QjOt-f!|t&THlM}&<|WT!AS<|Naaf%G!Fg{vu;#=C4y|gn7LUd*O(ilQwWic! zFG-S6h+vW=Ns`D0fl-@;d7!?R_lt_`l@K-KQgmQ|%8p^ZUbnb{l-!93Dk_3j9@E-$ z_VX)>$RieT2reJw~{o4DsEcwR= z-?{3pF|f_Y)^6CaVQlZUI|jnc!KPqqzuD~f37-C=eyxHp1iRX27+*{uH!|Wl%hMNe zsC)kP&(XLyHe=p9dVr^+~$WqSXQ! zMPwEsIC%Xw?HChEGZM;fo_Ak%%RWpLh(ZyMgf)ZaIXL&Soug_r48t&{*Of}+wy1ny zF*>*7U@1VccGoMOW~D}x6ntN1+%*PlSi618U)Y^H8QXsH z7{IYV2UxOX$&wD&Ech*+zWjFqO8;;O1>-F(<~S)BXkH7vZRpCUYXp6U0@>I_9c^Fbi=bJ9HT_6u*)JWs)+-qbaZYo_dr>kl-{(v)hjpiM|qB12i0KD5U8 zXhxyqN~kRboCB6F#f2w*l%{CqLDj}ZM}f|a_r9p~T-)t-yOq7(pveokqVmFgrr)u{ zmseYsY`AK+<(IGBbA0V)fYl=a%eOzggQrga%YS|P&)$)*FKfY`UlJhDYV_RK5_az< z`dazO)H24$;o3P1O#wTS{Xdlb{_ppbq5do#cYq8B^y!cz$Crdj4_0qFwP1YN1+?#^ z#bR(6A_;;#Ns?wWL@?55H0ub>NJNfadss6v?FawA$~Rreq(NU+5KP?IEsC>LAX zh-~Jab8+#_+PQrPU{=2rrXZYxDRNZ~x}fL&MXR0ml{taJ=4F zuxF^3z^P>C+Yj&m_;(&Bpl!$-CiJe4Qcp>gLJ=DRnf9%5rGi!m5>-(mNFY@aUsu6r z+P8%-yq;swdWCuf66Jw+N-Ptdi)XF36mV;H8!Ty};s*GQB(<8y9uL?E)K-n_?|PWU z%dhA)FfZm6UChU@dii~~O|F?OoosyD4mL*rbqqGJa0HnAM#w|!{N;-lZMv~olq_2L zJIVPe#psIhbq5cw8y~vimbYwAe&X3R+gEI@-uV!Rt}|@j3?DtlAHQ(4uq-`7G#o`y z6h#{$=V5-|FckKtfXSV!o?4e~I``4KueS#~)46kE5TDEvg+ocxGzomxD=|i-EGp>r z%la#lMPX=TH0!!j1v9A0q$*YGK_$Whhh6(LSYDl1(SD`_@UV~f( zG}d!KEAPQZy`ep;4p3XVbm`Ki)Fx}+)ErC`y3Shbq!8;8oR_#59*(0pb~BN0e=p@} zUlH%#Lv7vFr{=$O{UCw($Omo4*Ws4|d-;6^CZBk0?IYYTBh)5s032SNA3g`>HzeZh=MetFt$>< znUvy{?XswwNcPgwKDAn{R^!0LN#{e0HNBu7bkf$1t|EFOabX>KPXTY=9QnlytBHNl zY-w*iW>@Y7Hh`n)cChg;VJDm2*t61IRrP}lCtcnO_n1! z-jZT#$JdMxeR}m%oE;8eth$xWs^%;1{=TBnr3=|r{{n5 zXOI2(`rh)h*Zuwf{i9E1)+HjZzW`-W-imFS#8Jm*n#n-0$|xSenmL(csi`{OQ!9#7 zGf>SHqiV#ch{ZYR;1SSXqTOa+MdL1MvzX4VIoYq#KWN{QovjtwP$AMRSN2w{I(hI% zj~*>Tmmmd#!-lz9I&VTFK{UUxy2|yJ!eOTV9ya&4z3ud|zv#>y>HThXa9!CfxNYw* zJhGmxPkaC>EG(RwTuuO_w+G{Ep56Vl*))DQ7~eGW>t9PY?LPbz>&71iykC1MJ{o!Z zX^f8^{f{5})VCI_U^0NQv9U46I0VCf8Q$`T55nZh(@&(y-w|Di3VEvqQDS33q*oIK z39Lb-CkDhA(lkxG7FB85IF3cLJTE#Ws*wn!Go^@WBBExtTWip=NK&E91Ti$5SUL0L zOP76_qigEVs}UuOtj@b+^%co+zrH@aDn2W{>Vb+#7gO=gTW#J@o;iAS}usN;pvc==kpOb>%nqO-%YV zjIZ&j)ffIzw;Ny{~!ZRJxoO_C(>2sM);Hpch5-Kw-XgOPKk zVo9AU5DzsamcFZd-#I5@1;yb9=56nfoz{F#r-HZf)uSYe1C0^T4Aw;PIIC7~C`b!0_9j z&WWB_aOxB+J-TcRU^U&VzIk-x6^%!lxH~}`pL|8xOQFH5_RTAJb{>(?X#%QY+=Yg8 z`?*&^yrw3Fq);S;G%+?)gdhTSnjx+fPpLwhBz{KFpe7v?)9;F?il`I~z)|nkG^=HC zY4bcP7|yP|X586J0S-FH4|JaQO{@d7ULe*E7&>p{j4*Lw@$T>5&2`uvSJaQP;n8RQ z`6oKryV>>0+aor+hi*yE+`9jX8<<$XT^=!*d&)=rmCJwI+_=sB8OwiF1J-YstvqrQ zk3F&xZs)T%J$CE%-TSV)p>-b`5blG3yC3@98y_78zif=nV`CK#c4Nx^g=32sUGbYo zyt9as-U0WLt72@`Di~?g)g!Nh6C-W`Q3NVYoC^Z4U7EPa06`R`aX+#FOnX#BAf*mU zJ+6u@nTo1{ro#ZKsG%V=>39RC3?mokINP(f?0Sb4QF0Zu7hQkRIG2v+9ERmHr`Y$y z{Yjh!i_Zj&zB9)1P3*m1`wzR{`#*nv$%cb>-C)P6)4ANUdBdi^yJdMC?sprLTOIf$~y^r2_)3&Ye1t!|S^)u!2(elytYqvv$qK}EqpMB@?oby^fd*TdY|d82wt^yI62x?zI_EsW*EQ z#p#f@nX9R&f_6-jlFWdJl_qGvKd6eKrYvy)03ZNKL_t(4TJ}im;&p(+Y5LUT>tRsq zG+g1V&m2IZ6^bm6Vsl*GrTNOkRd?mmeH>gl@_gjLMVatD=bL|9?{)9!XnV=Fr|#H0 z`)D`2ZC8&iT7J6yKbJqU@kSmJy>cC&BjAZG4{U+<7yXV=HjVP|4l}X-;TyI-x*m4< z<(R{Ji`#eaH8-*i32{UQ@NE0s)u-?J=^e~r`nhHY#}{+Or^j0jXX)@`-1Q;2&tNVL z(JpW-Hl{CO8udkksvDyUL}`*zcfKd80z|O@Q6G)FG&?i}RAPti3o}6!bxR4nq0c1bnZE3;rxu4*Jc>oura^t50_tlxcy7jC^S*6;5yv&5U4SJFr~$dn5vW%P*P!# zLgOhsUSgSJ6=l)#(_mVkxLhk__>Ng%_>s$=##uTQ)Bu$TNUa;{3XDu$b@(-~wf`tw z9qx3dqhh=w#^z0+oQ7K2R8q8Lz&VgO?$(Q*LO4VRn*E+os{!RqrF*S_Gy`XG!3+$N z06#4X^$?1_X#_YI3dIj6@RGk1>lDj160wc90UwcEgJMdF?wd=2f zo*3w7Mn$lEX35z+)LgYaaWS7y`#+LL(dO~q$3DG&Xx~5lLF~OEf{3E3VqVbMwxlX3 z#u^V^2V(&gMS}`3Sg{CQ8K_X!mrbdm|Lhk&5M8-;*YV?XrW<*t?1g1uZEAbL><`&K zg=y7l)JKXl%Vxg42ehDZR9I?G1X`e;z-n101{Y)nSZ_tF^(9ho#5O1>oeZdKab9;# za!;TZT%;A$v>qvH!m=!#mQXKzS(e^7AT9z`OW~x*!lLk3HOqO6&zX*?R=1q@jUz?u zeUuHEexs@t)xzc*3U_k$%ANhF_zoDqK_krV{hw^)zTYCC+_dgaCZB1u^^4U~H@=D- zb9lx%1$0w{6*ENB~P^?Y%30v$p5mk4a=_2MGye z6*4?YlWrSE+LydWu5zvgf>4WvX+KjBgPxlWH_n2_G0>~`RJ9CBQRA~3P0CCpDk{+e z0BM@E;j&D^UZNE-D#D=(qSh1Td0~sbiHgYPFJ5+P{>y6or-6k+8t3&P7}C;xuf|%u zYP?gU+{6>QM3hZWyL9gisWsnVfeD zv*JObOU9|NyQdcn@45B3XPeAUn1dR-|zsU}C3KwS!`m07nMk0QR| zKzt_TA&LzuV-IVd(Z_1)RgE?sh$b^YvkYut9X*&*Q6#PB5fb&iF$A6*;?kS2P!p8P zreE<%R!%t1H1YXxrOO|hq6KG{yumy(|1L0o4{bth=^ln+{o(%Tj%{}B#LKX!qKIJT z_TGT>AHM9DhNaHZM<^mdyfdL|2Irl1hxw`L`{BdpY_!)xqMA0Fc(p2nUW}#}c!RwX zB@7*i?N{(Hn`Oopngt3;05}6^BX-mr+RyO{T6C(4 zbnKw8<_jwcc^x>&%EK?W-{h&p)$@pmu+V|j$Q$edeHR$NO)tFfG4mv)78!25!DfbuAtd+jVessuyx!zG*^ddY&SYTYw< zM&I4l^tsLC+zN}!8Z^6ojfk8C9%r4ER3Ws^!thKXWmS~+&C(%JPr(v_I@=XcGmOq; z)C$eQ(%?-}fD-v2EUYO)1!p&fcBhNZBHZkex4DmV|3?Z*FPa1j|mOoTG-_k z6@<`)=l!5{g$}f^J>G?;g7$}*9dI+iW)^k6><`QxyzPlue5!9(s-tXdS|G<3uw=Uz;;M0)BS>5VK2q)CjbPGxPEKRmXeg2^Ree0RqItj5>^12Z z#-lk35{P1&UL1AbbumFUXa!jp=N*GD{jC zvV-2Vb(KG9Lwo4BX`ra6b(RRoCD(kwo}%5N*Lcma-3BHygxpIYpt&L@aFu+8BBA77 zgHp(%s^>sO=2TNFz{LHTV5S1KYvhCh{3-AmLMTKS6s$P&vHS)YEog&72oUxjhFMo#C%$mm|17*?y zbBYKDE|$O(haslv{8A<>aJU`ZnKvie&1y`Slz=rUG&)fcIW7R@7elKb5=$q_b61O< zDFo|ctg}TQ0tqpFW@?cJJ@FKXIrnq3SZ#sA9W?^|&5L>Aav$W$w2Nm`Fg0;2f^sSG&f)y^c!SY*u-R z6%u49uV`QDQfbZ3pMEW;StGWo1PxRR-|>PIEY{_MG={8=>#^xiO=pToF-;s(7C>m7 z0~-s-aDAjzqZ4Qrq!si5z;=u;r4(x=u;4Q#5R30?*v?lO%k-HuXU?$31FUw;@6BsY zb<4=4QIs3~zShJNQB1!GV^?ji4C@B`c`RZ|)SJP0Nuydx_FADDfE?H?N#njR%77A7 z4N(NntDhwl1}Ep&=7g~-*JX}-l(gysNUYKsXk=4_Sz>B=4%B%)jgEd;^kN9YtcTPx zY*uM)m0rZ)fGATClcZ95qn&zZZuL0|g=P>SrIa(qgHno%1uXR$i0e3z5Cus}>zb}_ zyDgsk(dH>PJq%~&FPOg{zYjY;b8wzAG-dph6(x96^33ntzmqm#M93(!eo-MhNF1>T ztl}aUsv;(?#fF}e57d@jrd4hgW(i4VLCaDJ11V(|C~s5{5u$*8pIMY6)>`Y|(FdB% zW;M0ZrOhU!X<`Va*%N15vvWsB} zogq&o8kwk?iTPSi@6FqHEh@5R(k)fR3VGpb`GBNt!hEnB0(DqZkj;8c4=%z3CP_&K zs9;l5!hSz?5M@wWP)sLV)35cbXvfk?05|V>Qj!idJ57~JDVl_tm?DxU)}^g#m5o-# z#@DE;^oZy~P_xdG=~Rs=MWsr(Y$2iz0}K_a2x=7iBLx;;3dRXI8%}venuZyr(*)o5 zv#GyDOQ;nVpb+|49$9?JIPR2X_{{XQ!>;6k)AKaWNEMK>(u?TT_@3j$+R!2$sEpJl za#79qGLd4ow3JW?CQ7i*3aTQtMkrFmkmu*NfCmU9bS|%HrXsE?1S?=ij@QncB(fBo z^%_~A*_=fTK>|MZ1w!W>V3LW~iTDN7JI+BvuwX5{t|zFe=FVbWAu3flHxM8g9tq=s zeh}$Y7AT0d)>eMB85&b>N;y@OS*fbC9()D}Z4TttRYBwjbj?C=?$jygusIWFmb9tU zN+4{^`(F2e%=z_9+wK6VSC!1=I8a}fVXbBWTpE{yBbXg%%ZX~NWnZLUpx|>$nim5P zlaLruUz8>eq2~af<@?V2<4akJ*>W_SwNDdN#Wf)Dxi9=H&II}zI!_9y)@hk?P{OtX zBDJslcmT;ULyftj$#sA&&;Z z*M#D`_q}kiv(Q?wcHyNfqsP9qI8)jb84ye7F9fe5i=m7P7j}p<&Fl2AJ&5ZOy)r0LHNK01B#&%m=~@s#oS}H?k$C3~DfDLgV9!iabMx+ChTD0v<72p1J0aTg}3EgkOLVdk@M>II#u=RjQM=lppKW$79D z-q)gIpZLyzd0o-z2YMC8_r!Q#l{uUpj0v~cL4hK)>TIS?oH#uv*orqQR+J$mKtH36txb0I`@p|*&MAWU6jx22H!dZOYNEdI zVQ5fqiBhM488BzSM4?OaK#QVZ_yOn`5)t(}aEDeADT(*j`V}&K=~9@S{6-xTN0O3D zZaXH=12tfb$@AR!j$Xj&Twub9x_BgP*1U&$FDwW3(+CwKK|E3)YGj2&dwnBF#cg(| zsS8nP8Zy%_vcACF`2>+7B!|3*$uct>kBr1+KXsb)G%$GAsw4d4u9eL%wcCxEizlW^ zE8U`;QSX3Agj)Q4^O>&Rab5!tYSX4xXMp6q@vli5dS~Ja2Zx_~&qgHGFkgYd`b-Ui zcy}IXL(m|yQWTS`s4ayWeO8?giYTS&@+8Pz)RjCQbeAF%qcc&IhXk*$!5FvNt;tJ= zX5!FvH7;#Ol&}|gGt`OmDz&fII!V~GZrT)uMnlb3-{Cw_9PEI%~Vo=1uUK6W=+{^u%#)v}T&Nu0=(= zkg9*6m6;WZ@E!?kH6xirB<<^Lrk7Sl7D22~i1zz{I;GncuY;(YvZMZDzYhlveB*dEVyRkyyS_r2LjXjs@zF{B{{@x+SHq9zZW+e!$!1S zr)NBLdwHH?6NI=`ueIWG=B$Q2U*WwVuUo*xQJzO((CZhyb{|wV0`e%shz*OJA{s&j zGt#Jy)Ns9`-KOh=zQC+Li#PEU?XV|wOX<-1zV?8kP9jzDSw+DaTXo{j-)Z$wG&f~d zSU*Uo6PanRynRp*_Dc-N6L=MiYkg?Rboep?YQD9 zT5^erZCTXAq9`Sj^`PEd5D-Ct06~xoazSAC+x zd(U+DuYZs4Luh&k<#MNe)lC7Yw~KJd5h@w8+5j6VC$HVXX8q;JGp~1UuDfQg1hjCD zG~_`8?pmek!pA|Pu+EOI=S0qo~o}FY>%9=sZDMFd_*yKD)k@HaYj%WvvR3>^O8KkUa z+U3dh&L3rc~_u#&W>#a&I ztYuTKj>nKmf|~jAoOge-aa-hRW`L0nth_Nk{2vJWXx-2Z^?wd$*6<;&wad3`lP zP0lKvUwRPNYS z;wa`uSpIptoyPmZdzmia<~wd3A*8dfUyaa~CPhOiMp1-aBiIDuD_j_dVAG^P?pW-W zlLE49I#$D|GDkX93(YnI#jfc<0*aBUqhaiWEoPIhu43OlDd!txadPH-~MR7 zj4S%0_Cp?I&C^a~V|k^!Vz}A6>d@N)O(@Jm=cqD)Jo<;NQ(J4Q?X}F`lRezD~Ky zo1apVB9`skr9VO3Ne@e(a+>Dz7FH&clPG2>-LmZ*qEs%*kn<=i`_xpHK+~$$B`hgZ znkE%gP!r04_(^x)_%#pR^z6CQIB?e^_g(U9GZ`qdC!0M`^A$ktY*Zx&Ey${~%t;gq z4>&sv2*pCekOzri-6#fd!~qp4R>Z@!-7d#4Dk1~}d#$sjjbKALNSx++b%?U=85i=| zTW^RD`};q4(-U{!fla@(`c3=m)&{Rjn{>qI*@~xr9XMQ@Hs)Wwk?D{#>jd0Q|kpoM~C48UYvBzZIFAi8iGN1ck~utT|h=5l*<$LBof z9{X*Ak@Qcm{4hCtu9GWq~#o3K~-vRM7M-M-RG0(3lv=&K0GL7XRWp54249Ti%|eQG=^f33zn7Ll@;w zy0^XO$XZFU&8)l!KeE}Zho@ep7Tk5s@AlidT#2l#Zu9YJYCqpnwwXkXQJChMozx)h z@dSQ3v)53iSo&#MqLXz~yYFs>F#odhAUMM02;&%%OYixHlNZbxmryJ z4X|F<`y%qi=H{|ygk=)ZRHkGLQhU5z9m;c*fDd<$}q?Ybl*8eILIDnZ6%CDkFKe1{akVDX4ds7i@$f@!@u$E)i#*>dGG2V zSC#XxCq6TQolu{>kBc_afZ^x^^zersc{lN;ijjTvA}X!eA#r)`R{Re`p1OEZd^-~gOX0+N<6n3kd&Z_o=-S^l*@xZ$h*+3NAn zedEvY8|}JZ6LO=Q&1OA3b@5f&y*PbSVc_LvH(Vc#apcG=K{%>C2h! ztB`5|bvp$oKoFy1q*zwbidL`gk{Bh$b$dC$-FLgIx^DB*&KhgD^18}|$0mzK zHSFWNx*38dI_@Tsvee_?3Dkha`4D1(s#dGRnyJlW(A=L$<^*2}uvpoZk!d@r%67W; z0kvUopQof9jMlm#Nox|nJ;!IQT02Ms5@Gh+)= zkdCKmJE-p4s6HUVGDk0UsZ)1!w9RDAb`N0{Rfl7FTxBNc{`m5x=6(P0f4N)Xqsw#E zv+_V2uRwy}tI~wQ5naf@67K^URGKR1veN13 zXgi`A?+78b0nM{2PVhPBq*YZGBBNEtP9zYrph##*5pYCRUHE%1i}Q%EV6QXocg>~pq=4`8S1(W!B?fxahRksXcz(9pqRoF zf=@zLEsDeSB6lMJigC6{qdgerr{|wIwBLI;{auUguT=2|3#}cg@7H6?2Ks@EuXUaY z^kY@8>bx@=>`uW7dj-I}EQ)%m!%alBs79%fP|kH%7r(M(~4aS{>Dijg_c&K7c2 zE!9dGkEVW3U&}ykKl2IT>cw+-hH^Sk7b5h{^_8|w<6QDSZ;y_5r`96#uAfkXDPqP{n|UrJ&TSLzB$Gq}gfe3?gMah|7f9Tp%$V4NFN#Ylsn&%BY+M4}vcWyq7MDnl3}n=6Ohcg*F>m$~~cfE+ldw}jADxwj$M zF5EMYHYC@-rytRaACQI;_`x-;sE z?fxu_fND8Sv6NDWKBr@a8HF}e;=MRVDJ2|DQ&v^f%|8^;qL|H#XL#_cutst*)~5~^ z47V;nxTxOy^?ZDKjR9*CY&Iub;6-W#ku_+FK&#M11yfJ$*l$a#SE1g-D=HO?{fIFJHzJ4~ z1lbY&Op-^b4vZZq5buI2KAuj+k;0Z`y)?mv7Tz@P&FW(L(dGDKaONHH`;CSJpK~69 zabG5h6*s-;Cb%}wEM>E2s5O(PoZO((IPACg%>1CvUXXH@3=kk#yw@lq20WAz5vtYl zpp>a_id6)b9z4N;c<;bVS&%!X?bA0Ao;f}SjvopB+@qiUztJ@tC1qPzaq&vHfi)PE zg{TFy^8(QpI)s%i4~tn3^Eg{^!c3!95mOu%^=O0hb`Lw$pmV=gRz{K=H z^VSTM<-9$0NWfDR(^N2g&9m`Q?)pLA^ke_2D1->c_-J=)pnkP^=KJor9^KjzT(q^K zW{wit4+&ot1n2QGDU3dNA7*mb@?c$<+?nlm=+!7Eq+uhb%qf{##-k}6r#)E3gA2ec z(i^)>0p%C3wB8fKGtWE|@aM>BuX{OV^=YH!b!ZOL9m^Fn^{ROhoO2o{&1F(jGY+G7 zgOZ7QY8h4?l(8&}q3HYL0nqGlLW?S8f%qEEWq{25sj603ZNKL_t)eo%Oh)opoc}{{Ea*nkb3_?o1c!fBg1Kohf#z zIs>k}lrw4YRiC@B{b$dV{mZUhhk?|%ZW=&*^qvSJ3oAZV#js8JSohJ>N8NKD0|yo2 zO?_~9P^JOzMMnhV@t%MYsaA!xMKz8(+BB+&YV;6Y##5R#e{%j4?Zvx;zv+NShClti z-W{$Xr4e&dM8ABlvWCKVV^zw+va=qhQPnPmK=4H$GgaxCGQqnURTEAiZL*MhxiTD& zW*WwfE##EyE_PX(a#^P1VHmd)i0S6ERQH$v(m=(f$1nZ#@C)B$7JLv9!Nz^HGoJSN zU)x@Ev&+WpFkv!ge>b`wD5499A!6{Fy6BSoq5Rm zV%j*mSsSv(NtQ)5g>frQ92G+8W~iu4r7uu|j$@99qO%&Xs-Y-Lq^NrBQ31`U2lcIj zHpwYP6h`gm^)xIpxL5mK9^# zu}htTG?AWg;eplJ^verV9ZZ+94!d5bjG1iqo4vTHdnHLUvBh$N!WTw&V}6c=F$(w| zq%yk8eac`+SCLm*TC9K~WmTdP@Ufnt*ty^ds}e;ES*>cBCJ*y_o_jrWq*WpLu>90V z^LBf5JigZKtrwdCRghQKQcryyqq~~;A*zSI_mp`U$}|a(gNJAb)JXz|5eXUN(?q?(_QldcyTYv^3J7|{}MKQ~shB1bfw2Mwp@K9cpN;ZoE z47=^hpfQ1zkjpd`4AuI`+s)tm!*jbwKlJU!$LT|?KH zSul*Q95r}Iql(0SuXl^c1Tqzq1hrcgB_GhjGAF?-3tCuILpuu>qO7PtlW(bD;LPPx z8(46NnPf3i#%#*e0rczFC}v)J?!IXKNeP;!zBr72+!a;A#uH+eiv|o$5o+zXQu%%) z;et4PRLIsO7i&Uqa+urM(j+2w6eJ4Zf**8}%81&n>XmA&b9RQrA@t)ifmXTfsrzLc zilc+;xa{+Dni2`ha@VYsq0eU4JkW*GbPlMDfR|w$Wgg|mW!Ee;&&%pyd5oUK8{HlN zZ3Zn2ENR7{qGC)&@XJeYed0>E$v>2vx~PX+p5V?uA{UFIq;+G!?uiZ;UI%<;Uhn${ zJywv_u5@P624=Z`sUyT%k-R9Qk7cPk9`!1aTpeSygTSJxA&DB@O;Xe~c}TY1&vX4~ zV~k!vsyZ&3vXDu;^mI23yUgxrvw@%jDFFRAd1E}RUjbTMVyv~a&~()a2__u1cKkGZFe zo>&e;bo1aGUCv@5C`L+rjMKJOZM9&^x@(|efLte8wjVanR>$A__&vXK`QFuAAN71Do}bv&de8@wOMeH5LeEM`RU3P8ufxw1I9RN}($h`XTO}l)Kfg(S5DB6js?x zDV^A3q{Rtvu<}`qXQBs{3A8gnw+Kk#sutSS)2n2BddIIm_4vSMTKa{7%rs|rrrg$kcQWC3BtVP9Gg6g)NGT1y%uXy0S}}PtDb*`4+7DS( zgw)45Gf|VQbGwayDwnhns!F z0Ng88x9f@m#8QNqkwQA4Yt$ot1+udx)1-J3-?L-F$(ZSEhM^-Si*k%AAelRrWyhL%u= z2%C@Mm{Xbx8$1Ro6GoXK4t0Zm55 z%J=z#9_;1JU_D0C>L7e#Ho)BfalcB`3r(f(2K0dvOQ z@`hgy)d=S=yqAxTl3LTTWQraQ>kVv{7hao~Xnu*)aCa~8)+DK5w)IUgZOfncH|WXUX}!{eunVi%&jX{bHuPPtmF zLF#B@o%}ciZ!!(T@$sR1(dm(qU;*NBpB_0&MBgWA4?56#YVK#(@m{&aypCbr=5*W zinBClsU@;iP+6F)3m9ZD3`*KJ^49SA*MWc63Ld1A5M1PfF!sT8x3asy@(+OfjNbF1 z@+~)i@ol@my?GE3vG%Z7XD-)q027Q4 z!5;}yi4CP2YK^+L74Tu-onB>2!EPGKNkj<-f)7~*p9z$`?gnN__fQLtI4V@)m`!z5 zbXinSeFe9jy>xhEgp!9p@J=2k{|`5O>pQ=n+6aUtt$F1!N{%P}-zLrv+}aMxF>Al~ z0%+)b=S7i9XBjg+)q)HSO_vlgqX%5h49Gl=zpCLa&_Poq6q#ErzHK;lI#eK&m5fxj z^I_J4TfQE=*Su*{kL+`d2Bj*YOfqcq)Spz>Gq=@GJ`kfZc~a2~!{{N510uZ#yb+oE zn}z6c0Msgsv-)B{p~@2H{WJZ^@#QCWeA6#H`}kY@aYchmKKkP>gu5OH(? zMLKAl5mZ$X(wrf_UK+i{U~BB$%VN!p}q_RyjPIw;IJl7le*EW*+Y_8 zilD_|T`WDCr=0sy1RuQj9*-!M%)H1;6o=-9hY%taw^v*UXEBl-5j|mWzI;D7~>=Y+I3Ac zJ8xKZ9XbQ!XWFr8|i2_=3&avi-Nc9fA~ zyN5OI14UUzjG1)n$0>>m?aBj~NllZGG!@fK#}s9(2_7<{RTPOOaQ5t_;@E8u4&V6~ ze(d``&oj5)ef#g9|F}jM>ysH~d`<}D1@)a^a2~H+H3So21wz#ipv=S=_B!y2^?>uijTvR0Ayu==;iP-~Zo6FUK|t~v zubuXQ%_~;h)cdIyg>V=Z(X41~N@BA8;AhN9GN9r&DrFVX(j8?+#oD0MVHP?Uol$?K zIR>=yM#rHDK6o9q9EU?0J;0?mGV#Z_zxCCR|I|~rfBvS&&wch^LVJiyaowStIf^SU z-Bho>jrq z;o}6P2<#@wHY0^6kE%m8LfMN#*PzW_cybN;TA#a`K%oRyeLsq-pn7@-6sZ8pUI|%5 zGDG1-$STAFk)VD6vn)bkhut#GQuo;WoRfHEa`w}rE%Ru06G8MO_dI(E@FQpaqkris zZvT(}0Y~?3F63$QkZfySp+;C&J#N=D5DTzIkuW7Uf-A_#2n|G4#G4%UGh<~B{hA9H zF`mE_Jj6KHhD`^QlY*%wynk?!xbh7CJV_m~&siFsH2o9m{&Lfz2CU zqjP7jwJ?q~5FDz-fjwAAbRvWR&YucEnbl!YOD?QxF=yRgor*z_BI1*zp%{xCROGoG zCv_#tSbF*+-A;n)ReGF7!Egtc!ue-@gYdtvRzLKwZ!FmwRht5@DC{&aOS&Lf7(*Cc zIYlQDraX&McO6-gN-&kz-0yZtQNmuW7Nm0Hs9w@A3`3gPu3cG{WJIVGoCi(AkTW23 zv`v5W^471@$~6sLD1n^vEDsb^bph%1)M?ig=2A?W$xkKyxDp){-0c0}dsyaNI{Gnq zb}ATrlqjwjWEIuJz%a^IRaCnQMdkEXlK-K6hR4dt(&+9PF zE)VJCf5qqE@j&pwzF}Ct(OzmM7r}=;6v>Qu9Y=8@w7z>SW9IX?Bo04o`}&>p4y(EC zkEcTDocG>&MNNUzSQ_#$s3}mV0MiUAB?M{a54c#>B0)VABGAm3yv_i1mCC6u*$&RL z``lY@nqWA163f|NetL1^w>-v={*O_ah9P6anvKjF1~0_;3Ae4+K$tU(%>ABGP{h|r zVZ1$YqUU60aIyv>Xvl)5=RMl_N9&M9#APt%6uW{HRauq>7{2W=a{vAM)x(^)DyW)h zAxJG_)LhrBXN=#gf@eN{eL4?h#cL4+vkZaQi{wzPR|kbm#6S*$#o^to7FQpx4(f3% z#?j1&L%sLffo2ZNsXWMqZJik>5t$8jStKwqs?%7`&ODp>>{n0l&o6~rzJ>It{iz@Q z>wyN;n90V?Nv`rDd<5m<1~N_OzuUVX`TKwWyYhecp7(zn@2>9c-}hcy%Dc;Z^F43P z`QG!wz3(UI`35#+Sr(u}uW>p#gsR2}lx10#qIn#KVN`UoqFM?Gq;MnPyaxW{ix4JAmZQjT5=oEAj zA^ALvCeNs%EWzWopW$Afv}}VpRs}UF;#_niIv0RG8Z@75`C`D|_M;ch*54CvdGNnD zbA=!JQ2-mOb`LChN$w<@HFW5QBsG75KmDJ&|A%km|Lwoy2hZ}o-%)-fJO~6HoZ!Jn za@vcA&qa(XI_Dmm>}+|ekSv&T-1jgMf;Y@=ESkm7jzO8n?z{p&H+@=Csey7ZW}1I) zhmV>~#%C1z*FI*>B)POb&I+>~kh3Up*|y%euB{TmPNww! z=@1@z^6tO$uFd<8Km3*LW50VQzyDsQ`yYNlO&0i8J+ToJWA<|HP*?%YDTI8@vzYg` zwX@-&Av~|cGi}SKKf*_@)I%PpoHZwrjH;I9ev)Kf+d0Cuz38)=1*|nPMcqS48{4KW>YyykN_IzCrx6jM4S;XK?4HXN z(|`5z|NebHG2V?ueuTemqvk#3U#^jIf6-SLVROENZ>N9zH(q?`!|mn8Vt=F`9w_g} zf7kgB5BHe8WJ=B_wVQxgD>^|M6v5bQal6(NLOxm7pgHHc@p9?-E7ym%7))rs;hX=` zd%o%Gyq7Thg8Y~4*|*D(zX~p#zx%uX{F5x$-7>(#{@#Z^BpBj1C8cCL%1rlKP_Q2P5ZAjKbQC0-N)=$DdF3n@pA6T`mO8V*;XnlO2*{Z ze2!qQp|OpSO%;QrO2(YCfNImWP1_+_d1*Rd%GB>vMU|vz({=z|(=<&Zh={SJwbLww zG*0Ngy*XFF^=erOs!Ntlg4A+C+OBRfeB>Wr{zm)I+ur%_{nxrpFngjXY&Nu9d>PGQ zf?6CuGS7?N{Fk3$0W_bGe>sjH|6iZ2ln;OVPygIAkNvcIQ;4;t$3Fj9oJcAda?Uwl zGme(4BRn?G;j>g(LAd{syY4*49U1!<3r$(G232^SXFylHs3j1V)86$C4IVnm9vw@i zVHR5~oQ@2(fko^=mM7p_sobt^U9Xerumj*}_sC#N%U*VT#sgva^M$6lv%o+G--hAt$-8%r)yC2=LVDSU>@F87%;;tW(;vfDN zXS(LEGV)yy!3DM4dqJ<+y>s*znF_a#Gxb+8@C0wU z^HCcNSyi%8(SV>euWeuDWPT@zuxOeVREu)8s*Q#k>H!h2s`DiwrtwuJ+UA_&fDxfX zXXQq>YZNPaHxws1-05hu_ATwQUoh>uHmBK;cWt4ls`zN}2{;5uf92PHSt==gk%R8F zL|<~Aa#3}5hP;R3qrcbuU+~sPkt-~A&4cfF>(V`&{<;63KlJ|T{U70S_0K-?J3m|G zAHT4?!-fY>Ie;gH!@PQ$PtM)7(kA;9l{}*b5zQ&2T)yooR@ph{ZoHeXxFs=7s)Ei+ z+N$(>VD4+F(b414xqYHd2jWt1Y{}3TMXUSLxKj^QOM$W^w{6>JRfcKV$s#I>HmZ&B zOye*qf)2T%qa9{0bW029lrlz&jH#A? zm|h95B2t1It2^F3ecSrc`#AsT4!(A=+O?w13dGDyYp_m zAhsw9Lnj^)sb6JnE_;^G%k@=ih|UygDG8<~1`p0sHJEhXmGWmi>wv(VUVWzxvFx zT%K?AN1kZGl-@h%$Ucu>j(*r}U;3+t7qd9o%eS~x+-}c&sZ>KUqo++O-U=dU5)o5} zI%g^9hytzvl!#!p@xGXH3NfmP8Ye0`V@u10FT9CU)U-_$YM}O_B9$Az?5$&knMxZ#;Jo%zCpc@Z9htu`tNk93>v^zO$E;a5 zKu-*yXPMMITzZqMw?&wyiF=;>Vph#!L?qdMu?6&|SI6MmmhA`b`&gV_>fGrpEDVB~ zwCi$4!$}^e6b+4ajJq}uXr4cjL2~blt)! zV$E#%`sV(hym@%nW6SZgcA<;*C;$6T|6uWM=-RfOjn1XLo|rj0@&5jY-}MVO9>W44 z{M3E!U!4EB$9B!)GWH9f+Z!)__>5dx-O~Qpc%J8JbzK#to{Lu3hErpW$b9ZZ1T<&- z-Sxx`9`C*Pm(OC%ESqY`O<2!dl2;WnZ{yaVIP;&~UcVgQyawo;m7M18Y;0At2ADfY zuF$ma42=;%Bcg=}LbGRlXjY9Kdppr$PD;JbBcO#Pg>A0u81~aaZM;7ICA(~=_Y9ZM z{M0YYHx|Ep?q}|Q^1~N^rcuCHUCwm#myel%N!}PMs0g)5m!)a{htGzvfxw(eL}7@`HR2|KN$A_~s86 z?|A6M_*v0s8pbNc+k2eCdXBk9ZIMnQ#7?p!uY_?+!M+`hMoc+u$Pq zWKZ6H1#B%y>0p;|gi%3H1}sS7Ku1ke)E+TR=CmhK`mTW_)9&O0cg@M;Ev#h3O`7vG zOSJ_niV}W7FSvi_!SIgui7$PTUz7_VCF2;EB500Smb>fxki~=f-5+gFjq+xLjWXFs z)cmc#NB++0L!6)9E#GCnxqcs<*H>M2Ns*PY4E{5J@!@+O!H0W(^WVINu*~O^x6Sk1 zrW;MDdIxx>ah%~Ab9+3YqAs{tfF@O#R7!v}olGeA-MraarUX<6RNO51b@~QniVCz* zi*Y-p;=&(n4+=$%H(k%@S<4eiRl{)e)4TEJKROa<@Az4PaSHDm`NX^4 z^`5tXTNVEhS&foT5 zjldA$cu#;p;1yRjW zO~|O&u3<)$prQ>Bi!|zt1Jt4ya*=n? zm2(*NfSj}^$Z7NhA5Ujrb+6Neg6LRu(9KGmcsiP9w-@*o(W$RTyo75)gD6<%h|~1^3vMY~3c0NO}k31aS&acc@!UJGzG7n}%DIOG5w8*?1Wk9Y*vgfO|%vIpo zH{JTsJ?+g;tdGi+^T+(|(-^zGzG(Ma^rC%l$z)AFG=$S{+dTWZ!{q&`*z#POPA4-k zf+rvu#mxE!#UzR`*pPD>Xu207%1fifL|+i67kt;KM^?GoT?av}Yfh%Zk^SiSfd{Up zW6#~nnK&Xyewl}=Co-S=V|IEB_vJVWyzl3~F}IT;qv)^|w@jU*HdoxpFoXv%095*#DE{kZQYTuYH~ zp$=2Ze$-ip^0Y@R4#5w5x(Se@fMTbN*nkgZKMMW)6tZ+4{48r3d`A=aMU|kcG2rQZ zWRLG^y6Z|C`lg}tr>kTvr1T<r4J%?O)@VDIgo? zHA&N9ib>}fub~>tk}!Ksmg)!1d%jX0OT2H_=hm5b=OxD7GdbTpmUfEN|87$9KxhAWUx zKJE((kE~ZSww`|u_4($+2;|S*I1#?#XRGvL|1Xp2su?%=n#W9CM}m>oqjo}M2IB{x zO`gz`{$n@+0%%q<%ZUnjL5+amA!SX^t)==o!7ylPMjx|kFc6qQk52EAH*P;RS!>3o z^LA7nW;EaY$h2w84u~()SCR7B&%ViiRw=Nx`h+_z(7I-v{Vhe2?B_F?0sF%B6GPUQ zTswI|U!{osne_SJt&AP74T|$f*BY9<2jjoiG4r&>3%I>QhwL(S6APv3urU}Hb4+02$C3HM;s0`H;qRZjyyowNSgXxBI=i-#bF%B*oK24Q zOg4_SIU7fgvwLFMiL&;_u_Ia1C?nCdIMGO+q2|INsp0(w0t7*H6OBfrt8eJ4>Z-5y zk7|JAkenfh<7}NdoNmmp0n}6P`@NUvecqKQ8P&U~QXy}_LcC)lzx%&btt)}Yjo4|yWKoj1w{ro6L)Uh1ce~{Z_4Tk8H96J zzLZU^@LW4S_1MFI9>fB)u0M)sfdJc$L7*gs`<{!A=FKJ+!nDAohK-rbI+?5MGdLFL z*rfo~_cJa!%~Ugq2uJ8!s}HQuZheluTio9r4$3g>3KR$YJ3-s^nSp@6S)UmLQc*x_ z#iX+DfFPpodr1itB@o@gC+X_)E)iKs)(nI1@JtamQrs>n^&PH5(Uc(YrHf}A-Tu&z z=Bp5jD})n`fvZ8xaYW#1=9FY821g<7O z#es11rY&tn^=>3EiWDdz1<~m?JVbydRTNbQgoREUTu{Poj@`sa1SlE`Ld5I|uI0}&uh3)3MS`^g{41!fCTS;1=MZ@q_3q;rWJWy^!^R`G+K_Mys zMim2Y#F>HF(cD(lL#Qu(Y$x0JRxHLZJ^4x?q(qScf!Bo~WC9R~08hP%=!ghh)k6)# zeNXkmaZvnFEEqxHg$J0Y%1}I3IB}=>eIg^}AllIgq|og^;zD;sPHLTq1w@^@#44BQ zpU&s5r29+$hS*?XaH8U_;3rc7R(1LK#QVYW#ZzYeswXClyADk`TMSfGgqZ=%2JNvzTpJevZ z%N!!)rn53Nde`nX1o(h=BU)2rNRJbW57NCuX+1bS-dW6_vlK@tb}X*SWg*Z6vO9aD zh}64_1&B+RMDqFu+s^1*x&D?q@!X(24L zg+)K;W^5?yG+QY%E^Ak{7*5q}$AhRFXw4+8M9{6xb_f)LC_)4IPV9ofO$t7k+ndFc0wIFI#>wZN>4p`9yTXtkV{@6raL>I+>4awPNcP z4*4Q1_X7%H6a7Z-5x;v}3q{`S@;peVgb+lz_$-zr+v=VANfpk@CUX%+H=I zZLbdE7o3WUr(V60m5Ceb>bGPEqWf~ahgu_D4_wY)AX_;QQ_@bE%0;QGg zasm|5f*`i_$b&&NNP%G5@!r{cU9meq*@;HGlLWJuo=J|^s_5f2`=9PO6(-_cA9(NI zQhM@ERwBagkb;U7gnJ-@K+z(b$L2<6U?#D#)rxtl^rRGbuXViZy?Zj|U(ao5-K{~drW~nX5VmNKhib2#RqIT=V|21;+aFr`At;sb#Rf@GE{s~kh zfy#6E=J(~t4ym8xKcV11$IDw8KDhlJm|Ukm=hbEYSTou9m}++A|R-)P@9B_b&J$eDF9(o!Xc)nni+d2 z6{~otIXP?H#8(k8SRfFC_a`qlCwRA5Mc{`N9Vd!zJCDA~r&}#rsF}UBVpCN>{h0sq zR#U=r2l&?hgTG4SzkHT$G+_S^0|++=1uOBEK!hBE+p57zC>kMG36A)}BPx17R1?F6 z8HkQ_a(j=i21P+9ifO$M2qTLNy+srQjCx61ikB7|Wab*#*3|MKeb)nU8`<=N**kVt zW6eT3x@Io6d!ZLHlP-;PxkPWo+FZIiHaW2gKQh&}0o$>{O_%R5C9(R&d9!H=%oc#7 z-T{Xv?b;;~e8BxX%M5R>!l2ee4Npx@|Lezcx$(EID^mDRuY2y_ZTaT(u_r%Si)?xl z{`cQ~=+_^sHSa8Xpu|3ty*m4c* zPOeEd-VT6@1Z`uEle^~E&q%1KE8%Nbf~4zUYY5Y_0ucy8dnK-PZ^qyTdq%nHuiHE+ zK1lscxTbZEu#6M|g{hg_^`)nQgyRSc<|BsI! zbo|LvbXZ}>@!(XWtuO$s6 zVDvYXUcX_~!C;^=nY?V&jZ%Ljl{XHvRxv`cJ2rE5Iple|+x+_0t6Q&LOv4I*>y%-Yswf#C6tv(PE4VC%Nig->~E+D%?HHNdT%t?XJ39+)C_H-07% zV|?vT)u0Z)adgY2CFNMpC%mzq&Pg)%*wxXWg3s9<)sxB8;BNnRyL&JD4{raOe=Tz5 zbDb;TYA#FFu*Bqr<#_GB6=u?o#Pu>mvS%<*+&?xJou%kvar25+v%%^oAE~9R=VApZn-IVk6r?|ce3Vp zE%qABDFd!$#@8ir<|95JZEHa>qhXPpq*!LCAR$Gn4|1m^&@d3Ki@Di|XpGy9bXp#L zc=U|j{Y_7&F652qnY4>WC;qa|+v}A%U`}&s7=e}r#%c?${_teXyQnpU^dlnOCHXWA zKJmTv+^5~$3ty$ZT2Y;Pu6Fjr*Zb3#HNO9J=CL(<-mpjDJ7YuNVXU5BPC{gtclK=e z#{0ZK>FVx_gdO0-L^R(Vn+Y^DSF3+tA-LsCjP*Fq{rF6Plh)>T&w>YVebCnWu5_2{ zK6V~;J`xts3ya8{;zvMP)S`AZRZBJ2Q#aBZH_j)`a}c4C?J4~bQw2(mG$M2UB59!H zB1#XdCIr{;I{?T81LUD@A|RxnqYC2L_fpj=lIo*F)H@y9mp+Ksfpms;EH+12a- zh9T#Vw(Uv{1Klv(++&+|ts4>s5kt^li>KlOL4*d{g-bL2#q%^u2pY}3^5H#Mpak?y z)@$eM(TeK=4H|(L7zQc1%>8en92~qek>(CQQ~9wblI<@Xy1JPA`|(GQEr@vKk+=cd zCbPSGr-E(Kj_OBt)eUxCK0AoVgJmm$4G2G?j81K+WCx>5y)(hG>UG;=-4Ud2i}79$ z2qZ-k%JQPG$ePh+y{oiJ%ceDGbTHmbF{GZ$(THdMj7qHlDN*rVrU zr5W)-(k#~#%Y@q!XpGiV%!fBE-ElIA z8h|j!CKKvxr#+k1V0GB#13vHE81Tf)ThII-$=|F|d0s@G`)(x2RIaT3`xW#Gm-|Kg z_ddI$$oS>bwq?!?vi;Npopg%#wA#MXY7)$E=|tPnDHi`yQM^^IgF>kDVh!KBeHYe2 zeuH1v*PoQk1<0vX)^08-^vz=p?VTT=xzOwTSZ1)`da7#S*DSV<^uMkxM0}zWzqj|p z%v|b@xR+Xv-%Le2AYrN4ie!91ZxBapg2eT@j9|#p_{^SEp-qEG1IV<8iE$`rWA)LaY-FOqBU()8N32`lBbwO&1%FiL`+dR1zzbnP^{watoI3cFBm~jBDz+QLA4P}dvr#4wQ{jHmAxWlO3f`S-IvQWqI76feX06) z!)_#+Ek#tHKy1>=zdm3q2~9@b=^zjYAwK=u_BHDce__qg_*m@xrYpQ&=G(F+_Fft& zJ;s zY29YD|)9=zrSoX-YGPKJ79OK&V$<$NO=fK^y|d?*F4?b*3H3Z z8{hVSsqt-Q4>p3o{OQx%h6lCCgLj~QXcVRvcdL!dC;^d(?dV3rm%)v(DNkw|q+T^y z(ZzX(j^AzX0}6(gFD|PEGjXPfZ@EUWX*4|$M>deXdiCmAcB|%`j~t3u5}B;UWCOLY z)Nb2B7>Zg=CDv4I({eG13}oFiL@Wz@-=91D=1Z+D6+mM4uivs|^V3}(m_d&a>Gi&( zgJh27LUA#q&`YjgcAUhfww>~^pm6_v^MFs>&1Xh@RqIJ)OA)oLMk2qMIr@`_YiYct zi?3bvi69VS>SAzt`eHCy3btGnou8b&aM{0jx^#(BNZ%LlugxLcbro|m;&qk?kO6qE z7u-C4qbQ1$h=szoxqJ4R=#H5#HlsfA2F*Zg6xOM-GZzFs)xb~pctiG-QPCCQPX7YdzJv-ZGkgq*9n^ z&~}2rNL-A`W>z+3QTUN`MMGJ5NSa$~*AjlZ=|Nf%i8oYdSqr48-zRp$XaK#JZnL{v zIPG+lWGjaMvavp=0t_O%TgZND4=|x{z zofi)7Qkc1){4U-P`C>KX0t1?TLCYhlNSGYkIIsE&DF@9SGI#qC%@g3x3_ZNuKcl8t zu#oH8vFg6#MJaT!qLr*DI&tW~U^1l_%yyR=?vL2(uBG~F9c!Ql?LEe2+X#FlM#p-( z(^@va7dL&7P&aia@wvZTj=irNRRH)e@4BnEJy@De1gU_Zbdu9rmf!i*uZ3dJLiJRy zOC(lg*dZqzXzRX~?-RTr=APc|y}A8zQT5()cg4M5dw&?W#1;d**`9vvA{TIHQ2@o& zoHxPM+zQg2qcu=JCFy`t_6OV5S;e9aO1swc^Ik;y<+-NFi$4d>V;ve1NfHdTzqD!{If>lech<=uYBUb-LQ)} z%hA?Mb7#r10#b3l{BM5P{Ga$&qz|`9($UZeG>8h2UYFsffa)o$G#hz?=yuO`DBPg- zmN8r`*y0WiBn42FKJbea7%L&u?S(aW=2VGd0g}vFJff?0aJosbg_=j~Ac3Z2Gc) z5&X#PKvbMDi6AXvse16lWb%XwVC8p`ncsA-l|q>0Kd6n_UF;k+;fk3|N!MdK;C;8B zp1r@Wuq@Odi28_V6IN&#;p81LR@ZfVnn zPn@SJfki+lZGUe)pvljSO_e>IPJoQth-qKUA{DKZrsEEp#Ige?$xnyskDh{JS|F9# zkW=GJl)0VD)X##IZL>JIVK%*W(N&~^jI-z-`%vEU`~?fSJAZ+#k+UW>SbC;lZLb;8 zqe`}gX{Bjr4we+tV$_m!&cuyC`_v0`6e!+jdM5_ogX5rwKFBM0Yi%)4 zQ5ny1GPhwS+NsWf9&N^JXkvC2qUQw*$p$^cV+EWD7|Z}lmtw6*tQjp2Qt?q_abO>B z&nftzw3DK>uNm#qLzX9h_Eg<5E#?|%ATL_uZO!xh=V5WDfs?&pg;RN*hpt?%+CSHt zF%A0z=ZUGw4>eaOt3`l`)q@qV%8@c-p&r@l98}o<4`NX_Kx>i=2wL6IMORy~9I12# zxx#_(Ro|*06?}vu71d=$Om_9j5i1O8B3ht$B!AA|dh4F;F0|0ibX5V19m<^!z!6e9>&~iZ|!->tAXsY`q{y($4%wNWYkIlvL)SGn02IeiiOg z6I(7Y_~_T}!V`0JI~6?IDWhULU0Od?(WM@AiKxNq4H70Xh^@z4Y18De9V|7#^l;I; zJFS8iXfDZ)hCp`P<)JmMaLyFf4IviYuY`Yu<_oBS8;1@k!F@)vmk2e^r-ryrKa~9< zCy8U>eCf*YdJ4q?W;N=@NPG$l4($K&=l}DCi0CxLmUtBJjVEE+1=(9Sv5=v#Z!LK( zR801z;x^-tLF$r1%9o0~I_!x{7Zh-@hCA+swbQ}&lO8$>5wW!9)Q5^)n#=O-1=vC$ z2C)*Wyo~hD`2DB zjuk|RMI%wyXeOnAfR;uW^#p>h?zW-k|m=^UV$DP0j!rk#Qw~i1_Lj#xRvq+PRNQrEb(QsHc2OYHa)&pP45%FhiTBx^m#H z&Z3B$)Uj7jt`#CvOz(y-p;_uSj+LPubps8W$(1ox!hBi_r>O#PlR_q_4!rv7hd+QI z=DZhkbUXJ?%K%J{oB}4`2opJGhvtUNG<<=>|NQIE>sN+0`30wT6_NpNRCb~rA@}j) z&;Mr>Ma9}W4p&RlgNe+{N@YML$Bxwr>#4h5MKX>ZrYeF z2oPhLnKk+Koy+2ieC!U}w8bC=_{{C+-HqEDTNNdDLf!P-(?k$MbA4KoA?7s3YIB-P zgOtybmaj3nF{f-?b+1^a72NWnfe7QC8wZsjxDoZ-XsxO?r3~P?0V2?vBv?J&giu;! z^jClNjc_!JTeSV}(+F3v`;oz&>cJD?zjBN+X_D@Rea~8QWGTm{Nrz^u8Y6HL1g&H% zhKs7TLG#vww|5@rjYo=M{HaJqeMnq=>dl^Mz*EUz^xdczXaZu(tJn?Afe1GDU--SY zeOC9mWL~S9M}j-&2;wteyDO*t&P69*eX4AZpBD8wt-U;8v2q2{C>BP15x_+le_;F~dEdDtNE1jLY6S zuJ~?o=B@87wz(2~(!lNc^{{kHTtr7I!_$Gec zGW8k5C6XY(o|cOC18}wJCi+^P*x2$5k1uXq*P9Pg7T_wXop3w1?fNbt1~*KrU%Xm# zFY3%7ufLljMDacdWV)Su+9DUT#cP3xiUEkW}05&(D%GfaoDF*Zeayc z7f?k&un%6^caYSUwcpS86QHA1tZm^~0mP=3|5YjC7je%I)qHRp{_<9m#qJl3)d~)2UxN0-_6@c+x%= z#zpsMcjBBEQ`&uR{#mQ|By%YpsGC-I@F&EP95)38`{BU;@cqtH024=0nC zhkb|p{=4C$pXGCZo{r(&auC~TyDB>^bnX7r$u<)>Z45I|TCAEC+O6(>iyL4g^+)|ZX=-jCf001BW zNklyoacxpe?f0E-LJ-_oG^Qg(W=X&>XxbJ!NT$O?Iwv7|C5RUip zF3lc*zs9D(llE^fw%FMo;G~s}3|+#NJqS1Z3tKXj$8sBD17Xb5t-Oga;Se`X;tLq-pZ3(N={0@xiE`qBI3Jtx-V5yy z@0}su-ZB69Me|T94rMZ@CL$QrO%kLVmT6lb1?(k%0uFS~#R-luaRfL3Oq7p6{9jK{ z0r)y^kspFb;h8w}J%7FMnW}$XDHk+?=%)bdfBPr!$jpD={@EF7x$;$`nd%t}VO`p_ zDDPP7EDRQcP&4Izu+w15xrB)|Qi3+^gtzUCU(%(o8(Z4_R}D%KU)#B03#ASX86LM>$BI|iAEYQ+=L&m8$;*QEVzv=55NASc-FkXl~9 z5?g;GrPOT)D-dGBiak>FMAg)Yx#)Y3vHSo{!`9w32iv`4>d{HK(NS*LEM8?FiSJc98!_;7^%x8zzAN7!@Z_*ed5#U7ccz>$d~6S==r z212*Wmy7ixn`UN){^{5L$E7#tIA!!?+7(tdw!Am@?f$Tn5D(%z#H_`_*ab$bS3H>u z?LRpi*Ims4jB?+=Si84qkfGq0^zj8vS!$+B4cxa$srDd^Os&B~g(s#;MmIuOs_Vv9 zXAx=(F58T1W8>v0tjSD**UY&M8dHY!Es5rl*fk#;^ry$#B{NL>Xr!0FH~79V8$G|0 z52c6Rg717TRjwpBSpDiZJ~eTK%E!}x(f;CODo(pPvqwAsYp*p^@p38yKc0wadU!Ho znIC8VqhN!dE9VYC8~yj64I^7-m=(MiVd8_ zuLA2*)MxPlvodyH4Ce4A_L>+1I_n^+0@F@UGFuNkE8@X8j&|kEB+lg({?64pEi}n{e8;AB5cgN`DG?Y`6**14- z0!^=nha*w0X|VkG(&J^qq=N%HSMtW4r*@tSv&rZlR+|V%vawDZnm{YY%*K6xgncJD zj>2FepzsU#hnwLNJQtS=u4NXALw0P}D<-aQ4f~rIo`wFB&ze?y zeY!rG1BsZb`k9U!K&Ak(O(cWs07j?Q(=jAXDCtIBFBzADx63rhfJi?6^PqS9e45Nc zgKdkE>ArT~Wztkg6Zl|2=`uj*NbWp4c^3-OY8+7Re#yF+Yma7*{G2axHlBjPJ?hwyc?eRl29)wLp;ui; z18ggFsuSd9;S{HK!YSAZ$6*hXj4?@m&*a$gJmuW#{q9JeyTzG<{(YZ!s)epzL~Eoq zchKLg$cqa7i&%Zz&a!qf9G5K=x0RL$&qDuvtiKyN<|V=5g(&&fI-lI@}wfVE-_VAYwDTaPO3=;8pgIICAi*+K6}7+RF(_x zyRHJJH(GMz;=d^^Y1E>!Y%`aqHP_1So)XY8>6zi-YH6T6o^MGImnKFIRmSRquYPUh z^M8_JH1nehy`P*oTa6bV8P&YW?2%Nw&6SC{DNa4EV^B8}mI?Ek8HTD8;W228(3yeb z29%TIM~oF41#16B-dP5xFjxpym;b!$EXl2xmv0O23C%Sca6(h$bsuUC=(pCI%!A*+ ziuFy-CnG@3stm-p!%!H{q)2Uje8`s;`1p3IFnbDMjSrnvETaJtq))Q1r!N;6l9Gg6 zYj}?y_)u~UpJBOCNi6vQMrzP#FR#x><3E02G11(s9;UYGv&zzoXNYa0LC?_7dKr2m zxm0Si7ocZ5rS@ES$Nq45TCwY~aL(6>iH@~Aad)kj=e)O$B9UGgd7GcxE zC!Trc*De-Mo}9Y!_JXT78k!*u>WY#`r}H20>(d@d#Z%+;5u=A5IKMSorVJRssQ&kq zcj>7Y{QEuc^2_r0s8K}g7$t2>EmJoeE^|gnDGV!OzN}cgDrMQDWOMQo)WE!~Bia$H zn2pcmWHy!3KI69TLcJ{Ax&T0pvsT z*tJeOK9sMwQ1p$b?LYo-xvut<;#-;7P19|CPr%m)w!G2Ylo@)3uYP0sZy!l9*ni}Y z;fsTAuFYWIF2y_DOwlAoxk`Ov8FcF4^N67_Y8NKuTnsw&P+!-uBJa*rzEi0A9=Z9# z+D|Md+xa3AYMG_7xxGBoNGWo7Iicreg-MBWcBhb++PzB)VC`l$&lSgv`WEK4i0}7x zDeucCb3uMN)Bs2KM(CL?gcHSm#RYd!&EOLO87=jyZHZKLq*4>@ndZs!sj!2$v{xl% zTsxU+VkI94ymGd3>dB*f->O83{`8qthBx}k6bA=%bBFiP^`ph!_-LekCa!bvF=D$X zJwe>;n5c zcPZ!1L!_GF4#uk!8m$OGCtr-_iq)Pn&D7vsw%iHsZ)SP*+FI<*EjOE3kne5wCY;ns zjE+=-<=37Hay8HOQ6E}Pu(eoLT#!=M^X<(ik^L7S5-840)3jIsbx*7A6IiD2TGl=`xvEs$9YGEN~QZLl}@o7zRbUQYNnm1 zO!@6%ux?N>$`q#@*s=Awmk%BM38R~}Bt0~b!u1bbKVO9-5bI%Ne74Fq^ww*zJUqJ$ zRfQk$n@d|!%M7N6micP$!7a^ljxCQ~d;L$}RLDI6|! z@p`gY%r#(f+mg&22l}sI?e;xuIdj>>ck!b;{Ka}-25LS&kEds6;$4gM*Qq#5SK?SP ze5}59;H*hyPCl?ErMjX8oULRl07eDiVCR=#?B2z))2GP3gOv06;;5$u$B#ylOZmy@ zaCQECnMP)`LtNteR6vo)a>!7$ z(A*Qdy+YG2VS9#Zkb1oyAiv?0yGAJUkOsOoc9q(u@3k-=?T{`~M z#k^DX+yHgc*j0K4<~?dg*<2WE>6t0Zgqnor#cZxp#xiZAY{hbJ@C1<)V8hZwBa6=I z@p3oAo)hDddr zcy?&^*ax~(=9cGk{*%>OwRc%-X+a=-Un!LYfubbZb*;7D%f^PM2VQu}ricr(tZaCg z0nJ5%)UM@%m}+^l11KYzQl5^h2oIW9r}G!rr7Y$Gme#DBsgC3Lb1l34{` zLK-{qE#E^*--0VzTU!&)&qW__;x{HeFXmWtfA-kv*e+-{fxRzAF>YWO$`f>=ooH96 z;JFte8Z8!y!gB{HJLN$}+6RHY;#z%ZaMSrR(u+ybE%u*3h*(?eD=)`&*~H+|c4I33 zmEXGv(2jq7{QUp?HO1Hvew)s!;q@Y6*X>-R0)zLeTf0hM(d~b~#)H1n(|}qV=#dp~ zJ{ClSIJMYZFfWgFQoV0!u~vUPH!|NYNBV7wE+}{kSl})-T@6oSA>E%p<7}NzEh$o3 z(jE2JM{_JGG~#IMFDztU-MssZXH<~Pb4q>#}~V|Ioct55U5uw z{1l=uM(OOzGu3&KC|WBy%-~1~a2?a?Y0!GP%uhbkvafaQul4ZaE?VQLr)}cpHD^a| z|M{Bg9mQP%mb3SB-r2f+9b#qi^J@S-f5+ZCzrkUnKO-HxR@EZX7oX-k_On1clR2YS zL{ki=;v@6z{97CBBCg^oUiSq4(J%h5zwss@@j-cQi{t2)=E;-~et)F=q0|MWG)hX_ z90Otw1B zpGNt`YisrX6N$wB7dZE1vSq7+uk~CW{psJm^=BCYQq7Zht7j(eFIKT*0?>m{*R}co zw32`wtN|zM!`zpzJo<^h+T)yQRbx@tNd}+dyB~)ipN6fib3(1H*Nx%nffqLS+eP;m zd9FK#U`eEV(d}*Gf^SLp=R5kwxVoU=`$%Rpic&nPNTuRP^jfdosQ0Ne)*O_hw1zB_;-J^ z>P&CCV3#t>f%b#oQ(?=mcJgGhu&6W#)NE|H(9VDVNxSHR;weiCDAJOe%SBSwFtV$y zd=c`BM5Y{=S|3Z-x4vP8d87;;Zv4uEa{2B&>0oHX1*Lt@*6}XApl*^z|qkMrzgi9wwn^k^^!*O^6y5vQWuZRu+zgCsy}htP>5t6uopQ8{&Ad zQ+_PH;mW{Y*NL7?_GEaxo;csC48SAY9IecL_%F z1}w?h({nQBKoc$kvB$(n9g+$DXpzXtSEAw0YsMxa$ryW?%#AVG(`54{qMa-iR$Xcc zWoPvdDjW>$vs3RlQ2B-5ADJ1@xXJ9=F#gTE|ENQA8@va>?zU_5&Y4L@MmWVDfIS=s zW@kCI|G+9o<0FixKeF$W|DuoQ_2O@Tb6}=z*Q`hoD2af&7AZ3?j|tZ-*M&2Xi>;;| znhUOy&&{9dTkZhbl7=`Di3T0z4&s~}r#5Hm&3`CorUwgg%Nwb@Ctn3 z0WDtCS{kk<0^+SLCx*hzhd?}O&&D=t$Z}MYrUxUCY+<_tX>MuUZKWpmt2ZNn%i?OfJ zrG^__(iBJb&xWo2E`&R8V7c=Y><`am7{W}`yN|*6c5ou8C_4U?*!619wYj_W%|{Qs zlUp2fM79#doZFDQ^>hfFTmOnnYXjBD>oiXF@rD0e9HO$h8X|ZcqrL~21oGuvxdUPJ9n-yUZM7yohW>q|k*`GD*$-Zu1o z(OjF%a59DrxP^MubS z*t@Vu*?8o7C)yj!{&lK4^2`hM=AG;=c*_5Qc2y4?K1l2=cK1DezRS4THaA?3=ui*4 z+FgeKD#3qeNVwVg4xhSn_(qJ(5GLtf;{49a@quY7o>NV^PV&=Oz>h;fKK^oY zpfM$$oX#BlR)g1QlB(7}swg`C=KpK&+jqzAv$xMd5mTgdpTB&ptK@TwF{bn-c=<3| zp_v*_9s(-S9JzLNHR>Ik1bUjelfOohrM+X{n;E0!5@OePd{eV+d$(g3T>R2sRoZuS z3lD(ZuU>g9KlDPo_t8V-+5`Sm7tKSdc)OV*Gt4_+Tp{@94y;m%;VXZz=lHFkx*sU# zLa!RS)x-QRYF;n?_Fv69j$Ny2U;RHn4c1TGt;?;H`o+eXS~JH-e^O3W>yIZC9sk12 z-nZ9G&)o-h4^kKfoUSp3xAtFFMrOt)$?7p@+Yy=taGvGRlLyJAsNRT609xe~)%+vD zvCwC3n_F&{Rc`T_f`I8S4gIU~T^#y@jC5~EFCT38F0F;~ru@)fw7>Z5A)4%%e@d3$ zfK)TJjk)1+L<@Z?!2BcO>F7@!fj?jcy082J>^Tmv)`308_Z;UG?Emxqg|ELg`;R9v zIk){I`#9Xk^Z))AE^YL$k8|Wt+gGhOpgA(}6Da3ahO%rGNZgQUxs~Jh0bkC|6%3RB z8)lef1Z4D51Nj8llCA3Q;Wze(LzQfWXf9RlS*-TZ%%#Bk^mn~cfaiMOsG(u&@2F&6 z{PO6x(p3WI{si3b!R`j~%a^OY%b%N)uRoeT^%cJMrHe<{lpfdqxOekeXjUG1N;!Xo zT)PQ_oZ4R|JQ^`qtkDKP$BI+E>vx+t!hR0G&LK?F^zP%|ojC;4UMSW32>%UuZV z?!@B5|Ml$d_Um6(ZmUtwGCVUjnXRwmcRkeWyb7HB?n40Q{)azJS4Vq4VeVVN>-%v3 z0=M|g;3Cf*^b}9GA2>JX&KiKrI}T1PZBH-Tpr4A-@zd%bfAt$%<_fvY!{a~rl`+l| zhe7wLXC_Av<)FQ7ZfI_}%&IloSfMpO?vrEo)-+?{2ta$!@dE&-y5Z|TIQ8eo9)QJ^ zU*_?nHyUnV`27Nd^Wy)H4W4(nW`Hp!nWVz>NaK3UQTi(!youW#W zPHlDVNv(7(q`ITr^+bCO1-b})IFu4{Az)%I*d!#j6UTA<%4BxE_O5p(Gdt5ib{*Rx z$%P|?G`HWsY}vAB^xfz8ynUbFOTROLjo9EK8GRMNy)O#H!|I(I?;9x3<2% zzP^WvwUu3i$;sp-L?G|BG<-No&5XWytx-_Dx_zPC4P%)LI646cee{_-D6cGzFRKq{ zl7mg*@cBy%Q?>tOxKc@x{IVoSz8TBI!#ZnOIl-2M@Q&g{%CHjQ)+9 zH?r(;wsmUU+}ymo_(b_oT~WHrMSqVt#e6X2AMRO?uXbwoRIQw;l;R8lgA6hV5welC zQOT**(c{U=4OHp{HI7#c$9~WZeCrUay*i@MpR635{r0rwsOD@@xI9sh38+?W;Cmf? zZuC?TOKP!T`I~>P|I}HOR|Ln^0soGowj# zKA0=0D?T=#-@sHTGQkV9Z_^Kpz|LoqudVO2gK|%C=d&~4>5LOfbpD*^1M541JIC)5 zQ#W;Nr32P8{3**aew8wf<6%Fw)R~m%1S0u^cIrSJVDP4+qTq?nSL@(P90zR|vbn@Z zP=vd^z%3I~$rDNEU*~VASP(E3*Yz()REv`ioBNj$2U23Q$s9rs6`3;(ai6T5iUsTDh9K#Oa^u(hh}J#<=zj5FHGYDee2I6AC{VQtz^r4m=R#gTk(3?LqW zz-gcFuyYB2Cw%GLseo4mhp}?P{vxD7`r0dJPnIqk;!1`DriuhD?X4Rpy2c&la%w$a zgu9rrcjH0bM#kvbEQKuTNLn6!<-RcW&f1A~PA_c{nhrGN}otKN{5GPLb)4Lry+YVBm5F**L z-lUWdZtj?ZIEBJU9#%a1clIS7Sp2fNGZ$9RR67r66ie#$If`_#ByI88plPbAsXFlH zlW*-3WuIhT+5X*y$YXy+8E5Q8Y5U1W*(Nx?I7I2?)u7){VzwQLlK=n-k4Z#9RD9LZ zqwV&YB}!fWZ-hldi5$vJpOPzTZzrgXX)uWo)S|F#=+Fip7;F51XT8vCYX%5~q$2hI z<<*VEiPj(fW$}qrKXLS6!+IAz!9m?7vA30jwVS;RT}m)Z=8~Jh+^cqYF7Rur=Q!#` z@@qV%S6iW52VDmzTdzDPx~}gsW92V+Ri06%(7=E+X<+020fn}{K6a$FM$Pm+b_6+b zRtcNQ?A`x1(sp{OvaDcgYU3-L;Fcr0W@_l`3gf8DKQxMu7y(WS(T5u%rxoou-3{%=lmU|!r* ztzSYR5c`uKD%+kDUBBh(?`^9OEw+gQI>eD&m^p7>0+laEM7|f9D$hc3E32kJ2Xtq+^O5=|e_d{hO3# z4X((;sBxdlvMgJUBytJI8Y&Rk-n%19ZpG=Wmer)TH);w*l36V)feKn?SIzVcZ3oXb z?&fKBy?f759v)qDY;jkYOr~sbI*xdWT}dw2B1}cOfXDpuxU(qgTJN+jqmUt_9-aOD|FouSxE(uC%88w>Lm6 zRQO>m-k}8103E%e%K&4p$!}NKtC*t9XxqVdWLuW4;;1%$UjsdMNurbSIk6CmnDq0Eca}5Gx{5vbboR617qMt(cdsum8k0r3+pVOCjwCr#wcQWI2>1lG*faQY`G+ky+#TYBg!?9(1mP&bQ)=#F10SCdB zb?MX6UGII+Cu783dC+NSnOfQPQcaewJ1PTE5HHTJeq9s!-8IeK44h$c-Zv4j7o{_x zX%T)jvkD4J2$m%Az@bSW-S1RrNysUnymXw1h7QJTd|GykJIVw6^6VJn)VW#4bc|yd zGByPFtqVCu|F5kYpzDqA4dtlPnEp!;{XpcwAs+(+<%B?;T^5|u+xIZ@M7R%Fa6^}TNMuXS~ z!2Q9c<&yL~=zIR=5|5jz+TDVh*qiqrcEZRFKI+WxeNZfFuI!uhD+;GUF$9qm1ZEb8 z_($GhA9M?QgV{1~WfI%^XKhixKRugh*t28&p4l)$?}pc2b+M}4ac+L) z3}7Jq!?dSZu6n*4&6=+#uKa9j3JiRKwFPJvy5D#1|IbbP*z{weL#!x0vXH9luee3X zqua50v>7pstspR^Z#D~!gCuon7h#_)&Jy*aZkCPsQcpmNLBCv6Ggb(TAV82 zoh#gFHXu_sUT50&)7Vd4%`>TTcLAloXMO$_^Mcx|Vg*$)2;qM&=FI3&qq`s2 zn3f@KL#ls{MIsvAk9!$w;*QcwP1H3>-9(q}X)JQ{ZcQrOvv02N=ttAu^~T&40Phn2IS@L21qL+`sRyr5CQ8?e9s<4Mucid4DdOYMcsm8}M6M`udN zL(A$1bE)Cb7U^%jl2U4)^s$L=iwR)K@Y{Ts=tIut@z9j;l54c@*dAL@Rtm{*kRlDTV=yU|Td*hxFtUuiVVv6$-LJBo=Sf;T&5oX>9u#q(Kz zsSilPgfRO;-ah-OpGT&qR27r!6T&t2Jc=cGG@rfEw<4$BOl^NHQS7q!OJSe<`*{l0 zO2%&jiY0F=!r5rwlF+FQBmLmrH9Al{t`-$6sP^x!QoQ28adiF{+X)B7MIypof_L+c zwrw-ETexsuVre%A2`bCSqgeoN;K_;7yP1;WsU}ppyLy%eD4){xoa6L13?VXtyt-WYATwHdlD)%{+kKw6x!(aRN z0ohbN3#yujuQX$?P*?;m9_kC*wIqYCfiuyt;=lKlkW`cF9m4;cCsi(4c?(vqhYXS* z_c_> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dind88/assets/logo.png b/decoders/connector/atim/dind88/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e12de1b6ee821f9a5a2dc7f0d335d381ef7406bb GIT binary patch literal 80977 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dinda/assets/logo.png b/decoders/connector/atim/dinda/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6d64ecd81f489ef4fc04c6aba04506ae903ca72c GIT binary patch literal 63043 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/dinda/connector.jsonc b/decoders/connector/atim/dinda/connector.jsonc new file mode 100644 index 00000000..1e74732f --- /dev/null +++ b/decoders/connector/atim/dinda/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim DINDA", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/dinda/description.md b/decoders/connector/atim/dinda/description.md new file mode 100644 index 00000000..887055e8 --- /dev/null +++ b/decoders/connector/atim/dinda/description.md @@ -0,0 +1 @@ +Analog input reporting over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/dinda/v1.0.0/payload-config.jsonc b/decoders/connector/atim/dinda/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..01d41061 --- /dev/null +++ b/decoders/connector/atim/dinda/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-DINDA monitors an analog input and transmits it to the LoRa or Sigfox network. Up to 144 daily 0-10V or 4-20mA values can be monitored. Data transmission can be setup through ACW configurator. Compatible with Sigfox repeater (ACW-GW).\n\n**Technical Data**\n* Dimensions: 90 x 57 x 67 mm\n* Antenna: External (SMA connector)\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: DIN rail compliant\n* Power supply: 1x 10-30Vcc\n* Frequency: 865-870 MHz\n* Power: 25 mW (14 dBm)\n* Transfer rate: Sigfox: 100 bit/s, LoRaWAN: 300 bit/s to 10 kbit/s\n", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/dinda/v1.0.0/payload.js b/decoders/connector/atim/dinda/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/dinda/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/dinrsm/assets/logo.png b/decoders/connector/atim/dinrsm/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ae72effebf6d09789f7e7a58fb651e4dd2a85cd0 GIT binary patch literal 68693 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

mo+*pa%vhM?p^F z4w%J_bSQ{agc^YFzlbar3@tWVOM$FGV#T>+E)SSlMKl`N12d`xw@3(c9A^6G#ogzadodRP*f0N93c@E=SppD)F(@!8TvyN5 z;2gjZr7z_=C6qV~1wSbnpC${Su@hY4K%$7erZ<|Yvne7tuY%$Z%2CZwq!286b_v#I zSAiO2D}|k>I48Gh*ds6#gi@>`ob5ta6|M^!XbiXtg^sBEkPpo|3E!bG7NioX-eg1d za`0vGG4j3us2@+sj%YhpBMJ$`OF@XoiX>VyH5jI%G80^zjfah}#WF6gClTTYWE}~( z5g&jY6ZG7Xgrp?d*kLQGlVY>#byQ3QwWtaxs6h_MsjQNWAT})wc3uIGMTKV(>a`7( zSBrc_niPE>mI_D0h4D+BkOOoi3lb@yZGs{pX&6McCvM-M6B*e=%?Z^I5XB)VE=W=6 zD|ifT42cK<;w2M~B#_Wi0!eh~&;(Q@3cTJzV?xjxH540G3!0!A>p>oJK9Q{xyUc;Ugo6wMO{;*dWC z1VanJVTaakmQ_ZGJ!_HKE4>+z1=^Bp0tp;pn<-1NjmZIdgpx@wvZ=+c z7u3)3k$-uls(`zYz=i)p$baAfp$PmsLQ$Z?e*_~bn>}H9V1d9jN)D2VMK6jspcN(2_lqFyV@)P`&ym4=ock3ohNsEGkR zRSTrR4ta+-00CyOf>aHi0Q?ZG1ogu`Y{(>LM)?FmJ~P~5P&kF<3?~gvFogg z0@(;HfZRZDsm73@%@8XY=%*wV)`j0{h-VxW)zNWE-T`$8TzDo{14r>BG)f2a5n>8R zYEq%)(z;bl=voxl9IU~A#j!Rj9Ml+SHB}Irzz=VrXcf`{goHkucq;U3@elMP#3n6z zkDf$|l0vZtPU7fvx5#w1un)I*5wY5;!AT zi-=>65=9-<1h!(5tjIt>me5n#3~DPCI+WRlmm(vgUm}08!8QmacA`R{g@nvcH7C&( zfFM9gxg}x-!Y{B##!RBmWwF!nwJD08TAzYeNS?AN9>GpPMIU3@IcucVYf24L~|B>XVj>svj01xFrh(7fYVT$`334ejKdblHr z1hj-4fw15OF@)Rz8PTFFQ6W*=sNhR9La0;Gp>R4q$yCU#tXoS;5#pCfY1IFeHDoHB zRRlM3m%wa*&SDl}YO$$AGe#8s03fUnI?3um5G+E=4(16=AQ@QjD$D|8Q9N?1V5JF; zNw-xdIS3t5CF6S*;E9Zk6hT=fq;cVnYQkSMG-Vp8!piUnT6&yJ&@QMoPg$hij>1MI zfDi>2#o(}C@DN%_5W#S0Mp;DefvM<#8GKbElo271B8Ve7aBp@l13nsTI(QDCMZR;T2XC4kSG!BfAOtkT=L81RMDSpr_`s+k`J7tYZ|q)%3zB2Z1vf z9d#N9*xO`s3nEOL}gKg+?# zsp1`FH_RC-slr>3Vh}rjggKo?b^%{T(G%1`ATsL1za;d(6THwh9F@6fb=VE6e`a<^ z|NFeHdBWC4_Lcmf)`Gw3#JOYv=cd9cL0|QiBsIg}DhNd^=I}!kY z6K#|df^Ng4$+|3(ei0y!#$y%8fpVg=8V$faf9q9LU3C7%#*0lRni>86r>}v3>7b3Hf|5W zi{eTnlxDPjB97F{8wiC63tEH5(We#YOA$ngLP3uoViZE04Q8)70mU_mp5~Vz4T9)7 zOn}-z`9Z888!0vmd&Cy7bD~J4vR15g1VJ9^ND`FDPDn?N@=`_@wvymU^pv;&q2%bL z;7STvL=iI)v<(o(>`0SVRt_+0#atD99KOURVKrH&WnCJXrU5{KT8MBkQ;gSJx5F=~L+h0l_IaCsIiVKWmo262L=a|;uBx0{QqvN%I%V__|aU!*`e*B0gAJ^8xyrBmG#*f#j&BTd*zJb}W01Kmf zf~}LwMBNTk6nX%4q7@EFQe&||zZxRKJd==XXnBxqBn!GDzeowl(3lWaQYds#d(r&| zwHSSamm|>=4MabZ1m?1HUTzhCRRpDxC?Xti4fdnOqu%Ic*`zh#HRMtlI6OxPcGQG8 zIABG&?(kKS9mpU^n?K!`jTS5X5&x*Lx}UW?TdM~v$XAYxgE|LM5+aM}&HnAZKXNYq zYx#%&3dzz4JBP%hC4=f_h66>zM-2UNUu?k-qo~*)sH$jlp_+>%Kynk41t_@4*IG&f zG!r5VU5hReA~)2<(TqnMB@F4z3Sia?VH`{qcP9qQC?o)M?61f)BDe*@Ni7^f}- z`s7H4KC&b?3Mm!>f|#}-A<;PzY9A6kG8-^X zM#d+9?1)u%JfaYwEDE7Tjr;=FKs_Yw(X-ZTP>=CjR91$}(D*5t;1mdFHb%)9Wwvy$ACPPsGmn1CFaW#69BBKSU zPh?1Zfx-nwO&Gwv1m&egNm~r%ktUZT(h)(yEQZh={X++ZrVys|7w@84*!Td5PTyN> zCiM(;3c?_+h9IeesuL5ek%M8PBvwWt$eJ3_8X`G^dGr$*O4D#BvSYvvd7U*gLh;Yf z$S7L)wHYTzrJ#>S2a`lWJt1^wQP3%1Hr@xyiS~&J@kC%H1dI@4QdpddW(lT3(m*mI zA1Tz=w8H@r6mStQlrV$?oKyf99RxC}28J!su7ht8O(YBTEvpML15o(!H;N<(#FEi@h4P6;V9H6 zBC6O?F~>-TrJW$OHujJ=5NyRJ6KkTGgw;h7peZhXDC+npLZX zglGjz{8PsO1xnbsfb6S;%7(zzi6|x<+T*|q6+}|r?j!M z>sFotzINu1;9;WkKm(gG1+-aEMF>W8uSqE&3*8Im70BBNRxoRt^(f#>?NHd$yh5}S zgBf}odNw3ew7tx*O`(V&4+;qZ};wi0M(GwCzRjbhL ze)v3-B96{9i50m6d4RsE5c)+Nh*?3nr*L+Lb7=$rhig-~Gwk)lslcv(`aAH!w3Z{9 z#E=A}pIIfEO9Zop;zG2)pwoCP6@$(U=hHLki(>)`qC0~NA%~N}umWrm1OS1N?F3y% zp%bG#ba@qm6KNmmgOlRpR7yarMg?Uxh{lXbqG+I@h>))(?NM^l6X6mFLG;m(9iSly zcK9FxM< z-=|5A@=32B8IxF|V=hw_!_R5gVL`ff_%pH!$&;=nBTQzZU)0fX3MxdhHn=PJIfbWS zNXVvCSw^%p(VZo@F(#!kc@Fu84FCar^(A*k1i;tJQI0U;C)P6w_TVW{ZJf^5=} zqaADnP5>-MW00X}icrrn&PYbEK_Vyx(4qh@qy`{~+%KAx0G9A?8&Cv>)7hoo&bA>=BX z3YJb+mRv!4r=-UD#5%<2ykOU2$O#FaRm!9WU<5G71*mvHA4VIP7({WPjHrZkl^`K2Gg<{?GE~4s6g2`} z0PIG~n289rm{J8Ngk(r|puhqI#0U}EE-IJ?z@@5$-w8QLt3ev0UKUj$8j=`VfI#B$ zVuTl{fbobSKwOI4!jKXxg-Ajh=`*nbtOqd_asm0Igg`eC+P)}41#x6@PaI?xUmKtR zQy6hIQdVLsaxb)iN*|a+Y(jIR$;kK=I0`*RHxS}Cqb6uWDCLTcc0BbjH2`FinqMSX z<}LLClg0LMKg_u?TfxQvF}MMj<<`)&DY!)9qax)cI0PjY#lMBrN7(?DlCbO!<%fib zBJ99zhtv!dlGN-*QIe{FVP;B1vjklT4kX6SAgN-=SlooxPF}HbOYATUrS}G#reqLx zg^-Sz0%7q~L@Kt$N)AQ6A+yo5CUO{t22-&PZY3^HI5CTbHv9v$9K{|Nv=TyM7K?F7 zC<4l;m{CA(z;KAJm`kVyq5-LA`cyR30e*&42vGDJ20IuUMO-3@unD5oC%!nuD2j?v z1F|292BcyMe>p z5e48ZP=dw)zQQcY77h}N+yieS?=YFgxE0^yU=!Fz69~ybjs%;4(Gze?mYON*kdIKf zkhN${Qyq~qsZIb90*laKqDiRmqJ*U65C&xiRmIRGy+<~cIHAHI!QfO3ZedX{5EUDn z6M8IAR9)a6i_$@%xT^S`nHWm|T6G$gk=*N0XN9sZGqWPdz6qZ|Hso4FCr|}BLjC~t zKsFjBq&Y%>v1Fm3!YKvXsTet@3>6E&-vo{l+C(!&6T3`&)45~Lhe)F$rc`1oOMp3j zM`Dqbf=nmk2-VLF%(BHWJrb}E`U6zs_t;eo<8k*i5Ro+rQtShEikS$AJ-Rvgfu%%` z+Qc*wGPGdyR*Dk}E0M_I{%|em809q#R@7)H7*+z3i2x*JDjKR#y1U#e)J+V!LIJRv zs6G)D;n@tL;D~6AG=yO~_!B5^p#cZyVtPQ3R{G|Sp);#E5Y-v}B4#2%WkzCPf69z^~Ct^*+q-g8tP^1`Z#&*uu8oF zQ${i%z1i7NS*S=*d&X|jeJKsZSKqi3L>bbBV9;#=&WRxR#Z{A>4_>?C>vG69%IS)}ujKnHd#>pnNTd1R7iLY&Cod>4UfcfB6;=kSaQKcs0PoECaPImS-H6 zTY{|6Ku2XG8==*qJd;aAGo3~q@(q#_O)~M#4srrgAUQ!xGZ7h^+Z05Gdt~wmYapM} z6Gv}GqG#X93y5k2AiWwDlVBK4&oV`ml)HjYAZZhyRBb2;Faz+1&81Hu7#MS>V#Z7$ zyqG*;OR4pM3>v=drkIDJ4hFN(QfShOpeN-sC2R)Ba0smgA%lnE19UUVtRmB4T2bmz zS)-(?mx3~R4ep3 zNG8DndXU?ZziAVbCJf96FfxK9>lnZhUycz1Jwb#sF&Rjc95unLVs=3b0i~q|REr@W z7&agTC8xB9pI~Q=V6@~(!X7`SFd>i;CjnMiE`}Aw78B!m1sg+bQIw)&vbz?BD|LV( z9*V$;6ESANOd@40bqG?UV>E}pkZ3T`DuHS<_pCzdVtks4Lg@XXz!KPoA0jI;cL3T# zV#Txu+f1O4yF@RN8)y7Ni~(U6$D}1+gd^>WHac}EEE3`YvNK0SUx|4&h&}vMw6x$w zv=Kz-lFjF4sqt73SR+&$zKueo4#cA9;8-K23t3)3xY!*cNOWPLe_*H>i4vVK61gBa zBo8_cS`8!t?OhD2TU1m~Kqm*WLJlIl5jsdONP*}!PzI!FYEb~4^N4Y5whi0`@nOFx z=x`^xY>0JCFAB*>h-^YuBa88aW8o4EX+fo#F@(6IkScubj%giqSjM*S5h%8x?P3lI zlwf95lxAQ#=nE|+Z$U-?2gEUK4Q-;8a}IUqKjP>Ci}qWng)P2&7j` zld%i*cF4{$Bjo4?)a>+~U`V2<l~lDDK&K~sSR3PFl-@$FslttSW&4o-8OiB^&clMV=);vK$)O1~V9 z6vhT=0vjDlE-;GuX(b}1>FHVF^t2)caTMJq@nu%}$bc+CF1k5*1mqOlx5Ly4X*~jr z7~6+U@V!wL5iUjms1mWI;G&2t4B3FP5D!Oo`p4JtnCv1cVo4^FC{)lk#b_|}kX8|2 zVSsoDn-Q&i&77_%X_Vy4u2G=_kId3A+krT%qr7DNN8~a54t@b!`DrI%FV%ms{!pKApgkk^oz5LlQYl6Z#n0Dj>mpHFaPuT5T4ih zc}yOjm&o(a<3}va>p0%d>*7zxU!9$v@;^!W`!TvVXWxBocf_wW2qR<{2*V<^jU`T0DrxGaBct55MiJgDN-v2Ck9Q`54-X3VLeY{>aO z?NG?U&_f}$bfSng!-8V1Pv?zUu*t7%zM_5w1AdFDe8_*;;ASBq3%_nj@=5tx z(dYK@Lk+U3)q6gnwNp=Z-jqPss@psKGPK7kr!!q*Mt9gdBYQ)@!R&zSgSolwed23w zsIl6XKmU}i9qpg)^nE{T+mny(@t@DeyFS!5`v3S}&Y0rg`*zb0I@9y7`R1CB!V6A% z-mX`t!Q00E*4o$fagW5mA;3p|cln^o{Nv_#pI5$g&`5|E@7vn=9RYxyv4Hn*23o z@4Y*(<*+&5{QETMmG$e4gjw%nKV06@qQXRTHBIZ?!y9z)9?~jL*@|-E&_z#teU=_7 zQ!}L4v;=?cF|WpdTq@{vJ@s6@Lk0bcwJtdJaNR9urhG~qu(RwRJqFiyA02XV(fBZz zY8N)ko{jeIYvMG0O8ojI(O1s|XC*J0bMyCCi@PofZ5Z0=VUT%2r2ohpgB#7M-fHJB zzqaZ0WW@Usi|>D!W?uKI?X>Jgvu5kRG?)p*s!=pLubHn}u8XvxN> zk=@GJpKNVYeb3}iAN<2^gqCbtQy+UEXvwU751x;?SeBm9;e8eEcUX{~Qz|3tde;FX z7Pz15alFCdr`reSG|8$qz|u*dvM27%p5kd4{<(dWtre<&(Ke{nWI|x$b;UY+e=Pp# zuW~geC&zS_da?u6?Os(Spy8w;Ph1w@R^sElXYa zWAd+ChIRkFO`$d$>e}{CnfK)LjaPg3hD}+0XGDoLo+C~*PED#fcuL(yX$h+<@0fou zJOBRdB2TVeTrd+K){C?xC=kGp8 zx+X0z**t7m_kB&P1+@LG_RN4Mn-?eUJ3MAd>FzC_9gWI1d1RFySuCmVyK9NN$Mj5} zKDmi?_;au9*vju`-oHOL=S8s@m)>>T+$x~j%yY___1%7tcosEslgIE)6;^gx)bEp* z_tkFO`#pXhylwJxQ%UppV$+M)-QBXaT;Ge98v94|rE(=FMXf`7A@bZ|;!UFg&hV*$HXQ(yJ+*95PI>+jrt^n72X{X05%zj)Dpz`&)$ z^&u$*+vPD^PFGxddTgTs8yj8Bs8%p?*|jkD!KF5M-#FITQ+S~hS*Qz9^oG%sA;^V%=UvFB*TZUbCTl2vqEV0ejjw$c%x_-%1YpKB;3B3nbt9MU#9XdW=y1N)|bk6N*Q~n z&o~kom5>^>bAF&}z z5TdfrGX=6qv!6}Oi|`@JhRr-^<3 z^J&eJKRjr%!15yP(a~-phZ|0M)HXZ`Ui zyl3SnH@Y^Mzar0>)os-04{0m5eBN&HuUk*s`frUnH{@#0wbBa*r*1EAzS?zC=ka;6 z7F0df*ZyJSmWeGI_;y@7X-35ZlU`-_Dc50Tw^o%lmYCea&~dwd;LbRuv(xsrW-pizgV^Y=U-yUrAS5#BK!NX7QaXB!q z_{BnPPM6(ztw4>|Vd0Ng?(OoXxJ&G==)Zx>Jgo;SCKe0|={%%tvL^_o}b`)nSi+PvJQ=-k2m z{nV?hRYy#%kfy0zZ@$OZ9_wqb8``C&`^T2iGasJqf3=~Hym{C`Ly4Ksc5bUPzE|Rw zz=ONT?jJNEvg@X;*`G?qUTOI1=8^(qrm5x>c3#xKK$UCJI;G5l>f3zZ^bQ?9;>P)} zZ*#70+*^6$suC^x)(Wq`?P;a0cMc@gl`@}x6!?YdU-`p^?cP@V2^>y~$ zj*mtr7j_8^40-!FGQ@S?g=@{mK5=Q9QsiR5yzb3HBTr~7PV=1ohNiSqJ@DL~RcupN z_ipJ=TD;u-_FK(QtCLfs8f8uM8aQ!D7o~>po^x9|et#F18}RkP;~~SJ`;Hu6!q#Cz z13%3@qfsqwi9%aJ*J>IRCJoaBWcksnOy*>xsEbyC8?aX>#l)>@& z@6{i>HpoR6QJ~AHh!gdTR&?1}@zpi=ed`0<$6ily|N7ANRHKic8Rd?DYgDh=TVLB& zZQR+3=MK-ZMczN@Qfa_3pV;J@1KZfFUJu+Os%@w%dwhG_Bmbh?mqrIJRss*aKl%1x zxiY6lHQ4wzdGP3yg{!~VmF4wOu2Up(W{17e&XRqJGM0QtlQ4# zRJX4?*Un8{Sz~qHwSh^|)qdNyv~Z^T;i^^gYBN$z4~I40SLW)M@unF|QU@*We#Lu0 zkf}n}MeBfXdxyCUUhMAMKX{F6;!Ee2^Mj5b@UFal>tv_QIj8SSugWaHy}NXwH>2b$ z_Kk_1p6xU#8*dfN=wGGVwpvkH>8EoxOep9)Zd)lA|FWmtB3`>6uF>FDxi1TAylyyS z;GWdr4Xy8&3?6XhRP$vG$C$1cobm8NmER-Zk1f)yU8?27i>-s(&uI5>cma)VEWD+HT4&;=g3b$LJN#NwYHY=X$#AjJWr@X?>5} z`KA}{$rC$o$bHm5;OMj$Yv(tN-}-5je`K2?&H?!bFP66jc0IoQgwsp6KDotqH`#Rl zM2cLXTe0E8#{}3~2Azq|t9{Y++x^G8TSNzTzG*t$>dlwkJDc9=9Q1ZTy-uld4{ELY zwLzdY*IDE0{nW$kG~TSsjju4gM{eZh_fN)sJi2go=R;}}>!K`M#ZE2n^a}L#c z5dG-$t?-rZU2V1Af62PD>&v6-;dRdrejJl`f9UJ?MPtf8Su!Je^r-x41@8SeF|uW5 zxj7^EkMRrgc$oXqXIay;QMw6EBpavA@q zdA0j{daU(%QncGapZb2jd-oOD@uGBaSC2#Wq6~*0_Z?k4q2=*2Z;sY(vGZVyO-H_l zA0J+)drI<#%3fzC?3uVbY+qQ|tOm~qUo1UgL2^@1%_2*qfeS{If3x9Hd6(u5HeFrP zFTbCzU%yzNV#gOL-P^7C&F|29qrH=FpJJ^t!{3%URC#Oljp^lw8;>@gG}8MkO^*i*Z+L8EPSHE&d)@X-@yvXcxxU>V|Ei1ou8fHH9Q1b2wEN@g&dhyN z{z05e;+cA-{aZ~)I`}B4Y=&yBQvB@PN6vSud%UdNv{3Ac(N)e3Y*oFjq5*a-248G8ca#cI}O~@0+3edKV7Q9UHscnCMjhWzhq^{Rf3j z{~mv0`C9vkM5 zn5%edyvq)d2CaTJ&8c_ycayx-_d2;vE`5E&>XG@=4=#J!R`v4bVSD^$r-RX<$per6EHlh8sAyH!jYqhOjytw7+%Tw`%AKyJP>dUb*DMvjgetzlgJE@&M zzej10pv+^T;Xb*Sk6n)H{`&l<4*91}kG)!|ic&kfZr60zs|{{dyncORxutjS*PmGQ zWaF`qV-9Xf>e+Ux+o6wZzpT>L3M!xNv(jnoyN@vs{pKj=-?ZD5?`iQ{ch2QMmNKB& zuGbT{c$eC9+AsZM><#a+dB=nqCO>pL6*e>X_LTmT!2xR&CvPcfz-d{e1Jy>XLS)ly!Zdb}19j zYF4bQ6yJCF%o|IeHZgCD{!qEZu$mrU9xwAP)3bQpfcuj-1}wca=d-6V=k?StAJV;I zysCOudN{YYI`#h6{nJt4nBA@?Nj6TGg8+1$GmzwV1`dd_U2(- zTyGv9kP0#&f?cSzFW*=BNs{OG?_DKcv2lk6i^zB=-b>7j}%0)cOm%V&&`iHo{ zUV|dp*<)v?PR<&?V&J=GuG8LR1pgX(V0+yXcb~3^Nb7oH)421qH*bzU?AJQ$*FBYt z>8&0gKNYdIiAQY@bFKH+mMnd>?##6P0YToAWY?BifA(mb65Hl;xyP1b{?V|OH-#cn+ z{@}EacPbtE>tM>~-#e}fyEV7ai=g>i3};_m^U+)@|JS*>uPf&5*d_Glrusb+U-#?w zF8JQ4BWHt8ZC|7z~7tc(^IamURdZryZ&EZm;NxO zQ~2li*%$ksTAT0Gn2gCj=UQe)oLki(IDdlYsi;!Z-s`^VQ^l`R>8 z&-}N2+9J=cG&SQ^{;PB5{`RHix{o%u_nS7Re;@aGSoGm4t!{X4uiHB}sdKYBE1k1H zdoL>;F>!VKy)!>mi|E?AZrgzENgJl;TpIPTPupJg-smgbQ3{W#dZWmJaMPp}&st=R zO4GZzO&O9i>(}R%rv%J6>74A6GV7s#I2wzx`n z9zIqL7=K}9#>E%k^DRt0sMKD(eSxoW@~(i}U;O7kXz^lp`-=YCi`-EU`WnBw!T8`? zZs+xRvVEq!JpF3c>THjeIqO24%PqTk@mTDQ%JUBoOAHP&=T48$ykF~Cz9RE-W=?1r z*mP>04MB@6Q63{k9gE56o^@x_+xSYSH?;SBwZX8_=f&5S+0VVMCw{&3!6*Fev+?`t zPHYkQ_<3#DjlDjv-Pd>ial^z32X|IFQaQM5|7mrNAIpXv_dT6eptICypSec1e7Y%R&w_Bplc%Ec=iRv%kAt#R|&4--F54^C_K z(IsEk18H3@hd%SFaIa6$$5&;v)8aCunGef`#f=%DTJb3>F{MDZ+nwceMjT3Y9eDN6 zO_s>_<9th`lxs0|`;HCvtmWgLczta?`u*~;U;moeKDyfEPA5xETsTE39B*27$U}2F z{l@!YF>8ipCLj6q^hNxhF$bUAJzjdylyK$Fw1?X~;@4YUymp-$FJH;ypE@kr^k(_h zOON~p1lzk6uioL049_8Rmc}hz>i=NMm)vR#TVA^zSt;OX$!3G|t&7lqc;lWrtn5{{ ztMzXcEFTb_eYAg1YobrCWm(6txTq-g=)EP}$9$f8N z(umbHj)wZmuY0?O&B(oauy#;DvtK`dn)E)yv&TF4<9lP5dDf0ETJoajlsX>ga^6On zTMP<$Sm1yuaMa@pbt>hF9rPhKqvo8 zV`nC21XryYmaj(En^B(@+47eRpK@2T{G=Qi-EQ9exXCS>xOMh*inuXr{Mz%M?6UfqK`zd{xRm2^vxSmgnIo7lQl-SA8%rdtBJ!<(t1nUyutv*1eEde5|tcsFUl; z{>6hesTbTP9c^GZ5>naN$amRaHN6vz10HpJb7|}!vn)3%X7mjIt^ECVDP0#=tu*Mv ztu~FUy(jj_KIy*xkMu4fv)*1_`Y7L^*GfV{MAbTebDDoupQ~JKkoJhrr7N1fQ>>@o zZVV_p)46lkmJ!7oj(KK{tG2p9g*sDadlbAFbX40&aW(A;*jJ+23caquuwD7euWOOJ zwdsD}W`R3*H5gGu^CZF7Hvf58li^3b_Z3MykUlE!RsS2$9`Bjyk~pN$iQ`$bDyX!@ zXB6yV%RStAjiz6jE#>DPIFR(tuhW?$<3kGmy41AZ7PoiU!6fb2suzQHj&`;2j+<@WFX^t{(@>G+x^le3;4 zKOMI|vTBWHWB-g^f9Ll{=%tNaY78AbW>+bB+U9^2t*S5EaAm^w zVnx;_EGY9!flaxQrN@N~52@u`G@_wziw94>{24Y&>b>dt^W>nBiJDT!d`|SP7~B5M zi@8nKj`7n6p1DzG-iIb>SM9^4qf@SjdzJH__UHXGn}=obcN!oi25pUoQezQg8yhYoaIJRx6H%dmmLv+urH z+NSiDcYR!3-?q$L`h2T?cZYrRqx@Rc(>r}MuMHWSy!`yk$Ldnu*PX3eB)RZ|4Zq$S z6K9F5l{n8Vo99eJZmTprmGv6-Syzf=iio^Ea z(?3Q(nsDo}eE!hxEM>|(>*I=`p;=^>ZUV4z~CdHg;5=zw(Vb zF~-O8?D6cFr(;*EjZcbqtA4J$K6gO9+EJyyf9fCP?G{+2jbGuSg$I=>x&Hcj*L88x z`VQ7_&r4UjcjQ%vi&K7SSIw6GI)1lFpR>@Xv$Ssfp?&~iRc|2a7 z85>y0Jt8N^WlVN`*M<|<-#Y7k=5mz{XF|iTdI4{ z;0^UF#jL2&Q9GxxQ@u7?m)OFmnynB!cdUE9)nk`>%#_w7)o^VwTzVN&azuyKLk_kG z`4Ty4%Bj~6LN?AmQhHqNULDrId*l>VXl9Xf#iu@PVP3a+n{Ud5KPA5_t!u6u^kUTU zm>Rn7N(cL@?#ilWQ4Lo-icCm^A?8O@nhv|UqQ-D-(wK6t{VUG=biBppDBaWLvqyK$%`Q{fxAC8k78ETKw&-Pv zN8xwd#dLSC6aHmzrd#*^YxB(ZTb>>3{k8MAK7C8y`Tc#p&dE*Fr>~x$8neVFF244S zdq%(i252CT^QaYX?`V)aL> zzZV`fNadE<{rBsU*@u&z2j^z?+qmlM=zIMlKCTQNvejO($Np$n)sW^rHLXsZUzmQc z)uZ$ZkA{CdKjOuiI+csN?A>%N>yJm*I$Y`HerCtaA@!wMAMS1SX<265&9AP{!aiKD zS7uUw;|?#Ugp%gjz3zM;CU>*!>vTGzsOsFS9*^et+Pp|zsAy94P49bF&hy>5@7}$? z)$9LIS9z9a+iN5HY^_$i-A)v5 zzwC>sJ*8=2sea8)RvUPDK-!rPDyePo%7P~dxe29S)av&mJ0V>v;SDlr+MP@eCUz0_T%LPpB68U@%1XO`E8P08TXm@56?Q9C*gh2i=t=0 z4NrWqH>zs`7wN9P%F;viuMZmfsh-@qL#-}eQxl~t{U>M*x6+@OTepr`JpIuhXM4VC z8}+qQRQvb!Mn9i(FTqxGR%54;QwHqXJ!P17?x_#GhQ=nBx>agV&8EZd2I1Q}RanX6^1eWiEQqv!QG2=?gmb?4ECK$=P=T z<7&weu4S^XDIn9zFL&P6>Z^JjBcW+Z`o-N&md@^GX)1+pW{llN+~u-+m^s zNT~+DT(dYAwEbFDnVcq7NXqH&dh5xk`RUGnE{})&cKxnr^tiI8>*sy)a?QBU&0odd zj_B8^^UU1#XZhE*!|yM?XdDpQ>u#U%JA9-IH!l?!e%5RJRPUqra?OitS8Dq@f135W z*SwsLD_1XBJ|LoJ@vZZocg}Np-=~=2u@UR4J}cjC!52;cr_2A6_Ffoy?^9guQ|B_q ze3=ju{Ooe#$YI4NA3UDDCw%ey(YAKga^|H9Ljq%K{Td+~eDhxFW;nf2F=9;q=_{MNVn^DA{5w(j!z<&HLQ z=X!ly>3n@?%_4V#-#uN^W?M$1_08*gGB4sngN1y* zyA6|Kym!6~ca2%n=WImWwAKfwzDwM=<3bb9`!A~eUhTr9-nV*3FMaIYbyLT;1IKh4 za^u+b?{g=Zo#Hzs?!CJs-_g=eX+6GOJH2DtzA;`alMYT_I%$6FlD}sGP8E5w;$WF2 zk1zjrVeqI=>HD(W3h#ctEA6*!rF%VVH)Q<6VL3V72E@1c(&xmYRxg&Vk9&FchEGcO zS{c_aeK_jr(Jbe8*GA!ACVg;!wsCBOl0B>44r+C&_KK=~-8w%i>AxcG?V-8Pr(T-* zx@O&``TAMzfADG^{(XjPqZVJ!79P4ga`>mWuODnW)wkZxEuBi%xG-bSr~4tV@|9^c zsjpM*sy*)R*u37e!Z%f;^umpDUyl2nw##?Q`!?%ZoQOMp^!14%(OZ4D%{cMt;FG1} zG`%KIS@uWXfLV_-vr`Jx3tY2ihTFE(@`a~&yXC&_@Rh^szu%lSd8h02L(@04Y|;E$ zl?rj65*k;0o$lAff5Ph}kIjEhtM_F8_ZC^6qc$`>GWdPo0cX{RXOG%7cgwD4k**1) z4wp6Few=scX#JaQiCgc7g(f!)UDR-CK!uR?*8K~m#>2neiyQR5^{=L+Hnrw8{AFn` z{fxIR_rFa!kmvrEE0)T`di#5Zk4ZW|KRkOt{%qG*=|#Kc^O!PVMzvCtQ%1)W`tsOy z+v&`4MP9XSaOTjP%zTNt8C$l6>jDN&&GX>({NgzkpOvZTUb{&~>H2$H#OA+t{mT9! zukNOGm(RRya_`&Z4p}3YNqzmEH!|IrF{1PBKLW1Z7*e3e;yP;!m(1BXs(Ykwoh4q& z?kDwX8J)Cxx7xqt=dW7|Eh`K(4>W?@EFh%4bhBJX|s4!!y8nc^WS#As4WYxQzg56#SPjm~p4*1B?kJGr=}3H^emlLT6BWT=ujozRc`esHjU@mYn|kkb*5UpHl!Qv{@%jCD!C_eAM1Jzt9NG^a+p zK}9BxhWudj>l26~3_V|_=9MAT+IP3LRS2(DFlZ1BiV+BDr9NU`ep-oE6~Dao{N!uJ zD>l}22tcTMBwNG>)$43)k;=5|CLA@~yc9Azxvt$E`0f#o5l)6(KCI%QdZ)I#TCq+! zoV|>f|76?2Lq=Nlj!bSMDAb$3Ysjx16yH@GQs<1>n-zu5$p@R%Rsf;YdEJ1Dgqixa zFE>X*>V!iQd==`NxwQsR2& zHrAi_e#MtN5lAgQ!LmmYyOa4ly*6gK!>Q2}P;+|C$Mj-&2(qFmL2^1YHT;$Zs9tD> zw?EjT%e|?2ex|!uLfQgQXSF*1Ne7>x-`@?`j8gW6fK;{?9opX!Io{u?H4Cz`<=U5H z+f&o?`z(p-sdFdo&Y<9-To&8cxHFtdw!dzGC!)#3;f&&e07VL4$l6XSS+UXfcdq4% zVa}a*pWg1HuBqpS2(A6O`>#GwRi)PcyDb1u;3W?PYb2AMv>kXeY7}i0UjQ?wVkhyxj?3R>hvID6^ zYG*V=2aUGkyQ8nsa7Oi{+cI+(WVC;!JsF&#tar)?z4_}M_MEG(bL;Igd773gN9OXZ z%f(JZv_k8;%$)7B&OiUX=Vr?!y8s9w@tX8U3q2E(y`iY5fQnXQg96d>d-uPYQ++>_ zH%>;4-^JKP>koeGwKvzz@ZG%DQ1%I0dEQ4b=jsnAJquRP(A$EJ`Hrjr7nMjP(c_y> zjQr^8=M>0Q^2ZK>l@25a|LM61PC|>2ir59chLE}aLl?i zjnT@h$Whp5yOOdQYHrZpwP0uTLYb{vuq#*D^2CnjKoXvE=yG-@wxx?Zoq%lEUL}mX zpyNPE$h@hR1~FM7&#pg=E|IFI_A_nOQ$4jd-jUm#sfy%_IYan9IE{&>-qq|rqm$fw8 zQo&aQKu1|83v;8M)0}Hh&S_2LRF9}$06ax<;Jn<$+e(U3b+iPYcsu-^c$4Mf!rmQ| zwwqh+`HN0-p!CLkdHuQPd6VtloT|#Vr^e4c z%VM$9v!mUM{-d}0;r7PV{QJrin6a7^fZ}66TK87?3%2=vH!SnS&v1@_xPqv2{OnuxffhmRrO+?f6_o=OUq$+D4@~=h z@zaab?g5GFxt&@WBa5uBkjs=3LiEqsNpbdWB{!6vlK9qZ(S_%Cyq2E1*He*9w95H$ zW&eT5yzTRQ8f5q-sY2?dbF3i#kNooLC$e1&I`&INc&b-+o};RFLh7TVce+dNxQvJ| zC$wEqx3jr7Cy5Fb@JW$VLHbHvG?#1dh~7QXyzl@js^;V9Do{MyKB=Xo%89x_=^xb6 zKigSPH!?)zFTl94_@dp!q9wa`p-LY}gTPbq70=!l>0I)v88dQtq|e<8sM2%i`5hTT zPdEs?5sPQWQjDNP-)x9xyboNO6iA;+eIFo1I6Qmu#h1$P_EzT=q2j@B%X%9rFtbth z3vWW=}!$eaG55#%1 zRew^=#0%bY?JQ4K#oJ&rBL=vm!&rv2nTP|g&%NT+q(3uR^-MGZipX`&u;H52 zO9ydODTG&?Ya=`rPkpU%(w57sj!v?2p6dJkbF3J(hkWY&B zd&8a@e?sosw(cWQDWJQ)Ts@pVZ?2nHW%{4KQG2*BVh&F^dAFjsmuf09(*975Z3wmW z{%L@R9at^lDfaVTgPq?sNzOMtABjwqD<3>(%P*?ad;I*kMSzEz+jQ{I;i=-A z*+l06GpwR&W4dqcY0XD@s&IQtuU%Fr+;f7h>e8veRC#cu=kTI17m7L27g2-#-4Ig6 zvqJi%J^8~&1}}h>QagKJeVmR6Dbz05Io15N?+>p-S{c7rv$3REyj2d=tvorKmRW6*g?XAR%GcMbiJ2tVSxZUQV+>FcG(G)!B zG7S$;mH7qpqv@TRF|k-Ec!NfQdsgo5L=)b!^r>cTv*Xpr_kr*QYBzXgzpPA*%+D0} zSSrE?Gi@nIP?&x}=bKD8kk9yoPWKOotEkdfikXI``FXS3jlJde_kDxfpLppNE}0FU z)h0bvSbL1%Em|~lARm<_cgnoMtk4tgh^MH9P&luR$a8I~erd^*Af<4vJ|jEbIPmDd zYqO_05(SKIBnpa*rq2185_u~(M^Og?CNV|}yWK@}$#D0;J1qfn>al`=&G~)aY-68% zO#}~h_q{G^*XFMyx(;^ zA?4Ks437 zGwKRZ%)9~MM1q8};w!#zdpn~tUsv5?X^w%S7^o;9n(gg``C;l8p%#<@HKwB$-xZ3X zZf&$;1j9pk#~!^@jHPb-|Cy_7UAQ&q!)zIj+NY*7U%LOX|JIh;CsFW;?J!EJ#0%BU zb457YyS+5HEK2pga{VE6! ztEdR6+Be;3|0K4jI5qT|q4uXgRFuRBVCE~n(&tzd96jB$%A~5)GPx(V(NqA%RIGBC zwz%z^_I+2l(`Fp$HULG-1Qn!;0ti0>PGq3ooh6l0PG0}_wua^+a^Cfx_gtI4w`W?W zQoq+X!zEMoZ}{8a`bBMAcv3>Q2A~MNCu22Exf0VtJHq%D8svQ+V2w%8f;P2gCZGPg&)VZyRZ6^<_&)8Tx<)B|WQYfkX zPa;b?{Wo^aJ!mQ57*4n{T_1O!wV!(beYG1(AtDY&IkBJ&_^9%~K8HMNHZvENjLx(< zIAN*!$EdxZ%BvC~ORBI#f{KMv0W>sFz;_1TOedp=W9}nMf%u^8kk5pYc-`S&12MnO0P3_fY`jFyJeSfghDl zuH6$t8AvimzQixqg(lLGTpY(cdRFs z;Ye4E7S9YWvX8Iy)40FAONg0zNtv;4e|hx0g%64%XVrbqZ0eGWch+_UL2c10V-G?i zQ53&#B#ex^Q+?qeZFFK*&>Al$@`Xuzg34(_hCQVel~MAV3MhW-taZ#vF_Q}nOj~z| zSh9aDiEfW{;o8Zub4F|K6(_77XEh|eIiD0PZhE##in3i%0Ee*J_G8!obN&BVzY7V0 zgUpo8j?!m;lmS10fA)KxIuf0jD7UN2g0y#7MZ@rwlH$v_)+_wJ(!w0}f6PkmdPSe# zQ++TbO~;@U)9LHB;0g)SkvIn6NP#rZF2oxP^9YsU7zz3RS<((Uc2lafKcHa6beVT3 zi(10ll7BbrcUt*~b+vpEP7o>i%GoA`bg9S$qP*t@5SLwMG#3g+`#6BGf*&l`g{xhH)@{8MP2p@e^??7VJ#hZTLberi0X7bXi0a0*P?ZDT1_x zkrP_U^lBT$QSd6#wtZypW(+275Wo#{GkVCx!IG57@8r@Y1huA=y7yRC_rA>cO%b1788vnj~77 zT5g3rn*iLMp`K7Euc`U7scEjRvqx)C8=jIw4p!=zvcTEzTdwK*OjNVvqU01j6%gL# zzh8jX-bm`%(i=8V8wF=di;aL_JhdRynByu8!;U0~nKM)t+DE z4M#iC>go}59DT@_@s&LoDAT-hFEWrKdei?tBd#(^0iJZi=>1$mb|DN@6s=6|iV$)P zweJ93U$J&U^bqV89V!S}LKx(T4)FI8h$!WwmWpp7k-D4c;!IKu61}JeZyd#>?jSXh zK{d0DFl5X^;zFWpdh3&8Dn`&yvZ$u1K_;M9Wzh7K|puWabsXMhS&kii*>K(|~} zzfhh$^UF5S?{}V-8UeyiSoKh%3PIfG7+?oj>cx|;Sa8u@Aq7K~GP?uk1`VgLH$>mn z(qk4bp!XHI>gb>ctkuVYU|xV z7i8ZxD-r`N%Gao3;f+dOMRkN1tQ{A=z*i;GlL#61z`!#ALK0PRPPXXzM4m&)esz}) z7>?l>4z8eB9$VHRiatb!sxo|rXwmIp;2@A7v@R_=#^Sq>+bIlG6Gz&*O9IP1gYCDE zH}HMeB3dj|I#n8#hz~EI8h-yiu`+)`VLrM?G> zQg;P?{GJ4s+uwUM=x7Vn*1sl(juHAoh`~XC=xYNpsT?CveGvm%8deUg1TAo2X%~Aq zmx&czyKylwDAI}&V44o9JFt*g4G8Kq>JIHPj&=?)roKz4ioH09EAi&N$lA}P59dytp%9MY zDMtdQVNj%1K@}BdC&9X)X)#UWl2j~CI3pp^m`4-@=~LKiuriC4<2F{23;yp9ea1(4`uD!dO`>Ba_hY9@nd zS3Gr{TAm zSV$}AN_{23eK>~mUiSrnME&cW0auX%J(=y1T={~mZA^5$s!#;2h*m@!5UNCT(OloH zzLm6B@qBq>4|OT9l>xm2v?9?2q=>d|pWt*Oq@H?FzPt3Ug5vY%PND zDFQ?jU5Tzf=Us^@uX_Hf;9X1D{QOlsuK~s2S5ZTwH0yZ|Ges+$T({mSo;i&6D^iDN zzxa|O+s~N-OgZZG+A~3Kt0^+sN5v}OLkGK_znw1D;6 z(h$|ao`&@A2f&t)_WvjMTD{8=26lLq6206j)=L6{dlQ;4RowB^8_|dg5n~>lbJRH>Z1lDo>JSzM{M@dqe^b)~?uZ3K{-Elc zKvklN+aF86?`a$#1*7ZMr%9y)4l_WNvH^GYa)6ifa)3e{sYCUkAo#Sg)5ijOs#n_? z{0v%!p$@!b0;UI(0cr>e+dDfUvM&O8<^nd&z{ zpL&|qO^>CcC5rHg2g^CYtP{9PHTb0la~*M(Yz4CfAha{W&bM6NsrU}z!m<~QbCnkI zhY5ZnvdjSn#P9unBsb7&6d~C2DdIs`94b>q7d)N3-Zy0y8YNGcV8?mfqs71e^9Nms zz`877zvq1m9|tVt?WW)*pT=gl8X7rMf>;P=&Ja_eovAO6wxaVY_8F_ zs2w*NnUEJo{)!h6vN&4MrEUtKO9PTr=5GB@zy7K9Mj~|+_wXQOhL^NIaeedH_ILWG z#q2t7@CNWYpkjJ~lS`y3tMwhglfm}d9?*Nj0T~xw-p7L%kit59yAm5zqOKK-0ZB~&CKkpz(Mv%d5`NqV%YBJn=PghR6YHJV`oWk}>7m2>&#WSgC9|QQETP7j^6e^s> zj^LvtAZ^ujEBSIGF_lh{KY3FrqH1~1r%`lu(FCLx^4xdqH6@Z{fKaK0lD1~z^);XS zU*4_Eex6UfzV*1!$Q$H@v!Tii%NfMxGM?p~jPGJr)6!k%RoRi_Y)8}*eg7!4Q~_a*qP;`y?5Aby1a5N#?j*m zREqS|TKzX`-g*L(yC;_Tkp3h6Qz~7<&Lt>@;U2R)!s##D9ioyh8XR6H@vr~9qePMb zH+N-F{JXvz(vS0ng&FvhIGC8d1&s3KdB3%c54|DP*zNUwYKf@*o0!A{=*Y~gh0RY? znLnDSo2Ckp2&c0QV#KxXqY#b9@A!E~DVcjd(WIX$saB7 zeLl93Sq7M)?1q2C7{GAbQT1sCnxN zLS={2G4U~O`d)YU9g#ePUVlP=$A^C+&wPcU7;+g%5fZQ?#nG?Z8#;oFO)7J%lU0rT zllv?DDV0v4-+MIi+5esS*Bw8FSZ!x*o-pD5(d5Jdtm^V!MrW*dLI^Q-G%t}r)3i>G zQuEdm$z)$ftD~di2cBKChRE493_EMJBSmND*X=bOwZTJ~TeCcN|M#5zgI}4;dG|g% z=kt?#SMzdUp*q=$)JZqch_wz7X{#zg}zCqup;WYcasED@C(vz#Jn$l}(D;XovQ7 z`(X%WLWC$WF*I`??A}ku58y-kn#}*QOQNbb;#TKo-T3&vV|k`SwTY?~4F}}e#t1K! zGrmQQVlYZN<6r-Inj{%gP;)L%9}6A-KY4E+*u-Jx{eMPd-I8s|muw@j4YmOTp$-t+ zxmr@1z$Ojpm2^|ubkj|mw7=c9d%W!yy4jbs&A#1jw|(1^w%fE@njT5Ifh0@P(j;vT zW6p4cZLo#qL%t+i$BeGg{Qelp2N+_oFeLBfz!tJRGtWHN_j#W0GZuU)Tf_%8_y5&^ zyujx0T4Gc4uK1nzKYA&8SEo<(4GDeV9Oh~uX^c4W=}qykJG!4Mp|vmvNH$hKUv={2 z9m!hZbP7y6_$)u8pG{G@mXVPcM`q*9d}C_o3qKLrk_7rGf%ro4=VwcfQE)*&s6Jd< zM!)<7n~t!&%Gb1Wa`(D!S=R*tk_+pd@hBmP3wryofy9*+oJk8)*8It&e?$`s0*IEE zyKw#Zfzal!c(4_)X6Hq@qELAzZWE7i!x!}jb3EB_SPk?TiWz1;sX<l{*VZ z^^*>>J|XILh4F+GRWXS1g2D6cE*x8JIQ90y99ujJBG|=3p@)=NkDT|Fr*}!lT$^Sw zAM)=xHTk;2wozB?^RM{CXf$eqWKyiW?oh$8HU8I3fynU3{{3$Mh()%}8_^j_)dUI$ zk_k{O@@wiPhFf_e0j??$wYypVOa7w`OKSaRY_=UPsp(J@=HV@F`Y6W{K- z@Z@qlp4~HipwrOsZ?tRrqkAp>ZIsc+pBQcQ&r#L_)70eZdP{ z7mo)@o*3x4@S|zZ=CkE;6xbc^bf7ZY$W!MSOxN(*z?LmEGB7YQ0@dxv%6+~(`xA8$ zViW)Z-B#bJ{VJInt3{7pi&FX_2R?Cp;m*vULB?PPfg5V#2W`@bLb&ySlAJO`sR4ebe$*!;hX=yYuGyBgSOsK`R4BQe~q7VlV6=}E&jbw}(k^Vwm4AGlEmKmHlRF}5+n;&iqnE>cxB-B+H4qa3(j3thEHB`l7f zlLHFtKd~8)r);ao`;*3jwDwqV`~3C=NyA^OzbEmj>q-wDf&{~gwgBSN>IiBoa+O%j z2s>SoM;zUdqlu2j>R*_glhLvP3h(cV*Voqr#l?VnYF$2$mwZaWzUanC(_(x1K=7fK zBbV*CK}`N z#mjEA+nUCr!}0j++Dx#-!(mk$WR6CF;jcTC=EA~E5^-{Y!SA000Y)jj-?Qbh$3{14 z(gWH~u1gXqNuD`C!<{>F8;)4}wzzcYfh4IDf*@e?WmS4@V_&T`+s;8T#q~e*JDao@ zyjwKIvjBI(W4}1YpYK|bI1rVC(`4GXu+22622fSht3dTk#1B{J#Olc>PZB`=Lpjgwa^$wr_X)^6bWY)S%bJ5jyndiP5hhUyAIK;>-EP zCd14&%Fg6C4}U-o$?AnVC;qX9aVJDsr+~-f@p`w6)&uog2DfhL@e)>B(BF=w;Uk$_ z9tccq@?vJi{Y-aJrfg$#mw-$jK3o$V>ZohMCwcf`Klo{;%=44R{Cx9vUf!NQiPyCs z|J)t7oH43o426SKBxY0?Ir?*Kd z&)H??<;?T*O)2I8mg0RM(<<;^Sa#89G-^Eh%^a>!oM|(p8ADA@fVwe*u$ngj{NrjD zEKDjtENl8@QxhKe$)@`B)U|>6LtQ0Bxi{qgp^utZoS~5|2qL8pbgHVVHmuo7K!1xF zxDl|q!N7K(rgIs+8wECQ)SW)Pn}=bstD_~c!?t}~^-YeZIc{IQ>52YVv*7OlkdtDH zE7T`8>Fa;g>}4TPm?KE|$L6CnEbKvVS_zvx-lUd--(eWjtHGMC0L8T*=_el`8aNL} z%OxDendfI6d^q!=;e2pSO#DYdl=#tUDBeR$v47{Fu{bR_uh)wYj0I9qzuTDcpc%>_ zbtb(=vridd7;C4sWuj#lh)}5o*459i)iS!V5EGL85d1u>3DB?!5OmPms@CqXI|6%q z5!np`#u%B|ldK=<5YaZVTF02lbO8@(s#N_yBV`Peiw(S9P~q{fe`zayYVQ6PYZ^+^ z7K@yJkV|)Ua@$Jh7RDwXwbidooH2+(aO_(@{wBQqef_||T4>c!kYd(T56pdr5qV4(V{#>w?NT7%0y=nfQ z8TI(hc77MPSWK39I2;~ZPv#r9o&ANx@j12JbzJuz^z!h=q93JSi={@_tuwT?3W5Mb zAjUb+1mqzTQWYtHNkjQu;j96!V9q<|Wo<{o*wjR-zJ!4fZ!FTXiXh-sRkZ||^9d}e zXo30cQ3~mu+@F~cP3Ic%9Pon{W;%mG$OS*T(3f=^@nf1h{O^_aS6VX-ZjYCk@&j|h zh>fbV{HmJewv6-xW*avcE|<268N~vl0|VD3_D4zYN$`&S{`h|^lXSNlpFK3(s<%vQ z(Sh!w$ERlVu${+(=MYb;Tw3pf7yciDWj;x&DMKZS-z>&EcS7>H2Ra!c-%Xzo&cMQ>XqxMP(cTOm|rcusq z{E#1ReOd%QD|3R<^i9o!T7SsV-1w=F`df&!L;y39|DMn$f2p!Ft2To=iy5AzN<<}t z&0w<`K(CmT^yNGC!ygb1C zp(mqfZj`3<8`6yQ&Vcck1u0vr906}?b@ z$2z-S54yF1-*K9flKy_6w=vMYD}UW!S8!8K-|Gk>j<8;*>D{G?Po3P9>oWU*57W(9 z6=*vSCbZFVOV|zn`EYNM9MymJaed-f-}zoCFsg;7VqlLk)tSk9v^FzingM-AdS|&Z z10|EA%`_rgNg>c~7z?DGfI=a;4^x}FAYu8?y#mhxWcsv5fCI-{4>@#6Z}hUn z&pkW|zJlPy{G&euXO8BL;spoF^S~#O@3>>rcddBUymUh7`pj#iv4yqOZ^QWTj+C7r zAUM`s(>m^0G)dGzpZj5_|C60YDFHlr>p&r5YiqiTuWL|ozx4D|!N8|uC%TLmz9W}@ zMB#x6-)_e-*4;9ihYEMj^$qR+8hl&zZ~E5(Q1jB7>2i20-h1mFI;Qwkr&T{QTm^Mj ztLB15YlRNSz49z8ty#qXpOid=woP*zKRjgc*V z^KK)gDg>61(n1v>Thm)Pz>mK@?(hPviNjpn0&|5?cv+He!51ue@Z`GIZ~UvZ)Z3*c zgrlRb;q@Cm+jBerIMoM-rFW>_O>tu@fn>5$V;>F@j7DjtqXuw4?Cde>Eg*gI!GY2m zv6b9ht#hPruUr(<59Zb8i}f1An&U(|ikk^oE88ZF)0uJp0P@6i1<&nfJ8PWWV(_{J z+yZ!aB7Is=9{cBSeB(QhT0zZ3GOonmdp%qE%Re2Q*mv(Fz-@0pTs6H5{GIkpcjgpA zXHIeg?3c@JH3~l!L6Rj&O2{V({H`snbmUUX`dEDRQhn#q6wS@L%Td=Ck!3$*0!pdRBSY zCtvs(j{W6I2rG(qy>>wa^g69RpXDRKjTx8cX0Ir(iiX0LHL%7F>=FsxH#c)Lwd#WK zK<>tkP~pLMlXy{VeAAL$LJx*3GE6eY3o}Xcm404IRi%YTDTbjo;x+5|>HOP7)Z<@i z-HCWQogNqp@Aqy*EEl;}xlBwfjwN-~^O?V{Us=^ZzjUZp zY$a8br28AkTmRf@Y6em zunn#DDk_M6Cv=Zh#|q)4)eAb>stapsPO}zhr#f}tFLyw)ker&+v=$QAVwul)H?m>t zx1|1{oSrwgLPDRi{7A^UBbVV@|LJ!e5LhinPq&uRYy0W_oqe<~LxIr8EHA$tUZbFd zR*PxcgN>UvZ`!bRLj`Qz0DoG){NVI!Z@OtRSFh1G3W&-ykGHd+`7S2L4L|m z)qy!fcs~r%qJ1-^c`!%DWu_l*(|le2n!1^nYLqpW?UeQQvf$JRMY5*!Yb0PE3=Xp8 zb*R_`;Ca%c{qV{6n)ccYhP6j3EWS%*rxnQSUKo4fcR3$??t?k0%480#eno}OwJ&a8 ztB9KP3W37p{hp0@Hh>4_&ij*jGF94sveOcMcAKUXlkC{U=9fTNGk0h^ue1302qTc6 zCTTr(l9gGT_JxLjtgNRNEDObi7pYa-p(;PlK?r% zKYZ{x0oFc$NAkrx+J!c_Y!~;}#@Oa*P=XMoj&EJh8SmF_3 zrc?n!T6$v@ec3OYAzB&B3vSvBFNKer?_~SyuixK!SfvJN2cUsTJrOiDH#O7L4D{9( zy;PR4Oe>t44y|xbp=6FLvnV@#LT}OqMMGQ>#G)J_M3NkxnMCNVMd8rFp%3VSDbVRS zy{@%5a_WxfPSM&_*r6LqHMX_2uB*6qWR=IJ)p^CGDQOIzPs zZ5$B%{xr>C!@qhm()=d&4sa(;ot9=UrC9gL%BiR|`D<->d0>HKcfZfEVCk<{ z8~dyM%ld(aIa|_@&`3pEdQILY?>G9rz_Zo*jxt%3U6-l$Ed==J>#0k(nWoD@n|86~ z6%%5V(!kfFn{OljoUpdD19;^l@s?r+K;U`qNVcY<&<5b2#ym;-3(w+Pf3JO6kWh5y zES=d6dsdtQStMi+*+X^`GW3{%YX(xL=+{u${L-NsWldWRaig z(o9qH)(sCmTcoCG{IU~gssaXPk9}BDrTnOB6KvtQ4af~@504@e(g%-!?SI2cRsQ1m$!*#^@v&;A8Je4#o7upo+VYWUf?_$BT8gU)uz? z-TK`258PJS*||;_7#OI3DNQ%i_>)fW=FHvk;HjVjkM>1F%AuJ`C8fih9rZf<2cywc+shP8KITmTs;PONqF$eaO-&cRED22(u4-DEsm3Px-yx`e1 zL39t%+}w<2GdKTa9DV2#FF0oQ4ywIIqtU2>-|6hss}{)U-iy_hoomy}25DrAmra{C z;Y~Zc$%oG>XO!i#mn3BwGy8r0vEp4l29mmDGU>(Z#j`1G5yq3d4Qy?q=^>hcO*$$< zp^1}E@pnU?m@La!O_C(-*IR~7CexVoD!D@dfyPF*;CAB%JQaA(5uUT|96NV8fh8H( zKYVEMwb~@BS4+q}sieNLR_%YTx3y9IFU3$`P&_(FGwQLbShR`N?P{MA^jV+lZ?)!cUT8SW^Wa z4;5z#&*P~rxD3r4<>v-08XY`(5;BzVoaOzwhU7%=JHcc=v_ z3;CVFCd_tzhol-HZqq>jN%JrYi1hZZvYsr;0r*CgziR}3lAMSVYEQP79c2E&5u#lC zI7vn&3;EsH5&{VciS)k!*fWbIDM`E$b>z)W(p+(t!PJtwre>fSVC&b9W%gQRR)&UW zB)bp%=M{-F<64|a!SKZOIVLSl7fbfA$~qwC00w@d#c*hNg(j!;^IhiA{!2gcMLkfS zNQo9iDJ%3U(=(zWyPQ0IYi?8XAnWZ5!{ z)#@%OfxeQGk<|V7H<;|!IVIM3aJV=5A=B6yHEpFrli))DJOmXB-zxIx({n(X+`9GM z5@((zzvK56l^fO9$;6j#4MnM-q9QHB%<j;6dpr?}<(V`?5vBsI%*^F3@S?o7SZ` z2$Rx5F28xIeU8COdcaFWf;lHNrYxV?Rm{$(6X z^+oLWa0Ej4aO@RU(+;PstLxx5L_+oxlxCdWmaQA`K-2G<9)c~evVn#Fee`*|DU?6i zuItp9VPf`Kj8(LybQUR&U?xi8 zR%9abre^JbYg&*YS{?-y0Z?sOVhFW{y@y$?KUGi?z%&dH@Exn$c{go+H$zM8$PpM+ zmsR#D2VEc9mI9i2=<8bn9=AS3?Pq!X3%#3b_XuD9-tr?Q{gA*fWX3dOGm%~VO4kw& znXNRjvm&;hZOEZD&Ba5hL^(Z*&JdSDJ&9=g(8=Q!nY2KQ<~$jw7l7U-Jm_T|G9V<< zfOobo>o4eEQM>%<`s9z`(cjzy%U)Bh{ zM{Do%9y7A>HEs#%@VR3Lmh8O-FK%nWNEEZbf5D$ji*9JAScB@_$ za^G5>H^g>MII0c1udDw8xVz`fDS`SYUYOHuf!1(v(h$K6=YTLUi*3;wek!R3gDTmm zVVF8-$R9DM?sqz!OGObdSKM0x6&0x)Z=BnlpZ^(?xy)?t?H#Ee5CfH?s`l)wK>7P3D<$WG5LpmEg?Gx zmoJDB``{s~167rMcm1Ruw(y<2p0EG3mF}E2pz8esfl0H=!p!i@Kg4G@Nl=}E{EWUE zfN0}0{-*v~QpDE3*q@gQ$cCFwK0R<7&DMKgIk+^Rkzbf%1xC@*=MUT(>V-0o)*=qI zY^8Rgx)o~e?H`m^?&Z&VQzBLB*Xs;%2n)6u2gUoA1EJpc4<0mImbh}tk2MBw^WElk zCm9G{x7$UDcqYenjj0rt<2sRRIFpanr^D@ylk6}5mhdm5s}?fUW!!(@nuY4#gwg!3 z-zJrr#%9tocV^Yi&`%aBYzw6ch>w1;e$%zT?%FRO>c# zsccNy2Xmq+1@i1+S-6xQKS59gYedl}<_;%ZIcg|z?dbfFJQ|%>5DxDfPAv5FioL7) z^tt*0S2+XXvS0pl+l_vzbM}rzhCiS4% zB`s?fu51`!=h7qf1wp!Xdxw3&pKlqx$tK=B@97r~;vNnU3wPEVXa+~`^nH$K?6XCgn{`N>bG0@g_bs&j zOu3n^`QVOg&74-Ps-(^cRx!uMbVB!@MtRPlK05DAaFKfBORo@q#NApYDnW;_tYpop zz^fc&{^4i2tIr@LeWf0+1z3LP*FNz%^GiF|w0iwDZ87oV2&mizzp*DY-0y-LlBX4` zhz5OlHtTnB^ken9xJcmu03ZNKL_t)$IKhIR25=yg#H`<85LuEqTsp91|9)OATekOx zH;%9W-ak1(ug6q$h?Kt79PR6wzwP6EGxb#gu-EGb!#02-?N$V>KuU9Lwrnl3o#WqQ z-nF4O*IiJxqH)KkmOl6b|J8cm?-ac12t4`YoP!A;_{QnCLqp8{dElvb^&hqm9sd9D z{P@c^|Hh==b!^+P)}SKm^%G05muNGuc*{eNVP&VTG?}cvxrpdJ^NSp19{ekfE193V z76rp-7^(w<4EGil>2!c<*A2A~KJmL1Hql}m+}ggqOLw?riQL}mZB9Y~U=p;Jhb$32 zB>Eo}svkbs_ru4MU*CBzl(t7&mbCK4TV$wJqwwQuPVAc8_T_ftbq>KPP14fiqA zGT~VJviJQ|HwBsKrRiPFbVUVM06Fo!6%@6e&P^xD^mekD>)nc6K*V9x z&f!@MHC3!uB9bbof@6NWzI-_PMSbNyb7Xx_!Ty!|`r8*4*6*(jj6gp5&>nd6z1JU{ zf7r*ayb)0!fewLG^?JLBNEy9iI5!o3iiWv>`p3$Xj8YIy4T~XJz+w`HCfov5Pz6;O zn|M+MR6!Lo-)etN=6k)aI5Yz9+r3D(%O0m6dq0XcOO9xfKoKn=L`6*LaC_#~edp=Z zyJ%$Cqu_IRuoQR|L`z6a6Uf*@qJpT13W$`1OjPX4we+G2dZ8~mgIGmp^Uo@zX#jmf zQVnrKT!8Z7g7pT&vE0PU-lD;kZyd++)Q5ln@fX5oM_?G6B0lj+IOsI^c4?2bF@{-2 zOr=IgdByFm<+T!4Tgw0NX{=8MT;tp&Izt?((4O*VccX(M0!j$P%xi*D0lfb5++P;4 zt8wDgG>SCF{39`@UrI$BplaxC)N6WJbeJo9JY)EfwWZpwKUpqg5&geit_@+_C&9`haMqr}oz)6_H~9IW^^3x-_N9b|PQ% zwK*5p-V`^zqw9CW1*Z=l7K{6Sl+vNwS#U-b9Gvm0;u)UA!g9Ya?Y@&Stsz+| z=*J>`pM-Ug)Kfq|Cu~7+r!qHcB1I@atLdsWW|1zKy^C12GwifU7tyCGT!5y1x^;75 zR_o?*0|_irT!;%Q^py8l!_NYT4$-AC7epe0z)0nYN~e%IZLgRRdBp-a1W@RL2qO>y zp)C!7p+ajzTP|qnss-O{xq@bm7PaHrUE(zFWM_$#1wOGWeoP%VcTVUa&p<%>z{P#C zYj)ATq5}uAzytE`=pJjGeQ|XGBIsNNJat?F#5Z6v2xEDe%oGK~; z`t%n=lMl9;v}Zg@XrW&x%v(LjK+8f7{ z_K9VE%e!0eb{#&INC3uZGkC9<4O?IZE7sL^9P;ErPR-hPv{PlP0%whrc_BsGGtrEg zrx-7K=f#;tJ=1=tS%)JqEi~zbW@N*cae;d`P}N=KucIwclYu=8Lx5vMsqjj|9O`MS zU*u)^@}FBP^ftmBlP7?P3t5;qzp9T+?SEHQ?*w|N=|OJx&dZh1Ns3ryW0~9bAM1BH`LrSiq@tu5@TYB88NX;j+TCV$sqgp$PQf`=h6y zq{i&l-;Rqn=u3+Z@gslx+9D1>6jr=}=L_%S`z;r>6f9?&N#Ygh^V3qB@?n#Fj)%4Y zOQ2;vV11SqZve(XN;ekUSe9si9<@@gThv-*TfHr9k<2~CU_sJjh-YCOVFH*n!4j18 z{t$P9V1VM#^1Ghxilr=x;rQ$& z3h}T$q1DZ;Ku>v(Jbo3GlR~x8x!1DaUw-XA?dNnPeQ3CfFif%NIEwTIes-b+euhKH znBAaRmr7V7mofM07xlq{oS-=m7yB@_nu#8C0@hRGT@1Rz4?+OB?pVOlX&PRQY`VC@ z_jF?wVK)8U1x_PH0C4CBuhZn`@1rKOeo)9ER5sL}N9V2^{0zr$F~5yk2qJ_41U%e+HI zl_H|bZ{a}w)7R14tyBOUbOL4a_>i<5wh@h%Sm{{ZYy#}BjC(s#0W~wt_HN1%JmS3Q zbsVT?cVEN2_BTGSbGVklihXZcM$>o3EQ^aX2+KhT+a@O;s zh)e?0rv*Y^tn7qY%n`=&J0#Pj{7wKIi4gVg-wCkaQlaLW3Q~X{61gYz;DA14vvhC) zT|lcFya|~1LAI%22D1qTR3vrw(jMvVGne60by5X8}V6cBOZfBMu#qd&6-H%Or32;jSf zX+Ql8J(*~^5`FFQctU`MJ?EUTFy9m~8jX{8`OZ&(K1m=jol1hJ%qnY)`;xi<^jX;{ zqvXs!CPrpWR#AvCOf02>KvlpIh(Q1X9>#Xg7!xG%Sv9Cjnfj@e0ka9PSmKfR>^_hI zaCM6p^AqX~Z(e90wC=4QKc0xOuE})E)t|qo!j08xTi%B0gAVtywqvD_@$56-d_l*58G+@F z?xOyF--;C}jVa(fEZAvyG&SxiXB4YguA=o8=LzL(7r)uS5KlwNGk0Z29xTQAtCo#l z{}KGa>+~%9TxIl>t7Bp7!^W5~_5I&|#=!D}2lM2UEB1YXH!ikEXQs8+E9%kYG45m~ z!=5Yvl^vqno03mXh{7Gv3F_OPuc~S}TDEd?)20PSM%Qou^XuJnzWmreeNK7ssQX|r z=^Hir=AC-2bX4Hr@<&7S=kGHAi1mjqMs#|4X0nqKS0*>NSSbubMQa5FKK-4_fi-X> zrKc4tJItl)pSza&0~C_(h)C#@eWg^6kLFF~^2}*_6c-X%FeZD{MS$Pxu$BG?m?b`W38u3ph#j3hx+$_$Dyc&&7;WV`8D zrP!EI*D_^?TYIN#h zxwWUCq;DYJIsL*|cCpO*+Th26i9~KezYtKL1oLqk%z!u{#q6Lqk1$D|ciLz`nVMtzjF`p>@1Z zZ+OU>B|5PqtH7I6UNxN9r4Iyhg@hhn&P9)Jd0#%R~16vBm{!s&3RQzwHM){MpFN z(*eM~_s4L?yx?k&4h2^h2&@Q{9}JRk?RH7HhJD=PIc&w=D=OGSVhBV;%WX^4>UEEavk?*mjWRRNc3l5iEUwJzGYs>we-+;%%7Oa+3s)Gxt z-8oNmWX4_htF$M;=mwXwsZnm-%gIN-eAmCv&z;lgp0~_3MX~@C1m-#pm+if|eXziv&t}Ij{%Ry2dJ0J9bl$VQ_PJ-M znfv$G{Z^OKCB?X_!(0XD%Mvn}7^LDeDI=V7bpO~7@O$&Z(4OV=-NV0qCpcQ&9r!K4 z;poz53$lNka<1acT$NPGti=_vH9KmM+i%-fG4v0h;JGfjpJlDG@wJ;p{*)j2R$fcp z;rJJ}Jn*c+Oy@mIj|?tb<$cR;t+W9gdu16yHAkd$f7mT z_oy@WcRCeGxPna&bWy67?)^i1>oR=_bq;lR#S5Lw_Z`k(hZ8so+m0#2eTLxRMT#Qq z%SP~=SBR4%UZI=?Z&_IygQb?Rm-o2r(IJn=^M8kyxq-T+)BQY20w}Ur-o`RaPwxa& zgxSs!BtzT~cfnx!sk!u-M=*1nr$X=yCNS<@4=c)gMr=oy>2RiWW*OwZO5`~`>f1Fu zn8Z{7bP@=*NYvARD|ls@4Y0v7@Io6$W>#dnRDU-j7GB9PGoM)g zV9lN)V=$247XQKjibso*$)og^{rOH_2;(nLMUl;BnU1PXb^7tWkk#5&Ka>Q97leIF zdaI!Y%V7%zfHzg^=!`gp_Q7m3JLO!pWdwn^mVy=am{^(rn`0|I%k~<3TMw5!wq~C4 zTG)neAAjU{i)SGYcehdN`Kz2pexT@5V^Rxe%ipDd{*d()OK2Rzwjk`A6Jr=8%Mu$) zj{xrB0=$>t_Wd)HoiS;#&3ddd0Xgc*e?he#7vE5%*4Bj~b_?uJc>Zpi;&B4bf#RcU z{9)+8+*vtor(z(HJth%njEFrX0n$+krTTCcbf?=O_GH@H3&0WraT=)`(CU)jxUgNA zCV!@m@RcjRmJi4Ok3042TFU8pv$yiihqgUeI-Wl}g{(#G&JMz%B&W&s~ zi#f3`ZR=@(ycSYrWi6MY*%4PNFnbpwg%Fwj-24h2x}p#jltSB({OFq3QZNkI<3Xp8(;(1$5e*BkZ*VsDF7DjD4@m*IV{sx#(3jq)x$1XUn% znSY1E+|Fwj$)z1fZ5}aPerpLZCtGtsI{x2143|CpQkH)r&lHi>NMnU5B^OBcazGF- zQvB~y*`*i5m{d?r)92gNt%ypfaUn8eNAL!QedqI97NuyJPX>s|l?GzW?VU4r%0P9s zU=gXV=0d~D!pw7X-K^KmB~?<9DxqfB#M%6r=%wc!>b#nvhmZwzElECP-+Qm7X5yz&p%niH()$QkV&abLi-o<(+2nYyKLAcr` zCPIXkwFf}2*XwauixuZ^zP@`E{(0l?xn@RPT<>VkVFAEl60aT2>+bElcoh4S5}5iaqt#kv%$Pr6`hlw{0;?5?^&Aam5Qc*IaAsJ*d0 z3yT+Z9?zd}T=eNmb?VPi@8m{Rw#{5oeL{MY;q*zqo*V`u!POPS-Ek;92`vrsH zY_LtK!mJ(fFbOO|dgEeSK~$DyS(YchrNLY~x3- zvP@J7=uRLI7xa;=ECrIlZ?%h-bK*xiMlXH^W0V9SlWfHr^N$5HM;16sIp3^a7`WbW zfptLdRDY+o%{8#Na1@itC}007s0>MStkg1{NlP6mEMSRStz>P8>+B;E0e#GklRSGr zV8BdDXc@QC(h<|9t&f>-is#Sk;+8D4Q<3%^~=T>K&-+TukbeRRp5nq_+;ZvFYJ=9@^u%w?xs5lk#D z&}(X2(j&`fdE6GEDA_*(daaOS#b0f)^hd1YZyH|^IR!V4E|nk-f;DpaF3K7q#b8kc zYtD&tn9~&zk?TISr`!)tN8o&OA@6%t&4TR2D`OiiluccFbPTR-H)>;r#h&7B_uSqt z-E@<4(J`9RYt_Llw6vd>gwqNzScJ*hpSjhBnpUtbrKJGxYUCsRXB?mN7S?gB?M#Iu zT*#gYH@d1%_r_|38S{yO%2mY`AjstdjNJL!2TxQKwyQoz_#^*LDk108rddd_`V^~Qyszjs2MSx|5;(iMot^*PSA7K3@=7@64Q*~-Om)f^%kxv zi~pu~c8+kKhS{Jvx1m!#q&2KsVPMjQ-SgRx>WufUuW-+sx1j1vRXW=gK!eqHS0cB$~J;wq^`LWm3TIOw3K=3HDQkf$=JSCq=5hKK_G zh1R6cIsjzeV5sRn-BA7vroJ=YgKTqDsf+W-;sS#**w1O5iNBc@*wwtCRJBnh|Arz%^;KE4`Of?I5xLthF z@QEAW^Q95`m+Hp%BScLB%o^4-^H}8#P^V53V=+!P4vtYsrhS=eiPbo3+n+!4eBM6* z;0-%sh4T)`&Zg4vq&~49q29oXg#H6r&^wztTZh45OUEiIIY2pPv)ODmPk0ODsrne8 zq;+UW%F${0ovLDXnuP=TaQyYf^XK35{+mdKEo?(oRn=@Zn68`?KQjt}=(`FvS+= z!Q`77arUe6-rfPqOWNCi_1fInlr1{~Ty_e^sS2l&yMua&gR1?2)GN*Vwa4+iNU6usqBo3dR58Oj7gmuV6QvA^3l8Ob`hYq2~ zxVr%eY`y)jAUag;`scWRxWs;*OjpQ8tfGcz4-*r@fRIM5j70^UgNZ@ZIA)JT zpb)SQKugQ%ZIoS4EI1)=QI7k90 z#bBk#x_g&iSaa}U&>Qb^J?P?ymA=8W&rB~z7)FrZ(entx1;bQj;H&JdRIvY9C2{E+g9`! znYQIuDP7%DbZw}YHU3hJv=vRdy%v!k;FYHe_HDLQh`)JZFNs|D(D0s)(0PVNR;ZQ> ztUG+C_Ov^paqO}tM4Szk$Me}|ZBaUbg|&P3Ui<6QQ0k~S_fjpFcZr$^HBbDy4RG zkV>6fN3vxhS~>p%9s4a58OI8$A_*-wZ}{8y?;2X>eeR0~b79wl!z=!O?!G*}jq5u1 zyEB-<%m5$>kRZW*k+^6vB~uhd%8G5tmXq4?BF9S-yGhzCPVKa5-1f!I{+hK-Uz@bH zfhDSLNul%8Imdkp|M&nXAp%qm&% zAkcPR3v=_m=Dh4|?B3H;Oor}xn_}TwhkC@LPK*SsffX#SWd)t61geDv(C_TIxVCm1 zz^#pyMWv7$001BWNklLHzKe5r;hYu%A09(%~2Y3Bs)&K+r(d?Z@ zh-#6^mF&NBfCbE=Vh;Fbk5z1I18K1PypAt+Q0~ONZOt9VpQp}T$jxknc79$DYWrf#;DsxVEgDQ#H>aNNwEjx0h zo$3X<#0FQKyZVG)Ya!QTpyHsHR>;-Sj+T z_M%cFKLGE@h+zi|Q`EE;MZbCyP5A2@CIHaEuVKT$MKZVPQ#H2o@?~cNV5L02QrTA~ z1j_T2mvvyoGcq^#nu#zMhBK-FqqpcnD&V_^$wysv*oh3VwZL{@=7k}O1n>cr=a(BI z#4`1y9)M%+OEv=lbvWjtcSV%6ofVM5MFaOOv$7Dne(`XRc=Wvnh`Le{deq*5s1_Dh zC$G-6cWs-3Yny?HZz|Ul8L|wgqV-W@Ne`?Sg2zQX#Ahu$MJ**gNJgMLo z_BDyra_zJ$nu^(Ve*h`{nu3ir?`nkBW!O9GDpZ33zzF8D7aoUCq3R-wwQvq++>)9lmSFEV!>T7MA&1qwaIaaM7te$^ z8l6uEWWqDI4=4nnGsDwd5$m4}r+b31qXWgi{3|V(l<*m$F9YVX*Abkp7e!G3>|urB zRT=T?dktFVr;OkLq5~GilnfIv)l+Tv!r>b{L+tPD#`(<)+kKu}&bi}K?Kh<6JMHAX z)=2`ORzTvU`Wl=n33&o<5~PtYtIKsK0V< zk}lC6SoRoH3Lc<5g$fG5fq4rwp>Y~@2i$2kwz4b23qx8hyk2itAmBZF76=%DwT*L4 zku;e^uP;@Xr!!wy2W++>uLU4+8E(7u7=c&G&H=#Lk2(G3G&+Sa-C+ha=l}*KJAC$n z!PMbhzm)*7Jp-s0?!&(;b7KU=sOOg%-)Xb*=K5R?#Sj-D+*=OS-)9mt^mgYoo+k0=>ybBaf*Q*$ggc3xKN*Y z>};lzHSe4i3aUz1IAT=?M*4?)dZ1xw&j2OjF=E_wS#^wnYAoyA2?W}TSF4cO+1I)K z=4&YcP7^2qXo&&9WJf0`+k^i^2MBtil6TL0>jgawV3EZu8nXKRa;fb?4o1+uqjwOX zjIr_gJda~3WGEsm5lT^B&n)lUO~SZ@QhucxfoKSn=lQ70$Q0&c(H`C$bI$D=G!0e; zV}q2kh;|9ZnuTWEer$=N9f?K*)=^$w4$McU+GZEr)~I5fFk0@cGlW zUdNWD@VPHmJ@|gf-#I<=J2ILEvLVs!Gn=@yOkEEq#d^t?teK@N%CqG+KW_?#PCKEy zbJlAq>5j)Ek6QfMmvxOx+q)(BDi)bWvv-89P>i5L5_Fihh&jxd^>L`^ zzS^V9UMrIOVJxy4qq1U3dzzsVIpsx2GCU;c!(dz68RqJb28A(+z)UUlUt>pHsp`3>n5EG}I? zAc{itGeKSjjYm7ef+r(1!iEneuy73M2q{o7W}!eAyU28sNsj#hiycR)$}LNFn!aJQ z$%6M9R{%ohARXW&WVA?QFHdk>Q|alrO}IjQST!O0S@`6r!^P_IY-@IDhlO5xXDrR$ z3Cd{71_AH6#UV-R^Y(ykvkp&ipa$~eHFzMd0lHt;CFxx!GmPc=D*i!_mYfn?owD|Y z?r$K8L560wy0S%=SyeM`7KMF~L%vjfd4AyS-xJNsg#!LqDh z=3#Zj=v9^-BdG9ZS5aORF{Fyxt9oeHKl7?{s%rI;*morU`Md77ScNju%#PAnki&ElqYBq33ca zH10hkJo{k!vyKAB8-gAJ6bxd~nI!MW#WTy49S;?t-9UWk)0Q6JK?PvIBh2js>Ocp4 z^&*tXJRE_t1T`3q?*J~ytB^&+1210(zaYw#!9Srb?&ANgs>c6<)(e=N<*2G_Kv6=W2NYyo4>=m=CT4< zK1MjKy8Ke`ic3gm7n!X5uAO1ia;B!dFPC}oF8_D4BpE>A5Fi6=0nia6e#ppVgKJNY zh77C{uCkhIAkNndTa8H6ejZJ>#G&exHhi2+crAcT%<#LAtZE@^cJD5aJ;tvsavH{ioK3(yyof zeV{kH+5tr`mRoiH@9thc&0{HdVv5$Rf!5% z;p`8E(+BTReZF=1cid4{S?0SByP;D?aG-z+gt&BFU*gmhMG4UmA|eRSS0J8vvDJ#J ze7=n1@@PvKr_j3z=)QfwVFnThBcpxpNw`|qSsQFDE3vjq=F^GH0GDjxT9WMOs)u+^ zKYKJOClx-67jOpIfCNQERx;?|Zf!QG2WI%@h5+-fPHyPzA;pOPe0Ke*4yQ>gbqx3XvOMF53 z(4Za9rtf0_9U)2z6RoZEGX2a!K7OK`(Ijbs{jqOgbJmG*tgRFUbRtL@f|{&0SP`@% z2!PdfKX5Zb0`}Tu9e>_2LI42V=u^>iPYx0ctZDuBo&yCJ2npf(?0p5jYfRojqQASO zSRk$q@U^buhyP~nL`upx?>k&NX-lPYBNeD72**N%d-rY?Mi`+rvu6pDSS5tszp_h@ z%_SVaH-r-SijSLx-0R^qGgL@-PIPS!Nm}mO1LhFDJh)tmW3$qv3sef>`R9}ql6>v1 z|1Ld$T~iR2KuAb!$H}VWU;K5Q6FO}Edt1#nglqR;Ur|cNg^>lN=jsr#?QnTLq)=#i zvRiS3$5Y5tSoBC{|6Re-;QAAFK#&V-*}zr(lpuH55i%2@ree_UB}+^Ui=qI4kwH~J zUCtcTd8%Wwm2%|-r-V)`1#mT;^`otE3$3%G3dWI}_KswA=fdA@I)4A=)4=`fe%Mr; zIo6feJI}TK0wBrNKzY;h&fTXEQtxV?zDGm10l*z~7%05Z;Mv$26hq>K1p-jB$xxFo z^9Btm{-rIIKttIhhh1ibOFs4GY`p5sdp`4e;%L76zde=*+ zEZU){S^{x0cUdhs3xu!gE$im!MB>9g-g)P)HXB|*MlsTaVCRd}4ak|e_&$2&df~y%*l3qII_knWqvm+Bsr4Tc+E)2ewD%p1XIN@03xQ3 zIonXw2D_rnSG_T7)$ws@%_S6iAAs7O>GwQyqY~Oav8n6PqtXT(*1-(=00qQ=4pwLR zZvy=5QDTQ0H0Qc`hoH>gf6f9@5DnaN>!MemUY|y6>rZkS8LxQ$P+a!X?OXEh^06i} zsNN7-zplG`iXTr=rI9VS+t!ApQ1PM{t%xrb+}ekJ@D&t%xN^w#;j8~~-&#Ni3?nRu zDK!8<-|YG{z`qjXj16QoHAv|Fw;gwpw_NHD7S`=NWDNiePRXO6FudFhW}^ zVccu~OZw@*Yxb>KvnIGB*j>44Ue{Am09ay=9gGhX1pqKiH^$#Q5$ZkN&G_zpRB%T* zs-mW>3oLtg1_7FcS`7_MEha*I#cQN=zNoGf;5ptHyN5lp|8~Ptax!J1}`T?!2-LSHrZpYEUe6mEDyydDtHG^!IVE0nu_rd&q{i z9675mXtP;HV3m)jmyUhR9&^B}Y6_B()avV4P4qq5$2KEkBZ1E&cJVPz2^mw zYz}1(bGnyx8Gr&*^c9bM!an7IL)LuukbU;NLJ@!nQ7{k?m}oCy+;}T2jOAyad$8i6 z0S}D~amhdUP+nE;jm| zK&|41kAR|}0|lLYpNoBvL&Lt9EvahGb_ZY?0KhElW?SM!DaPu6zkJ<`SJm6!rUcv_ zFUooL-iyvOo9wmDr0jDwh67e>!RafCtC&_B5*x|HU;M>yrHz)&`!h1aXm5(3mzmOh z9l)UAmFU$0JHIbBKndVrfhB@V50%f2i;5rsl7~lnvn3ePZFNNxgMUn@2$uHFWavwC z-`kB@WK>m0l1_7*Cl(tsq%RX!(N;b@pBdl5*^l2NwBF#36$X(fm!KEeHC5u34|Jfw zCY3^aebR#ifKlX(I(##^(Us^g0t09U0i-zUOzc8k`r*qU(at6DO%{s}gvRcvqoX5T7!U5WTlP)87(hGY1~;rwO4%7S zaH1%RA^<8>aPL7m$V{GpcH;s%i@RKl{ZR z^1wJn7v{q=hw-e6MH1^v!J=1+MrPLG|obdf%)Ov9(jC61J|5alkbX9eNe;lCL@VxZr z-H!mk(RnN>sdjCoqAsKT?FzYlfcRJjhqU1q>arWHk?JC(kjTbGOTqe5GZ#3Vp9~ECvVz9u6Pf|6nkqu^hl# zX!Vt~8?$slrULt{x({~PLjwQ^C^KKd%9UBdIGq@Faixs+y8q5jmS;bW?ey0F9s-ag zH0187W2nVY9wiI%*1q3o7ZMU>{n`W^|8Zq77&Piok>#Tk!^e!dMPD;j=6R)tgdf~- zQ+|FvncKoODfjpsN|na6W5b~*4LZEWm*_dO>3C@`b%LFigs#hI^18T!!9s5;*&DPZ z2lW&ReeM7VDNTarfCW^oZ-5?IZj7)}T*EW`%n&H0d;Y=rl|}&D=fHOPp`jVz z)}ChPTSVKT|EhlxLtu$(Y4lZLA13;Ik%WYj7gGY5rw1gJyx|5fryF`!U&%mY<9zR4 zm*XlsVfEn5SpG`4b?rU%b5F7}qpz@-Kc(&ckB*sPcR`0S6QDmr--IOngh^iHu#jNf zA1wKljAFFBIG^Q`{lS``<{$UEnV`j5C&3b(Gg=5104v#8u(=f%nR4mh*H;)-FJdyXV@20(Re7|%yX z!JL{0vkq2*Bm>mtC(ADrn{{-lSkXRyEw;6-tA3{X7nY$Hw;eCB8S2`h8sy577h|ey z23rZB06;ogE6=57TZe5Te6;A)r(PBRk1wI(UOor}SoTO<{7kya0iLDyV_3iawT!w9 zKm<17SklbD?r=!f`gKD!sH$=8Ikx7V!GJ``=U?q8=qOk$zFWqFky$y2pxkBC8t%E< zb?Q()I??NT^sFO{yU$#c+M0<-#@3dw6qcdOdKd+xJ|wS0@AK4y7g!0 zw>j7s4gk&^`E;>`CPm4#uxSv zih#k<<+gB5k6Pa>x+_8UJ=Oqt)QDiyU zy6?z+w5jQ-q5eM3G;{+1YE&u>A!q=nEvz(5xrl<&$in!OZ!{n*CbQ=*y#z##oznJNi)O0 zI@orj*gWLlu>ZPem?K$WkZGb18k zEC~oC#mCR2?**c0BJ14UUwiEFvFKD5Lx%wn0_1lX3_zU&7D?lfJ_=VDJbY`dyMV*_ zyANg?2RRH6Q~&~>us3UTrdEoVEl3`|u~YT|r_+AW_;hdfLyiP=KHkn0*qY)uaR1v;W%jc$-`XyvZzSC_P>26-)Q>pXGoyn{Jat05^@ie)~_W z&)h^QOQ`rFgsg2_hu7rs`5+8I2Ran*S+COB+1c6I(J@qL`6XavGnlB{&29yA{T^%K zjg@E90f3{FQZf`Dx5^3(b=O3P2AgSD$AgLX2q^I4@qnuGo>ZRaXVu6S9YmNE?Pm!9 zjn;hm<*W+;$lEw?l*t-^r1x>n1JCm`iuPNN%%Fa%;l~DYUK~(f1Orjb$;{ufGcdZ@ zAI{Y1oD@Hhut5#|wts8MSn{f1XJ z#V;53KL4hN0RTnN0vX|x*&t?@Z> z6PTE;zM?K`{BEx(H*FG5jqaq0@3g}r@P$^J3I-j{G=dvOIY8{ zI{=gm(oh|MlW-5m?cCi2qOK@2j;g8z5+Q^Hb^s{yvwj(&bfcM7>qOCZH`R66ec6dJ zOz;eLB?1K$vaUymNa(tbygZhLg?_%>M_ z-^WG|UQBc*3ZU6nEm?!Tr`L%StRzj2zPlFyJ#nu4qbaxC^MfLDLFNm8OaRb%-Kbvd z;w~eHx1<{_h;&!O#z%K8QT-JYc6?*}bY1P`ExLGdNkj zf(q-^36)+S-1~m{fHgh5%~U6G0Ky5!H|(kdvft3XX#mG-@xoQq*c6dNRbmLh9%_of z1ccGRzU{xUq$v@qZDc}VZT{)jawp*P;W_)Y-+t)D3y*k*bO5g8ItUsE0Gib$Hga*& znes{}U8l}OEXis^(%NtBEUfsz&)Q#Mp6@+hP|SsLvysoI4*T5iZE*Ao(I!U^J~o`1a<^F!oRrOeO#mA4`W@KGeYI!H)iZ z8kXHtFYy!r*ef$JarTQNf7S7wXue|z#o;oCv&@y-CWe;AkH)+ouxJ3#n|J?H^(Rk# zEY(z1QOsc^LxpL=UDM;I?!mU1{m5f=$oeqq(sBl{tx@Q*Yyp7%dRYc425@Lbg=<`Q zq~7z+J{L<^6Cx2^*YyPWbijZ5RDXmT2Aw$)s2xCLYb0CXQk8D^558vBg-+bFtv7*9 zLtw}?)Hl5&tjpJ#tBpl7aMQ6I+t`!aev~yyg=!nfpYT{)sSjJwg-x}w{Z+8$n!3n9 zV8ut9bs z@1in31^{{=enQhRjANM{$~^}i8RN~JS$BTKQ;vo*IA-LSm}UE!bmap)g;L7bGXUCb z8gv28sT$g|tp$-bd;gdMKt=I{L?ofPAr(Mu3Ug;KP_5SifN!9VyX`Y*O#vczC`C95 z;6{iRAUcRSuA*c8z}|#EV&A@f0L5#~8W;gk=;PpAn=ADDaQxZ_m{He@ z-?`}qt)}Lyf3bzj7YCX5cdgN^34lo`4LCo$=_Ajiig%}f{oyLbkI+fqpqa`*I#4^= zO>UF{I9!4OUk{fxFcQ4}&fTZN0K%!^q-c1cr-L8>fDA2%qGOimhX6}3QHb27001BW zNklvDp! zd-fr027sy_0J?jg*$4+WhgrNWckMfZ7XX(MW(U+M7R}1IKLZ3D=xVf2nSe(4n zRK%s?nSoWpGu84Y07Z?K-3M)ur8D6l*=c0x+63)HD1`MVxwO%st)N3p1(Yea6Lew2 z(ZUmviP~Y6&-sv0H`xMEJqeB%K;La%?e_r}(b|IXopCkud2s^9a9B&A)@!|}_#uKX|=g#vuN2q4I#q;)HiQf8VuGfR@Lp7%sg3wMriB=PG?gxH8{Jn1Xdjx8*{%*`wOKQ(72N!0uP||yI8GG+P+k5@+5%4H zpf0*^k3`*hUb^XIeL9^2NY#=-U0C=4%~ZJ*^TF$LcRH+gD=}}{f!O400f5Y;{a%KCbnUYEcvEP<}*$p#j{`Vuw$o0O6LB zyxcgLbKx5FM}Xn3^IsefEAU@j7i05lHVx3g0h!p1H$;rT*5~FDn}{L0p#tG+a8x}S zdw!KrN&r6c{_Z8&`%wUTS>eFlg+s6J0Hb3A03cL=^v?PG=GrmbSlbmtl*nNybt!QH5TdfO3g8IJk3<`{P6C`tfJ@P5EFk$S(3))43H8XE{MSBV1V*=t zXUtufWH=B`9x*G+ksZ4lMeR{vrOv7V-~ZTd{XhnAd$q63Dctg_zX5#q17PP8^F<42 z`v)u&hor4Z_CE;;I3hfrfmvmv_SKbWk#H5L${ zivS!h5rE(h5P!hS6EHe8LFN=3hW4ro)DuYt@d3>$IuO<`BndM4dNsX<8#f0Z4wp#$SpMqT*=O#-1u`!$c3pkp$SFMqgYeT<`$!z^4o*dU+zk zOi2jf%m}IkghC~tyefmjBHKe|h-Z@M1gK{TVEK}K73*r@DsO%Q_~-mXKWxkxV1>Tq z2cRT95;@wxURZcs$0@nD=P!FYds4@772xrur<`S2x5fFPCj!XN|KF=85)Sjg5vWTE zTM0A@kAo~;lynTIpvKa995eu8Ea1*M%b5HeIcE z`1UN5C0M9vx#Qj&yuHt>N$^cM%^LYrrY3SMg{0IK_U&osSs0IMp5Mv!8 zGYntapFXkqxeagZKA@#?K|o;6-I!YZJ1KJE98tG*q6!JvRZW%{nln0;WWdK+7bJqG z0FW^Z{Wze4tBh6h+s1 z-Kn7#O`{wZQ0Tg#0oZW_vS1kvp1Qe-`%Snc@lB^z2+LUi`KYv*a4aZbZP7Op62O{X z)A1O0e#1C4_vol(mfn)<85J@Gs;3()R6_YB&A^Z$LFRm*3wfJ-EKjQ5_pGRBZ;Noi z<;eno7I)rR2{usNB@@q3t-p<4vBqD=M!a`tlO2)7zGGt z)wCHWo@lUpmz0y#Co?z>c;}a1^dRZt`W83<4gxq4C;PtegeaK@i3-`rmsih9U{fB@ zLO}-sKwN`?J^vOm&!A+Dr|j5`$+o4aOi8xEa~aGEgxKKGmY`yTP|x8{g+`h=aZHk? zkHpxds!RY_2+-_VW6o=L24gKDKY1||(vReYA$Ey}YPp||$;I$=5kMNA* z0HN~?Mx2%%&uwyeFK`H_MeP400cVaLQE9ycfFdFj9wb0dMAo>5LCM!`p*p})M&2@$ zx(mD-b2JF2Ca0UEpPux$=5KCkDt~z#r?1;~e1xxFSat*?YU>Dr%&GIpjyMX72KoeF zw}r;G%{D*<>NJWSz!4sR3SKR524uTU%o?|6dW=yRrUTlF%;6%7PiY6yEI}*$Dp``V zDd~iGc`LC7<^)eFh%RVh02L3U zonaUR0ls0DD&{mwKsXz5fx0o4_4+doG{3fHqWady6TCS7YK6Ke(R zlTD&Q>kYH~g`ETo47;qKAxh02t&rpTFRo8I2%>kvS;*l>0CP#^-J6 z0ERGx(hDVb{n!EEE59_+>IYvgAIA>Wxx^bb#L&DdWz20?KvY(q&l$BqHZ#_AQ;~ll zOH@W*Dnc9LRtmD%;v!Z~Uz7%f*LkWX1$eQDHHWE+S0mst)io{{f!W%}g)? zV94YWl~IGO>({eoYn-Z)ix;W!Qqa;sK5k-N) zN*pJd(_u1(Xm@4DwMQQz#}yHHdv}|5GV;L_r>^~d#x7gS)cJ}Q=|*MGvNZbVscKP9 zpZ+tkK-CC{F8Uc=(IXnsV;>|_Wu_7b3zw5~ReCB33?#eX5nADyJO{~4;}w@(1O;P@ zQ@C86;T*Zvr);ZC5diu_{Xr7q!h>eM z+bW7_$q^&XY8nZIwF~Zvkr108GfH@3b6O8X-7uo>o@aGH2LYetOk&b)7SSR3&-;tJ z#>>swuUUFKZ*LF*tm{PD$*pTt``L~g`YJ>o+4nhE) zW%cNn?5Q-Xm`};0S%rp&$*i5gO#PM2HD3AI^mIv>SVJiQ>pibMhu#w0^5%7yQAVNh zsyc`3JL(w%DZOxb1wgY~1t1-6mUu!DlI-*_>KNriG2c4?8oem50=$Z3Sc9$ztdukn z2|%zKsNZ!Q@MTPznOz6+zx=Nk)T)W&`z~qkrmBTlou$;A9`wxa=T|i{nJoq70hI@6 zGI1qyBiD@?XNuk^8>|-?gyLS3XNr%jvIV6eHIi%JPC)y}fwb#hRTsDa##Fllf6>$$ zRf_AldQ{U4-08RxoIEd92F~He|CNv2$nIbtY zpZM$(B-muRrWpWs9R@!BA72(;p16!&Q=M>J+9;vi{8=Oljq(mcT&kERbagRe3(&Uy zbV(12rmb8_3rbo53|@JA2PQqTs0AC$07jUk+}+OrXl(!6aB55W;9|RmOg10zVP2mt zYEBC300y}9=F~h{H!~xFjx(dCaWku_A#X_6qEpQ;+ExY}l9Zp%Zxijdy3t|9pjw2+ z+Dr(_6T&$s92it{M}e;-?S)zOZSl2y@I*;|*QInOWnx-@p$x@XuP-TI)>KUC%;||- zAV{|46lIoJ>4pCEl&*Cx05Dq8f|=TK6c`1N9O_6bYM;Ara}yO|SG*7W7_kJv6gEr=z-gcs1e4QMF)dLU?d~pO66XG! z^}tEqA4>pz@19+U0UR5-JM`e=2|Ew(0Wh+7IV%f8%&`;F36%mmp@haBMv~!3PaZ34 zHe#`**NK=JZMo4wHrmYu*g%K3UD}91(r4^fP?2ae_lOQL z3~&|vK>1OF*cvIL0%7iPdeLFyq1nUG1SUny8sF$KMkgj(0JN1X%QR73eYsCr`mQJlH6|3e=7i zO2{XVoCF1ddU5iGs1`;EtkGd^w^+TQ_E)O)lTr{Jo^H@BU~~QY|Gh$+gUuUP;U3 zU%dzCo15UJ>4TS73O!7FK5F+X#0i&u_%;PvYdOf7Z0ywd6fo@UOm}T<_ zsKAIG3c_h>?6xEv;Z>la{3NIffN+2c5XnG@OGrr@OLLtz0bq!vx6Kq=(IR*2oiQV% z@I~A`wsQhCRoJ#~md~hi3g~RjM#D8l=Z25pP=DQc!jVwUkYzM;*gn)&RMf`cn$JEN zvR*ry*>%3{V*55rSS2k{6R2a^#XL)r++r=_F4J)y6t!L4v5y zScb0aR4%%f2aS3nAcV-(NMUG$IepwcaTOU<+@1aD{XknAT8ctJ$ZU|L!(K9d zz+%U2roYkxpr|Ot*VOK53nX#o(kE|`}KF9wkWuruaR#gt|{fMe>H6P`-kvyipd zWBW}fI%BALCN4RcW-1Ji>5LBj{E02OB}D*`(0sL)T=h>iF;@lNn7~Rf+qxB%Tzgwm z_@x7#rWMecLU7TvPCd}T!dg6R?~hf60%+WLD@L$mUitB|pj_-|QRbwQlhm(xd7jQL z4+s(CMN`KH zszP$ops?lj6e*hXXZ%N*9KH=`!$j40>yOmrzF8UjaNA6C7gd@?sf>Bt^*;uUj2T#o z*xZ+>Ec&4g^zw|<<`n$^Ocm`+A1)kAcWmgB(K9cVykVLX{}EkVTO6qj>8i?0!N^ny zL3lRFY0Av5q)gZP-tks=JihE1!YLWO`0Ab~LoCesKpfr*-3k&+8u5iWbDiU78k zl=R&^BD9~_(z5Xv*L9(MpnUL}$vfsLz|dL2cS4C$)IMZAGq!z#9ijwajl|AQ`(}Q$ zgfyOT?{g;!PCdaBBW9e8#!E&qijtI)yxixS&o;a{5ezDHMSPV=MC74f8W`IG01^Ln zQ>-qL@_MBG`i?5u`Rcr&nrflK++@+Z^n3qz*n0J!Kttd)fLD1N4cJ^MV`;)0F4O-B zHrGUV^Y-2uAk!?Ltz^Dvc;>3EnrZKjjQ|IL!lW1Pu6|+|m?+0ib;p81It2jE)NLvp zb##d`0K-qfoRU*ZT1o&fV6a0-oC@hmrY#;)L!sx&MkDboJYIqw`U}pslmc6pyfvwj zqI)9ER&)EUw}39OHkVlWA9J70-~*e8AwZ>sM{-ee$);WT;qI}Cr$7JUuRe*tc9u*l zq>_vNLrE<1U5u}G+TM)-7FaCpfV#grHF07Q7AK;0g@zSaH)ZR6T?(Oq!C5Fp%Ny2f zTL2i>Non7Vnm80qZlV(GxQ#jf`p=*Km0BBFVJtfIZ<{?!n-xbf39Ur$@pU(7Vhe=ww+?%g5}Gq}`}_%pD32O#0Ft_ooMzUW;N^R#CDSsA$xr>L1T9O7 zd%d%Scl)730IupNecgZOUEiqSL*rR_5`YlR3`z`iWR#b`a)e1# zyPVO@TEt{`x!l7)rg)2i0$_D=K%oJ_PAH@xUC__utqKBxOaMTB%#yhQ?7!o70VCLP zQC;!8htW_<#xJb90F3EM6Qtl^`Cv=|9{a)(RI-7MAO5e5+NrZ06<^Dgc`Jzm7A+{6 zC#oT!F$6qOik&-KEW$cqx$yuHLdVC+J9+=|iaI&WdA^2i);J+;;QB^_!qksrzcYOJ z)U}fLbY)TGXc2P9!}a4nHUd)!S86RW#t2CSgvw-*p=4^%Jm7C0WR4DnP17 z6CteONz{~PF|WDfB^_b}xT12q9NB69bDR1X`;c{Bm?y9wRkvbfCb#+gOU&rX3{tnXC}GM0a+;1OyVM*vo2T zTxJ0P`%!i4KdvV;)2r&dl@!?qa2|TmM1nbNMAaJY8qU7EZ#}L$`Iq{WQOUKlx7P?gbCs9oZsB=}7H2{2SFRK3iW$FlMvv=!U#oS$S z)?~k_Q|ytW;|~IqLT**|G{Zp42db0;bygOvsI4SL#Pgt38=uCQG?J_>r6tKf1Dy^Y z08j`y9N4cFbl(Ep0iZjUY65T{fM;il5zpKYJPVjU>-xz=Gk&a%W2M(+;Gx1;>5%rW zxQU;Jt|@V{B3OlW8M0HDn|`sF!JCK5#To$8UatgQKeSk>pkDu!`zvMDjg8TYJuo`Q z>7Y`WoY;ArcimUh5+~NpKuwCe8ye)_&!^w(zw)cg;Wr3cf|j5Kfb8?QVecA(qprMO z#go$?c^JTtS?KrUS&D}NAThP^Mz{R2`gd^W(~;E~8F4uu=KlFts>K{o=PhF3St1Z} z^H~7*3vZiH3wMmaGXMbA$Kf0PhIS2j^+>e%S(wkD7e?42nLsCu4zQpw2xSd1xWycT z0fdr+OiK~kcK5g3d8xKFQ+W@emLRVo+8qK)KnbUr4V&k>yY_qG*qndZkD(|gHYLNm z%YHeMl-x-u=PTQG{8jFwzf&d)qwaea_W=N&!NW*QrRmux{b)42`ESq?}XegI^H-oW&%SOZ8oIcX@EtZ$GNIr_ebv>U&R6ofZ(CBfA|HD zn}&;U(qEOj?e$oBl0g7G13Y}--_x_-a$UI43IOJ*@d#tg`#^SJ&aU??)M!otGTlj9 zS)1mbGd-eo{n0!2)5+Y}f|9-;0G_??*-0hE!f3;uPnVtp2#qYsxP*lqcUYb8Xw%@G zTR$MX{ef#UFlaRrk&;IYy;WWh z@T&FFd-Yk$e(?$AS;jeHZZV^Pn(5_Y6-FnQHD63(HFfdppK!$NopS`i*vSKMJ71Rb zy*sMX&)Y_Vuif?S$G!5?`DjB%;b5^ z!hG#`ELfOePLTnWntB-YVRpc9`h2OUbtEyQHA82ii#i)wXgI>zQk;GGgTkG;sU+8Y zTGcd4-;Eb;1d}3D{Q?9atYKnIVDt&&;6H31?SvWtGQ9u~9y|c8gzXkKutuV{b3oR* zZ~x&ZrNmR7|Ch?OY#17P`&{qAinL@85Y~~An3$OOUEO=;ouCH1Ut|X=2b|j6!aZGQ zs2OI~h{>)N2*S!wE!Dc`su#S@u@l zt{`O0ksV?DawPJn3epL)7wDY5==tj0XWl7BT8ll z;q2Ymd+Rsw(?HTQ`;xqllGWxve|I(QR3M;)n^gos!LvHOH2wShw*bI%%a)W$Kh<&DFWz6W^Nei`dMRi1U5rH&Yar

%i@6&;KWaXfJFpECkwtU=lEP`=KB#H)8Prw|922 zZJlKt|D8`CJI6`v*hxz02Tj|xY-JQW5%(gM(lp!3pj$5{L{})9*n}8@N!*|zAuf73 z0h$;>+(Z=wn)ONrTWA3as*6vZGBCdE^d9Cqq7-r#L)nKj81MYy0bY0-np%s%x+_^~j#hnD+@4-j+KbP6)r*;G zOG$-Ye$91u7_sxubFzH`*x17xCpT7mA9^S0*h|`37x{=*Ar;V;Z@*jwyNLJRPHts~ zz3OzSb>ti0KMupUu;VLRkz<1n3Hr_6eK~%=7Y3nn@oVS((s0e?4zW3DotRzxQyrB? zc3i*YEQy#@+cPWhPPWH;INR3Efv>&`7t$L$65VO;&Os1aUNrx&yOX8p`ezo1uxt~U z+A?x#fiE^~v+(vVz#o2)gZ%?Q=Q)4@8%%onOXK(6?B>sKh#l;}vX*23P=PI>_uaZ_6b%r=Of6;p+yOpWHWSh^Z)^R~@Uml6CuYyi=df=Wp^mpSXFtgq(Uz ztsVlIbE?rM^fI`8IKxY{ku`0z_E}qIAL~ziTlM++U%Q~ve>pm7FNyh-b#lJycM(}m zUAk67sWwYsH9G~=#`BZx1WWd)6D?u}d&=}`70gPUsmIOJCD0;&`_oXRxz@xs?Ml|y z%K)|sy$sm2k!^dBV`Mo%ifuh62-^YDPrTSwO`evD9Vxvbk0g*pL@s7V$L)o-Vxuu& zntIY==I85c3OBlsgd}2tz#NrIfTlks7y|mRhUwyE6X+eNo(WZ*u?@&RoPj3=rP2*^ zrXPQ$3yY+cy!zJc(nN8F+FJHB(~^XtuueVWPH`t_G3=5_=|*u(NFs)j(`M}wfExKx z<>0alV%xo+%@14JvK54n%zC@OSdv!$v9pj9NCI?M7v(t}2F2B5@H#+W_2NhW!DCs#v;)3O z_x`PYzxw5eG<^sE7};js-uUYe(^T%h30HzZMkA8EJ8yr|{SHzaCR|B#K?g~EX@M}v7n@9em8eNKKkg{FWSB&l!nq9^eD!RkEAS90WjiU+KC&HWk*OD z(;+)B8oqnPs*Glj1@4-=UYlg@5V@%91E`59K=GGzrBU~pBc-zJ2+*}VV$WRcFgaiR zbJexV@JmeuYCL&q-ZT=ga>JwYGO+TpuGBZqv`_13zOJA+#gHBN!ZCfJ2cQW*YBhI! z5cL-tI=%ezgS;t30R>MfgzPFN`BWq@g8)sG9Y4Mymn*N(wFXYU2`NxCxy1_ERYDR+ zMig~L5)moh(E8b7Em)z8jrvW|vL=oBSF}RNuCgC?mb^f5HOVmwsk4STzET~}7fj5| zY?z#N3xsiIHU8Gy^GRDNt9jPO-)lML5vo4?4g%?FBCn`rSqhX{P5E~u2n|~=>{zIk#E$$(g98bK9t(|HXYBm^xz#vm z;Ax>%>x&(J@mxyaC7PT67+STCa)fG*Zrn3_p%Kb6erVS^V~1+!*TU=|RH#s)LWK$y eDpaWY)_(!wloido_$^%k0000> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/gw/assets/logo.png b/decoders/connector/atim/gw/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..655c7e0607c59ea8a3b583540cb5af73ec7a6ff4 GIT binary patch literal 32694 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 q|pxWE)JnAy!P-R9y}>v-HWg#Q!9b*#cunXRqX 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/gw/connector.jsonc b/decoders/connector/atim/gw/connector.jsonc new file mode 100644 index 00000000..2ebef0c0 --- /dev/null +++ b/decoders/connector/atim/gw/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim GW", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/gw/description.md b/decoders/connector/atim/gw/description.md new file mode 100644 index 00000000..f31556e5 --- /dev/null +++ b/decoders/connector/atim/gw/description.md @@ -0,0 +1 @@ +Repeater over Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/gw/v1.0.0/payload-config.jsonc b/decoders/connector/atim/gw/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..020ed9f8 --- /dev/null +++ b/decoders/connector/atim/gw/v1.0.0/payload-config.jsonc @@ -0,0 +1,11 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-GW radio modem is a repeater that allows radio message reporting from an 868MHz to the Sigfox network. Connect to Sigfox any type of ACW sensor through this repeater.\n\n**Technical Data**\n* Dimensions: 90 x 52 x 17,9 mm\n* Weight: 50g\n* Antenna: External antenna (SMA connector)\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: DIN rail\n* Power supply: 10-30Vcc\n* Frequency: 865-870 MHz\n* Power: 25 mW (14 dBm)\n* Output: Local: 1.2 to 115 kbits/s, Sigfox: 100 bit/s", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/sigfox/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/gw/v1.0.0/payload.js b/decoders/connector/atim/gw/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/gw/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/mr2-ex/assets/logo.png b/decoders/connector/atim/mr2-ex/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b63b4aca1801cc5d40261abb060edac3efbb0d78 GIT binary patch literal 50073 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 VSDryBQ;miBD9WjRto&dS`acSNpU?mR literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/mr2-ex/connector.jsonc b/decoders/connector/atim/mr2-ex/connector.jsonc new file mode 100644 index 00000000..c6fa45b0 --- /dev/null +++ b/decoders/connector/atim/mr2-ex/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim MR2-EX", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/mr2-ex/description.md b/decoders/connector/atim/mr2-ex/description.md new file mode 100644 index 00000000..5ef8ffcd --- /dev/null +++ b/decoders/connector/atim/mr2-ex/description.md @@ -0,0 +1 @@ +Metering index of water, gas or electricity over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/mr2-ex/v1.0.0/payload-config.jsonc b/decoders/connector/atim/mr2-ex/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..8a5e98c8 --- /dev/null +++ b/decoders/connector/atim/mr2-ex/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-MR2-EX monitors and transmits the status of 2 dry contacts or meters’ index consumption (open collector type, NPN / PNP and dry contact). Compatible with Sigfox repeater (ACW-GW).\n\n\n**Technical Data**\n* Dimesions: 177 x 55 x 55 mm\n* Antenna: Integrated (¼ wave)\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall, Tube, DIN-rail\n* Casing: IP65\n* Power supply: 1x A lithium battery\n* Weight: 100g\n* Frequency: 865-870 MHz\n* Power: 25mW (14 dBm) ", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/mr2-ex/v1.0.0/payload.js b/decoders/connector/atim/mr2-ex/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/mr2-ex/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/mr2/assets/logo.png b/decoders/connector/atim/mr2/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea36b1113ff88ee7931e4eb3e9518bd502ab96d8 GIT binary patch literal 42578 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/mr2/connector.jsonc b/decoders/connector/atim/mr2/connector.jsonc new file mode 100644 index 00000000..2d05c994 --- /dev/null +++ b/decoders/connector/atim/mr2/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim MR2", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/mr2/description.md b/decoders/connector/atim/mr2/description.md new file mode 100644 index 00000000..b0c62280 --- /dev/null +++ b/decoders/connector/atim/mr2/description.md @@ -0,0 +1 @@ +Metering index of water, gas or electricity, or for remote bang-bang equipment control over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/mr2/v1.0.0/payload-config.jsonc b/decoders/connector/atim/mr2/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..731797ee --- /dev/null +++ b/decoders/connector/atim/mr2/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-MR2 is a sensor used for remote metering monitoring (gas, water, electricity, pluviometer meters…) or for remote bang-bang equipment control (eg: starting up/shutting down, opening/closing...). This sensor can be connected up to 2 independent equipment when they are close enough, allowing devices and network plans savings.\n\n\n**Technical Data**\n* Dimesions: 177 x 55 x 55 mm\n* Antenna: Integrated (¼ wave)\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall, Mast, DIN-rail\n* Casing: IP65\n* Power supply: 2 packs of 2 batteries equivalent to 14.4 Ah\n* Weight: 160g\n* Frequency: 865-870 MHz\n* Power: 25mW (14 dBm) \n* Transfer rate: Sigfox: 100 bit/s, LoRaWAN: 300 bit/s to 10 kbit/s", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/mr2/v1.0.0/payload.js b/decoders/connector/atim/mr2/v1.0.0/payload.js new file mode 100644 index 00000000..de52b1ad --- /dev/null +++ b/decoders/connector/atim/mr2/v1.0.0/payload.js @@ -0,0 +1,644 @@ +/* eslint-disable guard-for-in */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-plusplus */ +/* eslint-disable no-case-declarations */ +/* eslint-disable no-bitwise */ +/* eslint-disable no-nested-ternary */ +function decodeStream(payload, timestamp, latitude, longitude) { + // Init result + let result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = data; + + // Get message ID + const header = parseInt(payload.substring(0, 2), 16); + if (((header << 2) & 255) >> 7 === 1) { + result = DecodeMesureFrame(payload, time); + } else { + result = DecodeCommonFrame(payload, time); + } + + if (header === 129) { + result.realTimes.push({ tagRef: "p_batteryVoltage_empty", timestamp: time, tagValue: String(parseInt(payload.substr(2, 4), 16) / 1000) }); + result.realTimes.push({ tagRef: "p_batteryVoltage_inCharge", timestamp: time, tagValue: String(parseInt(payload.substr(6, 4), 16) / 1000) }); + } + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* + if (data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(data.raw) }); + } + if (metadata !== undefined) { + if (metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(metadata.device.name) }); + } + if (metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(metadata.endpoint.type) }); + } + if (metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(metadata.network.linkQuality) }); + } */ + if (latitude !== undefined && longitude !== undefined) { + // result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: latitude, unit: "°" }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: longitude, unit: "°" }); + // result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(metadata.location.accuracy) }); + } + /* } + + if (metadata.endpoint !== undefined) { + // if KHEIRON + if (metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.fcnt) }); + } + // if SIGFOX + if (metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.seqNumber) }); + } + // if OBJENIOUS + if (metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(data.raw.device_properties.deveui) }); + } + } + */ + + return result; +} + +function DecodeCommonFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + + // calcul of the starting index + let startingIndex = 2 + horodatage * 8; + + // get frame type + const frameType = ((parseInt(payload.substring(0, 2), 16) << 4) & 255) >> 4; + + // keep alive frame + if (frameType === 1) { + result.realTimes.push({ + tagRef: "p_keepAlive", + timestamp: time, + tagValue: String(1), + }); + } + + // threshold alarm + if (frameType === 13 || frameType === 5) { + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const alertType_voie = header_voie >> 6; + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + + // get calculated table of events + const eventTab = getThresholdEvents(mesureType_voie, alertType_voie, number_voie, horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time); + + // add table event into events + result.events = result.events.concat(eventTab); + + // increase index + startingIndex += mesureSize_voie; + } else { + return result; + } + } + } + + // general alarm + if (frameType === 14) { + // get header informations of each voie + const header_error = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const length_error = ((header_error << 3) & 255) >> 3; + + // increase starting index + startingIndex += 2; + + for (let e = 0; e < length_error; e++) { + // get error and add log into realtimes table + result.realTimes.push( + getError(parseInt(payload.substring(startingIndex, startingIndex + 2), 16), horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time) + ); + + // increase starting index + startingIndex += 2; + } + } + + if (frameType === 15) { + if (parseInt(payload.substring(startingIndex, startingIndex + 2), 16) === 28) { + // add wirecut into realtimes table + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time, + tagValue: String(parseInt(payload.substring(startingIndex + 2, startingIndex + 4), 16) === 1 ? 0 : 1), + }); + } + } + return result; +} + +function DecodeMesureFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + const profondeur = (((parseInt(payload.substring(0, 2), 16) << 3) & 255) >> 6) + 1; + const nb_echantillons = (((parseInt(payload.substring(0, 2), 16) << 5) & 255) >> 5) + 1; + const period = profondeur > 1 || nb_echantillons > 1 ? parseInt(payload.substring(2 + horodatage * 8, 6 + horodatage * 8), 16) : 0; + // calcul of the starting index + let startingIndex = 2 + horodatage * 8 + (profondeur > 1 || nb_echantillons > 1) * 4; + + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // iterate on each mesure + + for (let i = 0; i < profondeur * nb_echantillons; i++) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + if (i === 0) { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + } else { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage + ? new Date((parseInt(payload.substring(2, 10), 16) - (period / nb_echantillons) * 60 * i) * 1000).getTime() + : new Date((time - (period / nb_echantillons) * 60 * i) * 1000).getTime() + ); + + // add table log into historics + result.historics = result.historics.concat(calculatedMesureTab); + } + + // increase index + startingIndex += mesureSize_voie; + } + } else { + return result; + } + } + + return result; +} + +function getMesureSize(mesureType) { + switch (mesureType) { + case 1: + return 2; + case 2: + case 3: + case 7: + case 8: + case 9: + case 10: + case 11: + return 4; + case 4: + return 8; + default: + return 0; + } +} + +function getCalculatedMesure(mesure, mesureType, number_voie, date) { + switch (mesureType) { + case 1: + case 2: + const tab = []; + const mesureString = `0000000${mesure.toString(2)}`.slice(-8); + for (let i = 1; i < mesureString.length + 1; i++) { + tab.push({ + tagRef: `p_DI${i}_${number_voie}`, + timestamp: date, + tagValue: String(mesureString[mesureString.length - i]), + }); + } + return tab; + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + case 7: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 10: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 11: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 8: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + case 9: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + default: + return []; + } +} + +function getThresholdEvents(mesureType, alertType, number_voie, date) { + switch (mesureType) { + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_count_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 7: + return [ + { + tagRef: `p_mm_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mm_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 10: + return [ + { + tagRef: `p_mV_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mV_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 11: + return [ + { + tagRef: `p_uA_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_uA_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 8: + return [ + { + tagRef: `p_temperature_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_temperature_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 9: + return [ + { + tagRef: `p_humidity_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_humidity_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + default: + return []; + } +} + +function getError(error_code, date) { + let ref; + switch (error_code) { + case 0: + ref = "p_ERR_BUF_SMALLER"; + break; + case 1: + ref = "p_ERR_DEPTH_HISTORIC_OUT_OF_RANGE"; + break; + case 2: + ref = "p_ERR_NB_SAMPLE_OUT_OF_RANGE"; + break; + case 3: + ref = "p_ERR_NWAY_OUT_OF_RANGE"; + break; + case 4: + ref = "p_ERR_TYPEWAY_OUT_OF_RANGE"; + break; + case 5: + ref = "p_ERR_SAMPLING_PERIOD"; + break; + case 6: + ref = "p_ERR_KEEP_ALIVE_PERIOD"; + break; + case 7: + ref = "p_ERR_SUBTASK_END"; + break; + case 8: + ref = "p_ERR_NULL_POINTER"; + break; + case 9: + ref = "p_ERR_BATTERY_LEVEL_LOW"; + break; + case 10: + ref = "p_ERR_BATTERY_LEVEL_DEAD"; + break; + case 11: + ref = "p_ERR_EEPROM"; + break; + case 12: + ref = "p_ERR_ROM"; + break; + case 13: + ref = "p_ERR_RAM"; + break; + case 14: + ref = "p_ERR_SENSORS_TIMEOUT"; + break; + case 15: + ref = "p_ERR_SENSOR_STOP"; + break; + case 16: + ref = "p_ERR_SENSORS_FAIL"; + break; + case 17: + ref = "p_ERR_ARM_INIT_FAIL"; + break; + case 18: + ref = "p_ERR_ARM_PAYLOAD_BIGGER"; + break; + case 19: + ref = "p_ERR_ARM_BUSY"; + break; + case 20: + ref = "p_ERR_ARM_BRIDGE_ENABLE"; + break; + case 21: + ref = "p_ERR_ARM_TRANSMISSION"; + break; + case 22: + ref = "p_ERR_RADIO_QUEUE_FULL"; + break; + case 23: + ref = "p_ERR_CFG_BOX_INIT_FAIL"; + break; + case 24: + ref = "p_ERR_BOX_OPENED"; + break; + default: + return undefined; + } + + return { + tagRef: ref, + timestamp: date, + tagValue: String(1), + }; +} + +// eslint-disable-next-line no-unused-vars +function ToTagoFormat(object_item, serie, prefix = "") { + const historics = []; + const events = []; + const realTimes = []; + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "data", value: { timestamp: 1605614318410, payload: "810d240c68", raw: { seqNumber: 123 } } }, + { + variable: "metadata", + value: { + endpoint: { name: "sigfox", type: 5 }, + network: { port: 95, linkQuality: 100 }, + location: { source: "my_head", latitude: "-38°", longitude: "-18°", accuracy: 95 }, + device: { name: "TM1P", serialNumber: "01101011" }, + }, + }, +]; */ +/* +let payload = [ + { variable: "data", value: "a1000211aabb220055006633000300044400000004000000055700050006682221222279777777788a000800099b0009000a" }, + { variable: "timestamp", value: 1605614318410 }, + { variable: "latitude", value: -38 }, + { variable: "longitude", value: -18 }, +]; +*/ +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const timestamp = payload.find((x) => x.variable === "timestamp"); +const latitude = payload.find((x) => x.variable === "latitude"); +const longitude = payload.find((x) => x.variable === "longitude"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + payload = ToTagoFormat(decodeStream(data.value, timestamp.value, latitude.value, longitude.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/th-i/assets/logo.png b/decoders/connector/atim/th-i/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d00f9ec431c37851bba1b8cd2085c1e8b5c531e0 GIT binary patch literal 23527 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/th-o/assets/logo.png b/decoders/connector/atim/th-o/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7998f7c692e4ce5e9a754d5562926cbef972cfc2 GIT binary patch literal 64491 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

!JiumR=Sm^1br5@XdT4te+f$65w4oLb^Z^ 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 O0000> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/ti-g/assets/logo.png b/decoders/connector/atim/ti-g/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..919818a68d123b8a8e0969a0e311de4965f05a9c GIT binary patch literal 33339 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

@UZFrMl>(X( zm=>%BY6&zA$RrlD5h+k=5@HMz5EQ{IGM&PrgCd4B0kHq$bl?csC}4;S%Z0#$&Mw@G zA}TSA4$FeIq9DuQb{BLO7+@6W>>y++)DS@GRH!PT@_>LOmOy|XN?2&agKoy4>B1*E z!U%NuU^=iq$UKN_3<`hfGy?yFr^!$j(-A22*);Gm3nV1;tN?{f4%B%-|4^~Ots79! z&}yV0a4u2O!WyBs#vp_NNF`V#n+LK6s$Do0ie*BxLFW?cG0>5)F$7vc43sEo0G$xU zpilwjaQ}e81c?Fuhq{UfF#!?+Zp4roz;=9)noz*7h`OWJofUb5N5JagW2T9w-z*TjTI4+}`2f5Li&5K_>yG z1a{%@pi~510=a{LAp&@Z0vqlwK}!evN3duLbQPfM2Q?$nKw-cQO`HxbPk2i-uQ=d* zxDZrc3>4xEnz{f+=+JVYTghTDpbmpdl?)5Si1sh^7^ysnT9ElXXpBHl4^Rvp8z?b& zRH#Lqi492^ZQc zP|E?Lpv(YUA#igQx?u=F3P=Z>L4{fp?vL|WWFSo-Hn0#>&P2X~*Z|)`GYKRVlzxzb z00Dpn3ek=rur(4Uh%V3^#K5AjqM;Mf4A#?+M6-+{$M2h}efj zL)?D&PjchGk;fpW2J@jW$s<$Xjv)$ugGwKIEASNqC{YOq zKo=VX6wzjbCLEM-kfETF&7lFFAdf@W8s>vClSPGw4cs4Rk$FTx4b>QQBcL9HA|1LN zI70Lapg%zL)S&AKZ7ZNQxIYT0g}W;_3rk0eqnIHGO}A#^!Oz(_8>(W@B&?m&@Wo zC_^@bNQ20Mniy(4Xm?Qo_i!&6?smW;z?L9HK}|s3f*YB?S^xjKQTHD)_wTEj|K>tK zwxEgORxk%zRnSy|uhGDFMW*jXfrEcbPeAtX7vOOmdaWq=mHA>eeA6d|Z*G7a7%U@+ z!5dMMjDQeH0A3M)iUK0j&%5FE{6DV`z-x^^V+7 KnB%xAhaA9*@Iu;>SQifYb?J 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 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/tm1d-hp/assets/logo.png b/decoders/connector/atim/tm1d-hp/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..02e5783a6d4686e204f1c8fdefc41fb7030470b2 GIT binary patch literal 62101 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 z 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/tm1d-hp/connector.jsonc b/decoders/connector/atim/tm1d-hp/connector.jsonc new file mode 100644 index 00000000..d917ae3a --- /dev/null +++ b/decoders/connector/atim/tm1d-hp/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim TM1D-HP", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/tm1d-hp/description.md b/decoders/connector/atim/tm1d-hp/description.md new file mode 100644 index 00000000..b11dc5c2 --- /dev/null +++ b/decoders/connector/atim/tm1d-hp/description.md @@ -0,0 +1 @@ +Temperature sensor over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/tm1d-hp/v1.0.0/payload-config.jsonc b/decoders/connector/atim/tm1d-hp/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..22a328b6 --- /dev/null +++ b/decoders/connector/atim/tm1d-hp/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-TM1D-HP monitors and transmits one remote temperature. The sensor has 1 external digital probe. Data transmission at regular intervals configurable as required through the ACW configurator. Compatible with Sigfox repeater (ACW-GW).\n\n**Technical Data**\n* Dimensions: 160 x 53 x 53 mm\n* Antenna: Integrated (¼ wave)\n* Temperature probe: Digital - Cable length: 2 m\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall, tube or pole, DIN rail\n* Housing: IP65\n* Power supply: 2x battery-packs (14,4 Ah)\n* Weight: 210g\n* Frequency: 865-870 MHz\n* Power: 25 mW (14 dBm)\n* Transfer rate: Sigfox: 100 bit/s, LoRaWAN: 300 bit/s to 10 kbit/s\n\n**Temperature Sensor**\n* Range: -55°C to +125°C\n* Resolution: 0.5°C (9 bits)\n* Precision from -55°C to -10°C: +/- 2°C\n* Precision from -10°C to +85°C: +/- 0.5°C\n* Precision from +85°C to +125°C: +/- 2°C", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/tm1d-hp/v1.0.0/payload.js b/decoders/connector/atim/tm1d-hp/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/tm1d-hp/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/tm1p/assets/logo.png b/decoders/connector/atim/tm1p/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2a53278ec58a86034f89b2b9d966a036b34763 GIT binary patch literal 45958 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/tm1p/connector.jsonc b/decoders/connector/atim/tm1p/connector.jsonc new file mode 100644 index 00000000..965fd4ed --- /dev/null +++ b/decoders/connector/atim/tm1p/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim TM1P", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/tm1p/description.md b/decoders/connector/atim/tm1p/description.md new file mode 100644 index 00000000..b11dc5c2 --- /dev/null +++ b/decoders/connector/atim/tm1p/description.md @@ -0,0 +1 @@ +Temperature sensor over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/tm1p/v1.0.0/payload-config.jsonc b/decoders/connector/atim/tm1p/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..8f692f0f --- /dev/null +++ b/decoders/connector/atim/tm1p/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-TM1P monitors and transmits one remote temperature. The sensor has 1 external PT100/PT1000 analog probe. Data transmission at regular intervals configurable as required through the ACW configurator. Compatible with Sigfox repeater (ACW-GW).\n\n**Technical Data**\n* Dimensions: 154 x 54 x 54 mm\n* Antenna: Integrated (¼ wave)\n* Temperature probe: 1 analog probe PT100 or PT1000\n* Temperature: -25°C to +70°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall, tube or mast, DIN rail\n* Housing: IP65\n* Power supply: 2x battery-packs (14,4 Ah)\n* Weight: 305g\n* Frequency: 863-870 MHz\n* Power: 25 mW (14 dBm)\n* Transfer rate: Sigfox: 100 bit/s, LoRaWAN: 300 bit/s to 10 kbit/s\n\n**Temperature Sensor**\n* Range: -327.68°C to +327.67°C\n* Resolution: 0.05°C\n* Precision from -25°C to +70°C (Operating range): 0.5 (Data applicable to 2-wire probes)", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/tm1p/v1.0.0/payload.js b/decoders/connector/atim/tm1p/v1.0.0/payload.js new file mode 100644 index 00000000..de52b1ad --- /dev/null +++ b/decoders/connector/atim/tm1p/v1.0.0/payload.js @@ -0,0 +1,644 @@ +/* eslint-disable guard-for-in */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-plusplus */ +/* eslint-disable no-case-declarations */ +/* eslint-disable no-bitwise */ +/* eslint-disable no-nested-ternary */ +function decodeStream(payload, timestamp, latitude, longitude) { + // Init result + let result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = data; + + // Get message ID + const header = parseInt(payload.substring(0, 2), 16); + if (((header << 2) & 255) >> 7 === 1) { + result = DecodeMesureFrame(payload, time); + } else { + result = DecodeCommonFrame(payload, time); + } + + if (header === 129) { + result.realTimes.push({ tagRef: "p_batteryVoltage_empty", timestamp: time, tagValue: String(parseInt(payload.substr(2, 4), 16) / 1000) }); + result.realTimes.push({ tagRef: "p_batteryVoltage_inCharge", timestamp: time, tagValue: String(parseInt(payload.substr(6, 4), 16) / 1000) }); + } + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* + if (data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(data.raw) }); + } + if (metadata !== undefined) { + if (metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(metadata.device.name) }); + } + if (metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(metadata.endpoint.type) }); + } + if (metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(metadata.network.linkQuality) }); + } */ + if (latitude !== undefined && longitude !== undefined) { + // result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: latitude, unit: "°" }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: longitude, unit: "°" }); + // result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(metadata.location.accuracy) }); + } + /* } + + if (metadata.endpoint !== undefined) { + // if KHEIRON + if (metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.fcnt) }); + } + // if SIGFOX + if (metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.seqNumber) }); + } + // if OBJENIOUS + if (metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(data.raw.device_properties.deveui) }); + } + } + */ + + return result; +} + +function DecodeCommonFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + + // calcul of the starting index + let startingIndex = 2 + horodatage * 8; + + // get frame type + const frameType = ((parseInt(payload.substring(0, 2), 16) << 4) & 255) >> 4; + + // keep alive frame + if (frameType === 1) { + result.realTimes.push({ + tagRef: "p_keepAlive", + timestamp: time, + tagValue: String(1), + }); + } + + // threshold alarm + if (frameType === 13 || frameType === 5) { + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const alertType_voie = header_voie >> 6; + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + + // get calculated table of events + const eventTab = getThresholdEvents(mesureType_voie, alertType_voie, number_voie, horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time); + + // add table event into events + result.events = result.events.concat(eventTab); + + // increase index + startingIndex += mesureSize_voie; + } else { + return result; + } + } + } + + // general alarm + if (frameType === 14) { + // get header informations of each voie + const header_error = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const length_error = ((header_error << 3) & 255) >> 3; + + // increase starting index + startingIndex += 2; + + for (let e = 0; e < length_error; e++) { + // get error and add log into realtimes table + result.realTimes.push( + getError(parseInt(payload.substring(startingIndex, startingIndex + 2), 16), horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time) + ); + + // increase starting index + startingIndex += 2; + } + } + + if (frameType === 15) { + if (parseInt(payload.substring(startingIndex, startingIndex + 2), 16) === 28) { + // add wirecut into realtimes table + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time, + tagValue: String(parseInt(payload.substring(startingIndex + 2, startingIndex + 4), 16) === 1 ? 0 : 1), + }); + } + } + return result; +} + +function DecodeMesureFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + const profondeur = (((parseInt(payload.substring(0, 2), 16) << 3) & 255) >> 6) + 1; + const nb_echantillons = (((parseInt(payload.substring(0, 2), 16) << 5) & 255) >> 5) + 1; + const period = profondeur > 1 || nb_echantillons > 1 ? parseInt(payload.substring(2 + horodatage * 8, 6 + horodatage * 8), 16) : 0; + // calcul of the starting index + let startingIndex = 2 + horodatage * 8 + (profondeur > 1 || nb_echantillons > 1) * 4; + + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // iterate on each mesure + + for (let i = 0; i < profondeur * nb_echantillons; i++) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + if (i === 0) { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + } else { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage + ? new Date((parseInt(payload.substring(2, 10), 16) - (period / nb_echantillons) * 60 * i) * 1000).getTime() + : new Date((time - (period / nb_echantillons) * 60 * i) * 1000).getTime() + ); + + // add table log into historics + result.historics = result.historics.concat(calculatedMesureTab); + } + + // increase index + startingIndex += mesureSize_voie; + } + } else { + return result; + } + } + + return result; +} + +function getMesureSize(mesureType) { + switch (mesureType) { + case 1: + return 2; + case 2: + case 3: + case 7: + case 8: + case 9: + case 10: + case 11: + return 4; + case 4: + return 8; + default: + return 0; + } +} + +function getCalculatedMesure(mesure, mesureType, number_voie, date) { + switch (mesureType) { + case 1: + case 2: + const tab = []; + const mesureString = `0000000${mesure.toString(2)}`.slice(-8); + for (let i = 1; i < mesureString.length + 1; i++) { + tab.push({ + tagRef: `p_DI${i}_${number_voie}`, + timestamp: date, + tagValue: String(mesureString[mesureString.length - i]), + }); + } + return tab; + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + case 7: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 10: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 11: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 8: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + case 9: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + default: + return []; + } +} + +function getThresholdEvents(mesureType, alertType, number_voie, date) { + switch (mesureType) { + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_count_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 7: + return [ + { + tagRef: `p_mm_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mm_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 10: + return [ + { + tagRef: `p_mV_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mV_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 11: + return [ + { + tagRef: `p_uA_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_uA_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 8: + return [ + { + tagRef: `p_temperature_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_temperature_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 9: + return [ + { + tagRef: `p_humidity_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_humidity_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + default: + return []; + } +} + +function getError(error_code, date) { + let ref; + switch (error_code) { + case 0: + ref = "p_ERR_BUF_SMALLER"; + break; + case 1: + ref = "p_ERR_DEPTH_HISTORIC_OUT_OF_RANGE"; + break; + case 2: + ref = "p_ERR_NB_SAMPLE_OUT_OF_RANGE"; + break; + case 3: + ref = "p_ERR_NWAY_OUT_OF_RANGE"; + break; + case 4: + ref = "p_ERR_TYPEWAY_OUT_OF_RANGE"; + break; + case 5: + ref = "p_ERR_SAMPLING_PERIOD"; + break; + case 6: + ref = "p_ERR_KEEP_ALIVE_PERIOD"; + break; + case 7: + ref = "p_ERR_SUBTASK_END"; + break; + case 8: + ref = "p_ERR_NULL_POINTER"; + break; + case 9: + ref = "p_ERR_BATTERY_LEVEL_LOW"; + break; + case 10: + ref = "p_ERR_BATTERY_LEVEL_DEAD"; + break; + case 11: + ref = "p_ERR_EEPROM"; + break; + case 12: + ref = "p_ERR_ROM"; + break; + case 13: + ref = "p_ERR_RAM"; + break; + case 14: + ref = "p_ERR_SENSORS_TIMEOUT"; + break; + case 15: + ref = "p_ERR_SENSOR_STOP"; + break; + case 16: + ref = "p_ERR_SENSORS_FAIL"; + break; + case 17: + ref = "p_ERR_ARM_INIT_FAIL"; + break; + case 18: + ref = "p_ERR_ARM_PAYLOAD_BIGGER"; + break; + case 19: + ref = "p_ERR_ARM_BUSY"; + break; + case 20: + ref = "p_ERR_ARM_BRIDGE_ENABLE"; + break; + case 21: + ref = "p_ERR_ARM_TRANSMISSION"; + break; + case 22: + ref = "p_ERR_RADIO_QUEUE_FULL"; + break; + case 23: + ref = "p_ERR_CFG_BOX_INIT_FAIL"; + break; + case 24: + ref = "p_ERR_BOX_OPENED"; + break; + default: + return undefined; + } + + return { + tagRef: ref, + timestamp: date, + tagValue: String(1), + }; +} + +// eslint-disable-next-line no-unused-vars +function ToTagoFormat(object_item, serie, prefix = "") { + const historics = []; + const events = []; + const realTimes = []; + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "data", value: { timestamp: 1605614318410, payload: "810d240c68", raw: { seqNumber: 123 } } }, + { + variable: "metadata", + value: { + endpoint: { name: "sigfox", type: 5 }, + network: { port: 95, linkQuality: 100 }, + location: { source: "my_head", latitude: "-38°", longitude: "-18°", accuracy: 95 }, + device: { name: "TM1P", serialNumber: "01101011" }, + }, + }, +]; */ +/* +let payload = [ + { variable: "data", value: "a1000211aabb220055006633000300044400000004000000055700050006682221222279777777788a000800099b0009000a" }, + { variable: "timestamp", value: 1605614318410 }, + { variable: "latitude", value: -38 }, + { variable: "longitude", value: -18 }, +]; +*/ +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const timestamp = payload.find((x) => x.variable === "timestamp"); +const latitude = payload.find((x) => x.variable === "latitude"); +const longitude = payload.find((x) => x.variable === "longitude"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + payload = ToTagoFormat(decodeStream(data.value, timestamp.value, latitude.value, longitude.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/tm2d-hp/assets/logo.png b/decoders/connector/atim/tm2d-hp/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..83e95ea2cdf5c704d174fc0684ee5d0fbbacbb66 GIT binary patch literal 74767 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 o_Srt$XZviQ?X!Kh�aM53I5I> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/tm2p/assets/logo.png b/decoders/connector/atim/tm2p/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..62fe8bda7147879bddfa3aca4116e832c1919ba0 GIT binary patch literal 52331 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 WaBChEJ+M9i0000> 7 === 1) { + result = DecodeMesureFrame(payload, time); + } else { + result = DecodeCommonFrame(payload, time); + } + + if (header === 129) { + result.realTimes.push({ tagRef: "p_batteryVoltage_empty", timestamp: time, tagValue: String(parseInt(payload.substr(2, 4), 16) / 1000) }); + result.realTimes.push({ tagRef: "p_batteryVoltage_inCharge", timestamp: time, tagValue: String(parseInt(payload.substr(6, 4), 16) / 1000) }); + } + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* + if (data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(data.raw) }); + } + if (metadata !== undefined) { + if (metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(metadata.device.name) }); + } + if (metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(metadata.endpoint.type) }); + } + if (metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(metadata.network.linkQuality) }); + } */ + if (latitude !== undefined && longitude !== undefined) { + // result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: latitude, unit: "°" }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: longitude, unit: "°" }); + // result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(metadata.location.accuracy) }); + } + /* } + + if (metadata.endpoint !== undefined) { + // if KHEIRON + if (metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.fcnt) }); + } + // if SIGFOX + if (metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.seqNumber) }); + } + // if OBJENIOUS + if (metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(data.raw.count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(data.raw.device_properties.deveui) }); + } + } + */ + + return result; +} + +function DecodeCommonFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + + // calcul of the starting index + let startingIndex = 2 + horodatage * 8; + + // get frame type + const frameType = ((parseInt(payload.substring(0, 2), 16) << 4) & 255) >> 4; + + // keep alive frame + if (frameType === 1) { + result.realTimes.push({ + tagRef: "p_keepAlive", + timestamp: time, + tagValue: String(1), + }); + } + + // threshold alarm + if (frameType === 13 || frameType === 5) { + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const alertType_voie = header_voie >> 6; + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + + // get calculated table of events + const eventTab = getThresholdEvents(mesureType_voie, alertType_voie, number_voie, horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time); + + // add table event into events + result.events = result.events.concat(eventTab); + + // increase index + startingIndex += mesureSize_voie; + } else { + return result; + } + } + } + + // general alarm + if (frameType === 14) { + // get header informations of each voie + const header_error = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const length_error = ((header_error << 3) & 255) >> 3; + + // increase starting index + startingIndex += 2; + + for (let e = 0; e < length_error; e++) { + // get error and add log into realtimes table + result.realTimes.push( + getError(parseInt(payload.substring(startingIndex, startingIndex + 2), 16), horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time) + ); + + // increase starting index + startingIndex += 2; + } + } + + if (frameType === 15) { + if (parseInt(payload.substring(startingIndex, startingIndex + 2), 16) === 28) { + // add wirecut into realtimes table + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time, + tagValue: String(parseInt(payload.substring(startingIndex + 2, startingIndex + 4), 16) === 1 ? 0 : 1), + }); + } + } + return result; +} + +function DecodeMesureFrame(payload, time) { + // Init result + const result = { + historics: [], + events: [], + realTimes: [], + }; + + // get bit values + const horodatage = ((parseInt(payload.substring(0, 2), 16) << 1) & 255) >> 7; + const profondeur = (((parseInt(payload.substring(0, 2), 16) << 3) & 255) >> 6) + 1; + const nb_echantillons = (((parseInt(payload.substring(0, 2), 16) << 5) & 255) >> 5) + 1; + const period = profondeur > 1 || nb_echantillons > 1 ? parseInt(payload.substring(2 + horodatage * 8, 6 + horodatage * 8), 16) : 0; + // calcul of the starting index + let startingIndex = 2 + horodatage * 8 + (profondeur > 1 || nb_echantillons > 1) * 4; + + while (startingIndex < payload.length) { + // get header informations of each voie + const header_voie = parseInt(payload.substring(startingIndex, startingIndex + 2), 16); + const number_voie = ((header_voie << 2) & 255) >> 6; + const mesureType_voie = ((header_voie << 4) & 255) >> 4; + const mesureSize_voie = getMesureSize(mesureType_voie); + + // increase starting index + startingIndex += 2; + + // check if the size is different than 0 + if (mesureSize_voie !== 0) { + // iterate on each mesure + + for (let i = 0; i < profondeur * nb_echantillons; i++) { + // get mesure + const mesure = parseInt(payload.substring(startingIndex, startingIndex + mesureSize_voie), 16); + + if (i === 0) { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage ? new Date(parseInt(payload.substring(2, 10), 16) * 1000).getTime() : time + ); + + // add table log into realtimes + result.realTimes = result.realTimes.concat(calculatedMesureTab); + } else { + // get calculated table of log + const calculatedMesureTab = getCalculatedMesure( + mesure, + mesureType_voie, + number_voie, + horodatage + ? new Date((parseInt(payload.substring(2, 10), 16) - (period / nb_echantillons) * 60 * i) * 1000).getTime() + : new Date((time - (period / nb_echantillons) * 60 * i) * 1000).getTime() + ); + + // add table log into historics + result.historics = result.historics.concat(calculatedMesureTab); + } + + // increase index + startingIndex += mesureSize_voie; + } + } else { + return result; + } + } + + return result; +} + +function getMesureSize(mesureType) { + switch (mesureType) { + case 1: + return 2; + case 2: + case 3: + case 7: + case 8: + case 9: + case 10: + case 11: + return 4; + case 4: + return 8; + default: + return 0; + } +} + +function getCalculatedMesure(mesure, mesureType, number_voie, date) { + switch (mesureType) { + case 1: + case 2: + const tab = []; + const mesureString = `0000000${mesure.toString(2)}`.slice(-8); + for (let i = 1; i < mesureString.length + 1; i++) { + tab.push({ + tagRef: `p_DI${i}_${number_voie}`, + timestamp: date, + tagValue: String(mesureString[mesureString.length - i]), + }); + } + return tab; + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + case 7: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mm_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 10: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_mV_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 11: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(((mesure ^ 65535) + 1) * -1), + }, + ]; + } + return [ + { + tagRef: `p_uA_${number_voie}`, + timestamp: date, + tagValue: String(mesure), + }, + ]; + + case 8: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_temperature_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + case 9: + if (mesure >> 15 === 1) { + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String((((mesure ^ 65535) + 1) / 100) * -1), + }, + ]; + } + return [ + { + tagRef: `p_humidity_${number_voie}`, + timestamp: date, + tagValue: String(mesure / 100), + }, + ]; + + default: + return []; + } +} + +function getThresholdEvents(mesureType, alertType, number_voie, date) { + switch (mesureType) { + case 3: + case 4: + return [ + { + tagRef: `p_count_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_count_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 7: + return [ + { + tagRef: `p_mm_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mm_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 10: + return [ + { + tagRef: `p_mV_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_mV_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 11: + return [ + { + tagRef: `p_uA_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_uA_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 8: + return [ + { + tagRef: `p_temperature_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_temperature_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + case 9: + return [ + { + tagRef: `p_humidity_${number_voie}_high_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 1 ? 1 : 0), + context: [], + }, + { + tagRef: `p_humidity_${number_voie}_low_alm`, + timestamp: date, + tagValue: String(alertType === 0 ? 0 : alertType === 2 ? 1 : 0), + context: [], + }, + ]; + default: + return []; + } +} + +function getError(error_code, date) { + let ref; + switch (error_code) { + case 0: + ref = "p_ERR_BUF_SMALLER"; + break; + case 1: + ref = "p_ERR_DEPTH_HISTORIC_OUT_OF_RANGE"; + break; + case 2: + ref = "p_ERR_NB_SAMPLE_OUT_OF_RANGE"; + break; + case 3: + ref = "p_ERR_NWAY_OUT_OF_RANGE"; + break; + case 4: + ref = "p_ERR_TYPEWAY_OUT_OF_RANGE"; + break; + case 5: + ref = "p_ERR_SAMPLING_PERIOD"; + break; + case 6: + ref = "p_ERR_KEEP_ALIVE_PERIOD"; + break; + case 7: + ref = "p_ERR_SUBTASK_END"; + break; + case 8: + ref = "p_ERR_NULL_POINTER"; + break; + case 9: + ref = "p_ERR_BATTERY_LEVEL_LOW"; + break; + case 10: + ref = "p_ERR_BATTERY_LEVEL_DEAD"; + break; + case 11: + ref = "p_ERR_EEPROM"; + break; + case 12: + ref = "p_ERR_ROM"; + break; + case 13: + ref = "p_ERR_RAM"; + break; + case 14: + ref = "p_ERR_SENSORS_TIMEOUT"; + break; + case 15: + ref = "p_ERR_SENSOR_STOP"; + break; + case 16: + ref = "p_ERR_SENSORS_FAIL"; + break; + case 17: + ref = "p_ERR_ARM_INIT_FAIL"; + break; + case 18: + ref = "p_ERR_ARM_PAYLOAD_BIGGER"; + break; + case 19: + ref = "p_ERR_ARM_BUSY"; + break; + case 20: + ref = "p_ERR_ARM_BRIDGE_ENABLE"; + break; + case 21: + ref = "p_ERR_ARM_TRANSMISSION"; + break; + case 22: + ref = "p_ERR_RADIO_QUEUE_FULL"; + break; + case 23: + ref = "p_ERR_CFG_BOX_INIT_FAIL"; + break; + case 24: + ref = "p_ERR_BOX_OPENED"; + break; + default: + return undefined; + } + + return { + tagRef: ref, + timestamp: date, + tagValue: String(1), + }; +} + +// eslint-disable-next-line no-unused-vars +function ToTagoFormat(object_item, serie, prefix = "") { + const historics = []; + const events = []; + const realTimes = []; + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "data", value: { timestamp: 1605614318410, payload: "810d240c68", raw: { seqNumber: 123 } } }, + { + variable: "metadata", + value: { + endpoint: { name: "sigfox", type: 5 }, + network: { port: 95, linkQuality: 100 }, + location: { source: "my_head", latitude: "-38°", longitude: "-18°", accuracy: 95 }, + device: { name: "TM1P", serialNumber: "01101011" }, + }, + }, +]; */ +/* +let payload = [ + { variable: "data", value: "a1000211aabb220055006633000300044400000004000000055700050006682221222279777777788a000800099b0009000a" }, + { variable: "timestamp", value: 1605614318410 }, + { variable: "latitude", value: -38 }, + { variable: "longitude", value: -18 }, +]; +*/ +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const timestamp = payload.find((x) => x.variable === "timestamp"); +const latitude = payload.find((x) => x.variable === "latitude"); +const longitude = payload.find((x) => x.variable === "longitude"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + payload = ToTagoFormat(decodeStream(data.value, timestamp.value, latitude.value, longitude.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/to-g/assets/logo.png b/decoders/connector/atim/to-g/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67b986e911cb7abe072ce7f55d7bb71602be601d GIT binary patch literal 63187 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/to-g/connector.jsonc b/decoders/connector/atim/to-g/connector.jsonc new file mode 100644 index 00000000..7c7c828a --- /dev/null +++ b/decoders/connector/atim/to-g/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim TO-G", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/to-g/description.md b/decoders/connector/atim/to-g/description.md new file mode 100644 index 00000000..e4eb7376 --- /dev/null +++ b/decoders/connector/atim/to-g/description.md @@ -0,0 +1 @@ +Outdoor Temperature + GPS sensor over LoRaWAN \ No newline at end of file diff --git a/decoders/connector/atim/to-g/v1.0.0/payload-config.jsonc b/decoders/connector/atim/to-g/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..17ca3294 --- /dev/null +++ b/decoders/connector/atim/to-g/v1.0.0/payload-config.jsonc @@ -0,0 +1,25 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-TO-G is a device for measuring the ambient temperature while geolocating it. The case is waterproof, but it let air through. Data is transmitted periodically and in the event of an alert that threshold is exceeded. Ideal for monitoring your equipment on the Web, it is perfectly suited for monitoring buildings in the service sector or industry.\n\n**Technical Data**\n* Dimensions: 100 x 100 x 35 mm\n* Antenna: Integrated (¼ wave)\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall\n* Housing: PVC IP66 Compact\n* Power supply: 2x AA lithium batteries\n* Weight: 100g\n* Frequency: 865-870 MHz\n* Power: 25 mW (14 dBm)\n* Transfer rate: Local 1.2 to 115 kbit/s, LoRaWAN 300 bit/s to 10 kbit/s", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/to-g/v1.0.0/payload.js b/decoders/connector/atim/to-g/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/to-g/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/tst/assets/logo.png b/decoders/connector/atim/tst/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5c81514492faa1b90a3ee5ad08610fd1ac0c2384 GIT binary patch literal 38857 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 z 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/tst/connector.jsonc b/decoders/connector/atim/tst/connector.jsonc new file mode 100644 index 00000000..b620309f --- /dev/null +++ b/decoders/connector/atim/tst/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim TST", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/tst/description.md b/decoders/connector/atim/tst/description.md new file mode 100644 index 00000000..ae8a05f6 --- /dev/null +++ b/decoders/connector/atim/tst/description.md @@ -0,0 +1 @@ +Network coverage quality tester over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/tst/v1.0.0/payload-config.jsonc b/decoders/connector/atim/tst/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..4d2461cd --- /dev/null +++ b/decoders/connector/atim/tst/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "This tester enables you to accurately evaluate the LoRaWAN/Sigfox network coverage quality. A multicolored LED displays a color according to the coverage quality at your location. Test frames emitted by the push of the central button are visible on our Platform, and on your national LoRaWAN/Sigfox operator’s backend. Very useful for discovering and mastering LPWAN technologies and the realization of \"Proof of Concept\".\n\n**Technical Data**\n* Dimensions: 90 x 45 x 15 mm\n* Housing: Plastic\n* Power supply: Internal LiPo Battery 325mAh, rechargeable via micro USB port (micro USB wire not included)\n* Weight: 30g\n* Frequency: 868 MHz\n* Power: 25 mW (14 dBm)\n", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/tst/v1.0.0/payload.js b/decoders/connector/atim/tst/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/tst/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); diff --git a/decoders/connector/atim/wl/assets/logo.png b/decoders/connector/atim/wl/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..318570b8f348858e8f711ad3dbacbeaca435d369 GIT binary patch literal 50590 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 literal 0 HcmV?d00001 diff --git a/decoders/connector/atim/wl/connector.jsonc b/decoders/connector/atim/wl/connector.jsonc new file mode 100644 index 00000000..d4101e39 --- /dev/null +++ b/decoders/connector/atim/wl/connector.jsonc @@ -0,0 +1,13 @@ +{ + "$schema": "../../../../schema/connector.json", + "name": "Atim WL", + "images": { + "logo": "./assets/logo.png" + }, + "versions": { + "v1.0.0": { + "src": "./v1.0.0/payload.js", + "manifest": "./v1.0.0/payload-config.jsonc" + } + } +} diff --git a/decoders/connector/atim/wl/description.md b/decoders/connector/atim/wl/description.md new file mode 100644 index 00000000..3ae22aea --- /dev/null +++ b/decoders/connector/atim/wl/description.md @@ -0,0 +1 @@ +Leakage detection sensor over LoRaWAN or Sigfox \ No newline at end of file diff --git a/decoders/connector/atim/wl/v1.0.0/payload-config.jsonc b/decoders/connector/atim/wl/v1.0.0/payload-config.jsonc new file mode 100644 index 00000000..57411067 --- /dev/null +++ b/decoders/connector/atim/wl/v1.0.0/payload-config.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "../../../../../schema/connector_details.json", + "description": "../description.md", + "install_text": "The ACW-WL allows to remotely prevent floods harsh consequences. The sensor detects when the level is critical and sends to the alert to the LPWAN networks.\nSupplied with a ½ wave antenna with 4m cable, a keep alive frame is sent once a week. LED display when radio transmission takes place. By default, the device is set on 3 flood detection a day. Compatible with Sigfox repeater (ACW-GW).\n\n**Technical Data**\n* Dimensions: 160 x 53 x 53 mm\n* Antenna: Integrated (¼ wave)\n* Temperature probe: Digital - Cable length: 2 m\n* Temperature: -20°C to +55°C (operation), -40°C to +70°C (storage)\n* Mounts to: Wall, tube or pole, DIN rail\n* Housing: IP65\n* Power supply: 2x battery-packs (14,4 Ah)\n* Weight: 210g\n* Frequency: 865-870 MHz\n* Power: 25 mW (14 dBm)\n* Transfer rate: Sigfox: 100 bit/s, LoRaWAN: 300 bit/s to 10 kbit/s", + "install_end_text": "", + "device_annotation": "", + "device_parameters": [], + "networks": [ + "../../../../network/lorawan-actility/v1.0.0/payload.js", + "../../../../network/lorawan-chirpstack/v1.0.0/payload.js", + "../../../../network/lorawan-citykinect/v1.0.0/payload.js", + "../../../../network/lorawan-everynet/v1.0.0/payload.js", + "../../../../network/lorawan-kerlink/v1.0.0/payload.js", + "../../../../network/lorawan-loriot-/v1.0.0/payload.js", + "../../../../network/lorawan-machineq/v1.0.0/payload.js", + "../../../../network/lorawan-orbiwise/v1.0.0/payload.js", + "../../../../network/lorawan-senet/v1.0.0/payload.js", + "../../../../network/lorawan-senra/v1.0.0/payload.js", + "../../../../network/lorawan-swisscom/v1.0.0/payload.js", + "../../../../network/lorawan-tektelic/v1.0.0/payload.js", + "../../../../network/lorawan-ttittn-v3/v1.0.0/payload.js", + "../../../../network/sigfox/v1.0.0/payload.js", + "../../../../network/lorawan-helium/v1.0.0/payload.js", + "../../../../network/lorawan-brdot-/v1.0.0/payload.js" + ] +} \ No newline at end of file diff --git a/decoders/connector/atim/wl/v1.0.0/payload.js b/decoders/connector/atim/wl/v1.0.0/payload.js new file mode 100644 index 00000000..58709750 --- /dev/null +++ b/decoders/connector/atim/wl/v1.0.0/payload.js @@ -0,0 +1,1332 @@ +/* eslint-disable no-plusplus */ +/* eslint-disable no-bitwise */ +function decodeStream(payload, type, timestamp) { + // Init result + const result = { historics: [], events: [], realTimes: [] }; + + // Parse stream + // const jsonStream = JSON.parse(stream); + + // Get time and payload + // const time = new Date(jsonStream.data.timestamp * 1000) / 1000; + const time = new Date(timestamp * 1000) / 1000; + // const { payload } = jsonStream.data; + + // Save network informations + result.realTimes.push({ tagRef: "sys_data_payload", timestamp: time, tagValue: String(payload) }); + result.realTimes.push({ tagRef: "sys_data_timestamp", timestamp: time, tagValue: String(time) }); + /* if (jsonStream.data !== undefined) { + result.realTimes.push({ tagRef: "sys_data_type", timestamp: time, tagValue: String(jsonStream.data.type) }); + result.realTimes.push({ tagRef: "sys_data_raw", timestamp: time, tagValue: String(jsonStream.data.raw) }); + } + if (jsonStream.metadata !== undefined) { + result.realTimes.push({ tagRef: "sys_metadata_lastStreamTimestampUtc", timestamp: time, tagValue: String(jsonStream.metadata.lastStreamTimestampUtc) }); + if (jsonStream.metadata.device !== undefined) { + result.realTimes.push({ tagRef: "sys_device_sn", timestamp: time, tagValue: String(jsonStream.metadata.device.serialNumber) }); + result.realTimes.push({ tagRef: "sys_device_name", timestamp: time, tagValue: String(jsonStream.metadata.device.name) }); + } + if (jsonStream.metadata.endpoint !== undefined) { + result.realTimes.push({ tagRef: "sys_endpoint_name", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.name) }); + result.realTimes.push({ tagRef: "sys_endpoint_type", timestamp: time, tagValue: String(jsonStream.metadata.endpoint.type) }); + } + if (jsonStream.metadata.network !== undefined) { + result.realTimes.push({ tagRef: "sys_network_port", timestamp: time, tagValue: String(jsonStream.metadata.network.port) }); + result.realTimes.push({ tagRef: "sys_network_linkQuality", timestamp: time, tagValue: String(jsonStream.metadata.network.linkQuality) }); + } + if (jsonStream.metadata.location !== undefined) { + result.realTimes.push({ tagRef: "sys_location_source", timestamp: time, tagValue: String(jsonStream.metadata.location.source) }); + result.realTimes.push({ tagRef: "sys_location_latitude", timestamp: time, tagValue: String(jsonStream.metadata.location.latitude) }); + result.realTimes.push({ tagRef: "sys_location_longitude", timestamp: time, tagValue: String(jsonStream.metadata.location.longitude) }); + result.realTimes.push({ tagRef: "sys_location_accuracy", timestamp: time, tagValue: String(jsonStream.metadata.location.accuracy) }); + } + } */ + if (type !== 3) { + // if KHEIRON + /* if (jsonStream.metadata.endpoint.type === 0) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).fcnt) }); + } + // if SIGFOX + if (jsonStream.metadata.endpoint.type === 5) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).seqNumber) }); + } + // if OBJENIOUS + if (jsonStream.metadata.endpoint.type === 6) { + result.realTimes.push({ tagRef: "custom_data_raw_count", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).count) }); + result.realTimes.push({ tagRef: "custom_data_raw_devEUI", timestamp: time, tagValue: String(JSON.parse(jsonStream.data.raw).device_properties.deveui) }); + } + */ + // Get message ID + const msgStr = parseInt(payload.substring(0, 2), 16); + + // Switch message ids + switch (msgStr) { + case 1: { + // Get meter + const battery = parseInt(payload.substring(2, 6), 16); + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery / 1000), + }); + + break; + } + case 3: { + // Get data + const battery = parseInt(payload.substring(2, 4), 16); + let temperature = parseInt(payload.substring(4, 8), 16); + const humidity = parseInt(payload.substring(8, 12), 16); + + // check if negative value + if (temperature >> 15 === 1) { + const reverseValue = temperature ^ 65535; + temperature = (reverseValue + 1) * -1; + } + + result.realTimes.push({ + tagRef: "p_battery", + timestamp: time, + tagValue: String(battery), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temperature / 100), + }); + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity / 100), + }); + break; + } + case 5: { + const testCounter = parseInt(payload.substring(2, 4), 16); + + result.realTimes.push({ + tagRef: "p_test", + timestamp: time, + tagValue: String(testCounter), + }); + + break; + } + case 9: { + // Get input + const di = parseInt(payload.substring(4, 6), 16); + const di1 = (di & 1) === 1; + const di2 = (di & 2) === 2; + + // get ouput + const dout = parseInt(payload.substring(2, 4), 16); + const do1 = (dout & 1) === 1; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DO1", + timestamp: time, + tagValue: String(do1), + }); + + break; + } + case 10: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + break; + } + case 11: { + break; + } + case 12: { + break; + } + case 13: { + break; + } + case 14: { + break; + } + case 21: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // Decode + temp = (temp - 33184) / 128; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + break; + } + case 20: { + // Get meter + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 48: { + // get realtime meter + const meter = parseInt(payload.substring(42, 50), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + + // get historic meter + const meter1 = parseInt(payload.substring(34, 42), 16); + const meter2 = parseInt(payload.substring(26, 34), 16); + const meter3 = parseInt(payload.substring(18, 26), 16); + const meter4 = parseInt(payload.substring(10, 18), 16); + const meter5 = parseInt(payload.substring(2, 10), 16); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 1) / 1000, + tagValue: String(meter1), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 2) / 1000, + tagValue: String(meter2), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 3) / 1000, + tagValue: String(meter3), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 4) / 1000, + tagValue: String(meter4), + }); + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - 600000 * 5) / 1000, + tagValue: String(meter5), + }); + + break; + } + case 49: { + // get realtime meter + const meter = parseInt(payload.substring(2, 10), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter), + }); + break; + } + case 55: { + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + break; + } + case 57: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // const a = new Date(time * 1000); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (600000 + i * 600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 58: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (1800000 + i * 1800000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 59: { + // get realtime meter + let meter1 = parseInt(payload.substring(2, 7), 16); + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + // get historic meter + for (let i = 0; i < 5; i++) { + // remove delta from reference meter + meter1 -= parseInt(payload.substring(7 + i * 3, 10 + i * 3), 16); + + // add to historics (remove 10min to the date of the reference meter) + result.historics.push({ + tagRef: "p_count1", + timestamp: new Date(time * 1000 - (3600000 + i * 3600000)) / 1000, + tagValue: String(meter1), + }); + } + break; + } + case 22: { + // Get meter + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 4) === 4; + const di2 = (di & 8) === 8; + const di3 = (di & 32) === 32; + const di4 = (di & 128) === 128; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + result.realTimes.push({ + tagRef: "p_DI3", + timestamp: time, + tagValue: String(di3), + }); + + result.realTimes.push({ + tagRef: "p_DI4", + timestamp: time, + tagValue: String(di4), + }); + + const meter1 = parseInt(payload.substring(4, 12), 16); + const meter2 = parseInt(payload.substring(12, 20), 16); + + result.realTimes.push({ + tagRef: "p_wirecut", + timestamp: time, + tagValue: String((parseInt(payload.substring(4, 6), 16) & 1) === 1), + }); + + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(meter1), + }); + + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(meter2), + }); + break; + } + case 15: { + break; + } + case 16: { + break; + } + case 17: { + break; + } + case 18: { + break; + } + case 23: { + // Get temperature & humidity + let temp = parseInt(payload.substring(2, 6), 16); + let humidity = parseInt(payload.substring(6, 10), 16); + + // Decode + temp = (temp * 175.72) / 65536 - 46.85; + humidity = (humidity * 125) / 65536 - 6; + + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + + result.realTimes.push({ + tagRef: "p_humidity", + timestamp: time, + tagValue: String(humidity), + }); + break; + } + case 24: { + break; + } + case 30: { + break; + } + case 31: { + break; + } + case 32: { + break; + } + case 33: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 10 / 64240; + + result.realTimes.push({ + tagRef: "p_voltage", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 25: { + break; + } + case 34: { + break; + } + case 35: { + break; + } + case 36: { + break; + } + case 37: { + // Get input + const di = parseInt(payload.substring(2, 4), 16); + const di1 = (di & 32) === 32; + const di2 = (di & 16) === 16; + + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String(di1), + }); + + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String(di2), + }); + + // Get ana + let ana = parseInt(payload.substring(4, 8), 16); + + // Decode + ana *= 16 / 47584; + result.realTimes.push({ + tagRef: "p_current", + timestamp: time, + tagValue: String(ana), + }); + break; + } + case 27: { + break; + } + case 42: { + break; + } + case 43: { + break; + } + case 44: { + break; + } + case 45: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + break; + } + case 26: { + break; + } + case 38: { + break; + } + case 39: { + break; + } + case 40: { + break; + } + case 41: { + break; + } + case 83: { + break; + } + case 84: { + break; + } + case 85: { + break; + } + case 86: { + break; + } + case 87: { + break; + } + case 88: { + break; + } + case 89: { + break; + } + case 90: { + break; + } + case 91: { + // Get temperature + let temp = parseInt(payload.substring(2, 6), 16); + let temp2 = parseInt(payload.substring(6, 10), 16); + + // check if error + if (temp !== 32768) { + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // apply coef + temp *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp), + }); + } + + // check if error + if (temp2 !== 32768) { + // check if negative value + if (temp2 >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp2 = (reverseValue + 1) * -1; + } + + // apply coef + temp2 *= 0.0625; + + // save + result.realTimes.push({ + tagRef: "p_temperature2", + timestamp: time, + tagValue: String(temp2), + }); + } + + break; + } + case 19: { + // Get water leak state + const waterleak = parseInt(payload.substring(4, 6), 16); + + // save + result.realTimes.push({ + tagRef: "p_waterLeak", + timestamp: time, + tagValue: String(waterleak), + }); + break; + } + case 47: { + // get temperature + const temp = parseInt(payload.substring(14, 18), 16); + const p_temperature = (10.888 - Math.sqrt((-10.888) ** 2 + 4 * 0.00347 * (1777.3 - temp))) / (2 * -0.00347) + 30; + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + + if (parseInt(payload.substring(18, 34), 16) !== 0) { + // get data for gps decoding + const a = parseInt(payload.substring(18, 20), 16) >> 4; + const b = ((parseInt(payload.substring(18, 20), 16) << 4) & 255) >> 4; + const c = parseInt(payload.substring(20, 22), 16) >> 4; + const d = ((parseInt(payload.substring(20, 22), 16) << 4) & 255) >> 4; + const e = parseInt(payload.substring(22, 24), 16) >> 4; + const f = ((parseInt(payload.substring(22, 24), 16) << 4) & 255) >> 4; + const g = parseInt(payload.substring(24, 26), 16) >> 4; + const h = ((parseInt(payload.substring(24, 26), 16) << 4) & 255) >> 4; + const i = parseInt(payload.substring(26, 28), 16) >> 4; + const j = ((parseInt(payload.substring(26, 28), 16) << 4) & 255) >> 4; + const k = parseInt(payload.substring(28, 30), 16) >> 4; + const l = ((parseInt(payload.substring(28, 30), 16) << 4) & 255) >> 4; + const m = parseInt(payload.substring(30, 32), 16) >> 4; + const n = ((parseInt(payload.substring(30, 32), 16) << 4) & 255) >> 4; + const o = parseInt(payload.substring(32, 34), 16) >> 4; + // const p = ((parseInt(payload.substring(32, 34), 16) << 4) & 255) >> 6; + const q = ((parseInt(payload.substring(32, 34), 16) << 6) & 255) >> 7; + const r = ((parseInt(payload.substring(32, 34), 16) << 7) & 255) >> 7; + // get latitude and longitude + const latitude = (2 * q - 1) * (10 * a + b + c / 6 + d / 60 + e / 600 + f / 6000 + g / 60000); + const longitude = (2 * r - 1) * (100 * h + 10 * i + j + k / 6 + l / 60 + m / 600 + n / 6000 + o / 60000); + + // save + result.realTimes.push({ + tagRef: "p_latitude", + timestamp: time, + tagValue: String(latitude), + }); + result.realTimes.push({ + tagRef: "p_longitude", + timestamp: time, + tagValue: String(longitude), + }); + } + + break; + } + case 50: { + const p_vibration = parseInt(payload.substring(4, 6), 16); + const p_ils = parseInt(payload.substring(6, 8), 16); + const p_temperature = (2103 - parseInt(payload.substring(8, 12), 16)) / 10.9; + + // save + result.realTimes.push({ + tagRef: "p_vibration", + timestamp: time, + tagValue: String(p_vibration), + }); + result.realTimes.push({ + tagRef: "p_ils", + timestamp: time, + tagValue: String(p_ils), + }); + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(p_temperature), + }); + break; + } + case 51: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + break; + } + case 52: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get count + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(parseInt(payload.substring(4, 12), 16)), + }); + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(parseInt(payload.substring(12, 20), 16)), + }); + break; + } + case 53: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 54: { + // get DI + result.realTimes.push({ + tagRef: "p_DI1", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 1) === 1), + }); + result.realTimes.push({ + tagRef: "p_DI2", + timestamp: time, + tagValue: String((parseInt(payload.substring(2, 4), 16) & 2) === 2), + }); + + // get ana + result.realTimes.push({ + tagRef: "p_analogic1", + timestamp: time, + tagValue: String((parseInt(payload.substring(6, 10), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic2", + timestamp: time, + tagValue: String((parseInt(payload.substring(10, 14), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic3", + timestamp: time, + tagValue: String((parseInt(payload.substring(14, 18), 16) * 20) / 4095), + }); + result.realTimes.push({ + tagRef: "p_analogic4", + timestamp: time, + tagValue: String((parseInt(payload.substring(18, 22), 16) * 20) / 4095), + }); + break; + } + case 62: { + // Get Absence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(0), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + const valueWorZ = parseInt(payload.substring(10, 14), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + + // Save WorZ + result.realTimes.push({ + tagRef: "p_WorZ", + timestamp: time, + tagValue: String(valueWorZ), + }); + break; + } + case 63: { + // Get Presence + result.realTimes.push({ + tagRef: "p_presence", + timestamp: time, + tagValue: String(1), + }); + + // get values + const valueNorV = parseInt(payload.substring(2, 6), 16); + const valueMorY = parseInt(payload.substring(6, 10), 16); + + // Save NorV + result.realTimes.push({ + tagRef: "p_NorV", + timestamp: time, + tagValue: String(valueNorV), + }); + + // Save MorY + result.realTimes.push({ + tagRef: "p_MorY", + timestamp: time, + tagValue: String(valueMorY), + }); + break; + } + case 65: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + break; + } + case 66: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + coef *= 2; + } + + break; + } + case 67: { + // save + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time - 1, + tagValue: String(1), + context: [], + }); + result.events.push({ + tagRef: "p_choc_alm", + timestamp: time, + tagValue: String(0), + context: [], + }); + break; + } + case 78: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + // get count 1 + const count1 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 79: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(14, 22), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 80: { + // get count 1 + const count1 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + + // get count 2 + const count2 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count2", + timestamp: time, + tagValue: String(count2), + }); + break; + } + case 81: { + // get count 3 + const count3 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count3", + timestamp: time, + tagValue: String(count3), + }); + + // get count 4 + const count4 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count4", + timestamp: time, + tagValue: String(count4), + }); + break; + } + case 82: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get count 1 + const count1 = parseInt(payload.substring(6, 14), 16); + // save + result.realTimes.push({ + tagRef: "p_count1", + timestamp: time, + tagValue: String(count1), + }); + break; + } + case 93: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + // get temperature + let temp = parseInt(payload.substring(6, 10), 16); + + // check if negative value + if (temp >> 15 === 1) { + const reverseValue = temp ^ 65535; + temp = (reverseValue + 1) * -1; + } + + // save + result.realTimes.push({ + tagRef: "p_temperature", + timestamp: time, + tagValue: String(temp / 10), + }); + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(2 + 8 * j, 10 + 8 * j), 16)), + }); + } + break; + } + case 94: { + // get digital input + const di = parseInt(payload.substring(4, 6) + payload.substring(2, 4), 16); + // init coef + let coef = 1; + + for (let i = 1; i < 17; i++) { + // save + result.realTimes.push({ + tagRef: `p_DI${i}`, + timestamp: time, + tagValue: String((di & coef) === coef), + }); + + // multiply coef by 2 + coef *= 2; + } + + for (let j = 1; j < 9; j++) { + // save + result.realTimes.push({ + tagRef: `p_count${j}`, + timestamp: time, + tagValue: String(parseInt(payload.substring(-2 + 8 * j, 6 + 8 * j), 16)), + }); + } + break; + } + case 95: { + // get count 5 + const count5 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count5", + timestamp: time, + tagValue: String(count5), + }); + + // get count 6 + const count6 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count6", + timestamp: time, + tagValue: String(count6), + }); + break; + } + case 96: { + // get count 7 + const count7 = parseInt(payload.substring(2, 10), 16); + // save + result.realTimes.push({ + tagRef: "p_count7", + timestamp: time, + tagValue: String(count7), + }); + + // get count 8 + const count8 = parseInt(payload.substring(10, 18), 16); + // save + result.realTimes.push({ + tagRef: "p_count8", + timestamp: time, + tagValue: String(count8), + }); + break; + } + case 2: + case 4: + case 6: + case 7: + case 8: + case 46: + case 56: + case 60: + case 61: + case 64: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 92: + case 97: + case 98: + case 99: + default: + break; + } + } + // Return result + return result; +} + +function ToTagoFormat(object_item, serie) { + const historics = []; + const events = []; + const realTimes = []; + // eslint-disable-next-line guard-for-in + for (const key in object_item.realTimes) { + realTimes.push({ + variable: `realTimes_${object_item.realTimes[key].tagRef}`.toLowerCase(), + value: object_item.realTimes[key].tagValue, + time: object_item.realTimes[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.events) { + events.push({ + variable: `events_${object_item.events[key].tagRef}`.toLowerCase(), + value: object_item.events[key].tagValue, + time: object_item.events[key].timestamp, + serie, + }); + } + // eslint-disable-next-line guard-for-in + for (const key in object_item.historics) { + historics.push({ + variable: `historics_${object_item.historics[key].tagRef}`.toLowerCase(), + value: object_item.historics[key].tagValue, + time: object_item.historics[key].timestamp, + serie, + }); + } + const result = historics.concat(events, realTimes); + + return result; +} + +/* let payload = [ + { variable: "payload", value: "5e7f000000003f00000040000000410000004200000043000000440000004500000046" }, + { variable: "type", value: 0 }, + { variable: "timestamp", value: 1605614318410 }, +]; */ + +const data = payload.find((x) => x.variable === "payload_raw" || x.variable === "payload" || x.variable === "data"); +const type = payload.find((x) => x.variable === "type"); +const timestamp = payload.find((x) => x.variable === "timestamp"); + +if (data) { + // const buffer = Buffer.from(data.value, "hex"); + const serie = new Date().getTime(); + // payload = decodeStream(data.value, type.value, timestamp.value); + payload = ToTagoFormat(decodeStream(data.value, type.value, timestamp.value), serie); +} + +// eslint-disable-next-line no-console +// console.log(payload); From 8b48f7580f766efc1ed6a5354473f1a0c4228045 Mon Sep 17 00:00:00 2001 From: Mateus Silva Date: Fri, 7 Jun 2024 12:27:10 -0300 Subject: [PATCH 4/4] Removed unnecessary configuration --- package-lock.json | 254 ---------------------------------------------- package.json | 1 - tsconfig.json | 1 - 3 files changed, 256 deletions(-) diff --git a/package-lock.json b/package-lock.json index 793945c2..ff404ff9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "knex": "3.1.0", "moment-timezone": "0.5.45", "sqlite3": "5.1.7", - "unplugin-swc": "1.4.5", "uuid": "9.0.1", "validator": "13.12.0", "vitest": "1.6.0", @@ -599,34 +598,6 @@ "node": ">=10" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", @@ -1283,19 +1254,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -1365,18 +1323,6 @@ "prebuild-install": "^7.1.1" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -1408,18 +1354,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1513,30 +1447,6 @@ "node": "*" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1851,18 +1761,6 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1996,18 +1894,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2196,18 +2082,6 @@ "node": ">= 12" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -2220,15 +2094,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2239,18 +2104,6 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -2258,15 +2111,6 @@ "dev": true, "optional": true }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -2361,15 +2205,6 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -2751,15 +2586,6 @@ "node": ">=6" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -2911,18 +2737,6 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", @@ -3077,18 +2891,6 @@ "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -3613,18 +3415,6 @@ "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3678,35 +3468,6 @@ "imurmurhash": "^0.1.4" } }, - "node_modules/unplugin": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", - "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "chokidar": "^3.6.0", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/unplugin-swc": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/unplugin-swc/-/unplugin-swc-1.4.5.tgz", - "integrity": "sha512-ltkJ70kjL53onJrypaMmKDiOvhghNUCbCxjxT6Ir0eAMIBsOfRhPt6vQtxB8R/6wYk/TfIJ2gCgdx2uKNPJRHA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "load-tsconfig": "^0.2.5", - "unplugin": "^1.10.1" - }, - "peerDependencies": { - "@swc/core": "^1.2.108" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3903,21 +3664,6 @@ "node": ">=6.0" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", - "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index fa7b952f..4a413cee 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "knex": "3.1.0", "moment-timezone": "0.5.45", "sqlite3": "5.1.7", - "unplugin-swc": "1.4.5", "uuid": "9.0.1", "validator": "13.12.0", "vitest": "1.6.0", diff --git a/tsconfig.json b/tsconfig.json index 8705d6e5..bf014a20 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "types": ["vitest/importMeta", "vitest/globals"], "target": "ES2022", "module": "ESNext", "moduleResolution": "node",