From 93dd77358468d408ffca806928b300b6f8496e00 Mon Sep 17 00:00:00 2001 From: burnedikt Date: Thu, 2 Feb 2023 21:29:09 +0100 Subject: [PATCH 1/5] feat(diasend): plugin to synchronize CGV and treatments from diasend --- lib/plugins/diasend.js | 63 ++++++++++ lib/server/bootevent.js | 15 +++ package-lock.json | 268 +++++++++++++++++++++++++++++++++++++++- package.json | 1 + 4 files changed, 345 insertions(+), 2 deletions(-) create mode 100644 lib/plugins/diasend.js diff --git a/lib/plugins/diasend.js b/lib/plugins/diasend.js new file mode 100644 index 00000000000..3e9f522e28b --- /dev/null +++ b/lib/plugins/diasend.js @@ -0,0 +1,63 @@ +/* jshint node: true */ +"use strict"; + +const diasendBridge = require("diasend-nightscout-bridge"); +const NightscoutClient = + require("diasend-nightscout-bridge/dist/nightscout/internal-api").InternalApiNightscoutClient; + +function init(env, entries, treatments, bus) { + if ( + env.extendedSettings.diasend && + env.extendedSettings.diasend.username && + env.extendedSettings.diasend.password + ) { + console.info("Booting Diasend Connector"); + return { + run: makeRunner(env, entries, treatments, bus), + }; + } else { + console.info("Diasend Connect not enabled"); + return null; + } +} +function makeRunner(env, entries, treatments, profile, bus) { + var options = getOptions(env); + + const nightscoutClient = new NightscoutClient(entries, treatments, profile); + + return function run() { + const stopSynchronization = diasendBridge.startSynchronization({ + ...options, + pollingIntervalMs: 1 * 60 * 1000, + nightscoutClient, + }); + + const stopProfileSynchronization = + diasendBridge.startPumpSettingsSynchronization({ + diasendPassword: options.diasendPassword, + diasendUsername: options.diasendUsername, + // every 12 hours + pollingIntervalMs: 12 * 3600 * 1000, + nightscoutProfileName: "Diasend", + nightscoutClient, + }); + + if (bus) { + bus.on("teardown", function serverTeardown() { + stopSynchronization(); + stopProfileSynchronization(); + }); + } + }; +} + +function getOptions(env) { + return { + diasendClientId: env.extendedSettings.diasend.clientId, + diasendClientSecret: env.extendedSettings.diasend.clientSecret, + diasendUsername: env.extendedSettings.diasend.username, + diasendPassword: env.extendedSettings.diasend.password, + }; +} + +module.exports = init; diff --git a/lib/server/bootevent.js b/lib/server/bootevent.js index edcd35c11cd..35267000ffc 100644 --- a/lib/server/bootevent.js +++ b/lib/server/bootevent.js @@ -328,6 +328,20 @@ function boot (env, language) { next( ); } + function setupDiasend(ctx, next) { + console.log("Executing setupDiasend"); + + if (hasBootErrors(ctx)) { + return next(); + } + + ctx.diasend = require("../plugins/diasend")(env, ctx.entries, ctx.treatments, ctx.profile, ctx.bus); + if (ctx.diasend) { + ctx.diasend.run(); + } + next(); + } + function setupMMConnect (ctx, next) { console.log('Executing setupMMConnect'); @@ -370,6 +384,7 @@ function boot (env, language) { .acquire(setupListeners) .acquire(setupBridge) .acquire(setupMMConnect) + .acquire(setupDiasend) .acquire(finishBoot); } diff --git a/package-lock.json b/package-lock.json index f604d2465d5..cc9f1445d26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1401,6 +1401,14 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1613,6 +1621,14 @@ "follow-redirects": "^1.14.0" } }, + "axios-cookiejar-support": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-2.0.5.tgz", + "integrity": "sha512-y5S8feB6SbITWEiisCqFzQWaob+M34vVz8sP5KmQTDovM7HJ8xG9KQIETh0bFRyXUfDzWR5aPzfgkTND0wuYvQ==", + "requires": { + "http-cookie-agent": "^1.0.6" + } + }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -1800,6 +1816,11 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "bootevent": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/bootevent/-/bootevent-0.0.1.tgz", @@ -2035,6 +2056,43 @@ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "dependencies": { + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, "chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -2411,6 +2469,23 @@ } } }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2744,6 +2819,11 @@ } } }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2801,6 +2881,63 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "diasend-nightscout-bridge": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/diasend-nightscout-bridge/-/diasend-nightscout-bridge-2.0.3.tgz", + "integrity": "sha512-OVm/aPW4ibr1wAvvMd3vSWNbwgln8csfaU+qT49gHtdCTGhRH750ueMtfHVukIOfLLqjQeneoM51TZs2//tadw==", + "requires": { + "axios": "^0.27.2", + "axios-cookiejar-support": "^2", + "cheerio": "^1.0.0-rc.12", + "dayjs": "^1.11.4", + "dotenv": "^16.0.3", + "lodash.partition": "^4.6.0", + "loglevel": "^1.8.1", + "node-cache": "^5.1.2", + "rand-user-agent": "^1.0.78", + "tough-cookie": "^4.1.2" + }, + "dependencies": { + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "requires": { + "clone": "2.x" + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + } + } + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2833,6 +2970,21 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2841,11 +2993,34 @@ "webidl-conversions": "^4.0.2" } }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, "dompurify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -3011,6 +3186,11 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, "env-cmd": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", @@ -3793,8 +3973,7 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "foreground-child": { "version": "1.5.6", @@ -4103,6 +4282,25 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "http-cookie-agent": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-1.0.6.tgz", + "integrity": "sha512-Ei0BDjMfy6MSXATmCZ5nWr935NLYl6eD/BTxVGOIrKAlg4xDtMdk+8a+caq6Qwa4FACn+vACj89pFKlXmHOnkQ==", + "requires": { + "agent-base": "^6.0.2" + } + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -4856,6 +5054,11 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "lodash.partition": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.partition/-/lodash.partition-4.6.0.tgz", + "integrity": "sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -4927,6 +5130,11 @@ } } }, + "loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6506,6 +6714,14 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, "nwsapi": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", @@ -6898,6 +7114,25 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "dependencies": { + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7152,6 +7387,16 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "rand-user-agent": { + "version": "1.0.103", + "resolved": "https://registry.npmjs.org/rand-user-agent/-/rand-user-agent-1.0.103.tgz", + "integrity": "sha512-bICq50Z6+gYFrFyExRH+IiHP6rAwZLISyVcTPAvnWjw8bQi7kwXYBoxX0TLTJZPiDOjeEoHiFpeR5bvsLQSrVA==" + }, "random-token": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/random-token/-/random-token-0.0.8.tgz", @@ -7434,6 +7679,11 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -9387,6 +9637,11 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9409,6 +9664,15 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index eb3562bbf78..63c8298cdad 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "cssmin": "^0.4.3", "csv-stringify": "^5.5.1", "d3": "^5.16.0", + "diasend-nightscout-bridge": "^2.0.3", "dompurify": "^2.2.6", "easyxml": "^2.0.1", "ejs": "^3.1.8", From 2d82a02c8a1ec4fd1520112112d5fbd8b4a28310 Mon Sep 17 00:00:00 2001 From: burnedikt Date: Thu, 2 Feb 2023 21:49:29 +0100 Subject: [PATCH 2/5] chore(diasend): allow configuration of sync intervals --- lib/plugins/diasend.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/plugins/diasend.js b/lib/plugins/diasend.js index 3e9f522e28b..7914be82b58 100644 --- a/lib/plugins/diasend.js +++ b/lib/plugins/diasend.js @@ -28,7 +28,7 @@ function makeRunner(env, entries, treatments, profile, bus) { return function run() { const stopSynchronization = diasendBridge.startSynchronization({ ...options, - pollingIntervalMs: 1 * 60 * 1000, + pollingIntervalMs: options.diasendPollingInterval, nightscoutClient, }); @@ -36,8 +36,7 @@ function makeRunner(env, entries, treatments, profile, bus) { diasendBridge.startPumpSettingsSynchronization({ diasendPassword: options.diasendPassword, diasendUsername: options.diasendUsername, - // every 12 hours - pollingIntervalMs: 12 * 3600 * 1000, + pollingIntervalMs: options.diasendPumpSettingsPollingInterval, nightscoutProfileName: "Diasend", nightscoutClient, }); @@ -53,10 +52,15 @@ function makeRunner(env, entries, treatments, profile, bus) { function getOptions(env) { return { - diasendClientId: env.extendedSettings.diasend.clientId, - diasendClientSecret: env.extendedSettings.diasend.clientSecret, diasendUsername: env.extendedSettings.diasend.username, diasendPassword: env.extendedSettings.diasend.password, + // default is 1 minute + diasendPollingInterval: + env.extendedSettings.diasend.pollingIntervalMs || 60 * 1000, + // default is 12 hours + diasendPumpSettingsPollingInterval: + env.extendedSettings.diasend.pumpSettingsPollingIntervalMs || + 12 * 60 * 60 * 1000, }; } From 247e587d93c572f0714fdec04097a694d1767561 Mon Sep 17 00:00:00 2001 From: burnedikt Date: Thu, 2 Feb 2023 21:51:07 +0100 Subject: [PATCH 3/5] docs(diasend): added information on configuring diasend plugin --- CONTRIBUTING.md | 1 + README.md | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ddc20c1620e..74e2e5dc99d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -220,6 +220,7 @@ Also if you can't code, it's possible to contribute by improving the documentati | [`iob` (Insulin-on-Board)](README.md#iob-insulin-on-board)| Please volunteer | Please volunteer | | [`loop` (Loop)](README.md#loop-loop)| Please volunteer | Please volunteer | | [`mmconnect` (MiniMed Connect bridge)](README.md#mmconnect-minimed-connect-bridge)| Please volunteer | Please volunteer | +| [`diasend` (Diasend bridge)](README.md#diasend-diasend-bridge)| [@burnedikt] | Please volunteer | | [`openaps` (OpenAPS)](README.md#openaps-openaps)| Please volunteer | Please volunteer | | [`profile` (Treatment Profile)](README.md#profile-treatment-profile)| Please volunteer | Please volunteer | | [`pump` (Pump Monitoring)](README.md#pump-pump-monitoring)| Please volunteer | Please volunteer | diff --git a/README.md b/README.md index 435d94c399e..dfb3f10e471 100644 --- a/README.md +++ b/README.md @@ -511,6 +511,13 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs/ or * `MMCONNECT_STORE_RAW_DATA` - Set this to "true" to store raw data returned from CareLink as `type: "carelink_raw"` database entries (useful for development). * `MMCONNECT_SERVER` - Set this to `EU` if you're using the European Medtronic services +##### `diasend` (Diasend bridge) + Transfer near-real-time continuous glucose monitoring and treatment data from diasend into Nightscout ([read more](https://github.com/burnedikt/diasend-nightscout-bridge)). ⚠️ Due to diasend not providing any timezone information on the data, the timezone (`TZ`) of the nightscout instance needs to match the timezone in which the values were sent to diasend, i.e. the timezone of the device generating the data for diasend, most likely the user's local timezone. + * `DIASEND_USERNAME` - Your user name / e-mail address for diasend. + * `DIASEND_PASSWORD` - Your password for diasend. + * `DIASEND_POLLING_INTERVAL_MS` (`60000` *1 minute*) - Number of milliseconds to wait between requests to the diasend server. + * `DIASEND_PUMP_SETTINGS_POLLING_INTERVAL_MS` (`43200000` *12 hours*) - Number of milliseconds to wait between attempts to synchronize pump settings. + ##### `pump` (Pump Monitoring) Generic Pump Monitoring for OpenAPS, MiniMed Connect, RileyLink, t:slim, with more on the way * Requires `DEVICESTATUS_ADVANCED="true"` to be set From 6923fdfd3f00c93077b43c4f0dc8b1dae9aad0b2 Mon Sep 17 00:00:00 2001 From: burnedikt Date: Wed, 8 Feb 2023 23:27:00 +0100 Subject: [PATCH 4/5] fix(diasend): prevent error when bridge tries to delete merged carb correction --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc9f1445d26..18f9e553985 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2882,9 +2882,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "diasend-nightscout-bridge": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/diasend-nightscout-bridge/-/diasend-nightscout-bridge-2.0.3.tgz", - "integrity": "sha512-OVm/aPW4ibr1wAvvMd3vSWNbwgln8csfaU+qT49gHtdCTGhRH750ueMtfHVukIOfLLqjQeneoM51TZs2//tadw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/diasend-nightscout-bridge/-/diasend-nightscout-bridge-2.0.4.tgz", + "integrity": "sha512-7LyDraKCAIW+AsvdlZere/qTu1okJAt1ngWaySzt0buNSpOO8gSPzzmYEb2Meq/Z/H2ZIrF6cpTVC6uQNjq5sw==", "requires": { "axios": "^0.27.2", "axios-cookiejar-support": "^2", @@ -7393,9 +7393,9 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "rand-user-agent": { - "version": "1.0.103", - "resolved": "https://registry.npmjs.org/rand-user-agent/-/rand-user-agent-1.0.103.tgz", - "integrity": "sha512-bICq50Z6+gYFrFyExRH+IiHP6rAwZLISyVcTPAvnWjw8bQi7kwXYBoxX0TLTJZPiDOjeEoHiFpeR5bvsLQSrVA==" + "version": "1.0.104", + "resolved": "https://registry.npmjs.org/rand-user-agent/-/rand-user-agent-1.0.104.tgz", + "integrity": "sha512-iYQIzNbTFZxz4/ygG0dBpWt1PyZhqOIMfXIFQ4e8B6Uml1BZ/za1v6GRv1wGcnTHwiCGTx+NvxgFe25qSNBAWQ==" }, "random-token": { "version": "0.0.8", diff --git a/package.json b/package.json index 63c8298cdad..0c7a41272e5 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "cssmin": "^0.4.3", "csv-stringify": "^5.5.1", "d3": "^5.16.0", - "diasend-nightscout-bridge": "^2.0.3", + "diasend-nightscout-bridge": "^2.0.4", "dompurify": "^2.2.6", "easyxml": "^2.0.1", "ejs": "^3.1.8", From 561eead1d2dffc57acc2e788736cf50a52cf44aa Mon Sep 17 00:00:00 2001 From: Benedikt Reiser Date: Sun, 2 Apr 2023 21:25:55 +0200 Subject: [PATCH 5/5] feat(diasend): add rate to temp basal events to allow autotune to work --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18f9e553985..842534d6063 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2882,9 +2882,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "diasend-nightscout-bridge": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/diasend-nightscout-bridge/-/diasend-nightscout-bridge-2.0.4.tgz", - "integrity": "sha512-7LyDraKCAIW+AsvdlZere/qTu1okJAt1ngWaySzt0buNSpOO8gSPzzmYEb2Meq/Z/H2ZIrF6cpTVC6uQNjq5sw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/diasend-nightscout-bridge/-/diasend-nightscout-bridge-2.0.6.tgz", + "integrity": "sha512-E/dDBxTwCMQ3hQ0Xyb7ptQNiR72cq/lsegWFX4J9ih0abNOz/j7kzr96gOIniqfC+oJswQ+b+MeDaoQIJUSRgQ==", "requires": { "axios": "^0.27.2", "axios-cookiejar-support": "^2", @@ -4283,14 +4283,14 @@ "dev": true }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cookie-agent": { @@ -7393,9 +7393,9 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "rand-user-agent": { - "version": "1.0.104", - "resolved": "https://registry.npmjs.org/rand-user-agent/-/rand-user-agent-1.0.104.tgz", - "integrity": "sha512-iYQIzNbTFZxz4/ygG0dBpWt1PyZhqOIMfXIFQ4e8B6Uml1BZ/za1v6GRv1wGcnTHwiCGTx+NvxgFe25qSNBAWQ==" + "version": "1.0.109", + "resolved": "https://registry.npmjs.org/rand-user-agent/-/rand-user-agent-1.0.109.tgz", + "integrity": "sha512-mnAH0jDJQ0SJtEXjoW5aQILEc+33RwtKzKxwK9JG1a06M6nn8WDWheD+kmc5ucs+ux4FEWX3+PZuEB8r3x15yQ==" }, "random-token": { "version": "0.0.8", diff --git a/package.json b/package.json index 0c7a41272e5..04c15c12cb8 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "cssmin": "^0.4.3", "csv-stringify": "^5.5.1", "d3": "^5.16.0", - "diasend-nightscout-bridge": "^2.0.4", + "diasend-nightscout-bridge": "^2.0.5", "dompurify": "^2.2.6", "easyxml": "^2.0.1", "ejs": "^3.1.8",