CGM Remote Monitor

Nightscout Web Monitor (a.k.a. cgm-remote-monitor)

This acts as a web-based CGM (Continuous Glucose Monitor) to allow
multiple caregivers to remotely view a patient's glucose data in
real time. The server reads a MongoDB which is intended to be data
from a physical CGM, where it sends new SGV (sensor glucose values) as
the data becomes available. The data is then displayed graphically
and blood glucose values are predicted 0.5 hours ahead using an
autoregressive second order model. Alarms are generated for high and
low values, which can be cleared by any watcher of the data.

Install

Clone this repo then install dependencies into the root of the project:

$ npm install

If deploying the software to Microsoft Azure, you must set WEBSITE_NODE_DEFAULT_VERSION in the app settings to 8.9.0before you deploy the latest Nightscout or the site deployment will likely fail. Other hosting environments do not require this setting.

Usage

The data being uploaded from the server to the client is from a
MongoDB server such as mongolab.

Updating my version?

The easiest way to update your version of cgm-remote-monitor to our latest
recommended version is to use the update my fork tool. It even
gives out stars if you are up to date.

What is my mongo string?

Try the what is my mongo string tool to get a good idea of your
mongo string. You can copy and paste the text in the gray box into your
MONGO_CONNECTION environment variable.

Configure my uploader to match

Nightscout API

The Nightscout API enables direct access to your DData without the need for direct Mongo access.
You can find CGM data in /api/v1/entries, Care Portal Treatments in /api/v1/treatments, and Treatment Profiles in /api/v1/profile.
The server status and settings are available from /api/v1/status.json.

By default the /entries and /treatments APIs limit results to the the most recent 10 values from the last 2 days.
You can get many more results, by using the count, date, dateString, and created_at parameters, depending on the type of data you're looking for.

Example Queries

(replace http://localhost:1337 with your base url, YOUR-SITE)

100's: http://localhost:1337/api/v1/entries.json?find[sgv]=100

Count of 100's in a month: http://localhost:1337/api/v1/count/entries/where?find[dateString][$gte]=2016-09&find[dateString][$lte]=2016-10&find[sgv]=100

API_SECRET - A secret passphrase that must be at least 12 characters long, required to enable POST and PUT; also required for the Care Portal

AUTH_DEFAULT_ROLES (readable) - possible values readable, denied, or any valid role
name. When readable, anyone can view Nightscout without a token.
Setting it to denied will require a token from every visit, using status-only will enable api-secret based login.

IMPORT_CONFIG - Used to import settings and extended settings from a url such as a gist. Structure of file should be something like: {"settings": {"theme": "colors"}, "extendedSettings": {"upbat": {"enableAlerts": true}}}

TREATMENTS_AUTH (on) - possible values on or off. Deprecated, if set to off the careportal role will be added to AUTH_DEFAULT_ROLES

Alarms

These alarm setting effect all delivery methods (browser, pushover, maker, etc), some settings can be overridden per client (web browser)

ALARM_TYPES (simple if any BG_* ENV's are set, otherwise predict) - currently 2 alarm types are supported, and can be used independently or combined. The simple alarm type only compares the current BG to BG_ thresholds above, the predict alarm type uses highly tuned formula that forecasts where the BG is going based on it's trend. predictDOES NOT currently use any of the BG_* ENV's

BG_HIGH (260) - must be set using mg/dl units; the high BG outside the target range that is considered urgent

BG_TARGET_TOP (180) - must be set using mg/dl units; the top of the target range, also used to draw the line on the chart

BG_TARGET_BOTTOM (80) - must be set using mg/dl units; the bottom of the target range, also used to draw the line on the chart

BG_LOW (55) - must be set using mg/dl units; the low BG outside the target range that is considered urgent

ALARM_URGENT_HIGH (on) - possible values on or off

ALARM_URGENT_HIGH_MINS (30 60 90 120) - Number of minutes to snooze urgent high alarms, space separated for options in browser, first used for pushover

ALARM_HIGH (on) - possible values on or off

ALARM_HIGH_MINS (30 60 90 120) - Number of minutes to snooze high alarms, space separated for options in browser, first used for pushover

ALARM_LOW (on) - possible values on or off

ALARM_LOW_MINS (15 30 45 60) - Number of minutes to snooze low alarms, space separated for options in browser, first used for pushover

ALARM_URGENT_LOW (on) - possible values on or off

ALARM_URGENT_LOW_MINS (15 30 45) - Number of minutes to snooze urgent low alarms, space separated for options in browser, first used for pushover

ALARM_URGENT_MINS (30 60 90 120) - Number of minutes to snooze urgent alarms (that aren't tagged as high or low), space separated for options in browser, first used for pushover

ALARM_WARN_MINS (30 60 90 120) - Number of minutes to snooze warning alarms (that aren't tagged as high or low), space separated for options in browser, first used for pushover

ALARM_TIMEAGO_WARN_MINS (15) - minutes since the last reading to trigger a warning

ALARM_TIMEAGO_URGENT (on) - possible values on or off

ALARM_TIMEAGO_URGENT_MINS (30) - minutes since the last reading to trigger a urgent alarm

devicestatus (Device Status)

Used by upbat and other plugins to display device status info. Supports the DEVICESTATUS_ADVANCED="true"extended setting to send all device statuses to the client for retrospective use and to support other plugins.

Advanced Plugins:

careportal (Careportal)

boluscalc (Bolus Wizard)

food (Custom Foods)

An option plugin to enable adding foods from database in Bolus Wizard and enable .

rawbg (Raw BG)

Calculates BG using sensor and calibration records from and displays an alternate BG values and noise levels.

iob (Insulin-on-Board)

Adds the IOB pill visualization in the client and calculates values that used by other plugins. Uses treatments with insulin doses and the dia and sens fields from the treatment profile.

cob (Carbs-on-Board)

Adds the COB pill visualization in the client and calculates values that used by other plugins. Uses treatments with carb doses and the carbs_hr, carbratio, and sens fields from the treatment profile.

bwp (Bolus Wizard Preview)

This plugin in intended for the purpose of automatically snoozing alarms when the CGM indicates high blood sugar but there is also insulin on board (IOB) and secondly, alerting to user that it might be beneficial to measure the blood sugar using a glucometer and dosing insulin as calculated by the pump or instructed by trained medicare professionals. The values provided by the plugin are provided as a reference based on CGM data and insulin sensitivity you have configured, and are not intended to be used as a reference for bolus calculation. The plugin calculates the bolus amount when above your target, generates alarms when you should consider checking and bolusing, and snoozes alarms when there is enough IOB to cover a high BG. Uses the results of the iob plugin and sens, target_high, and target_low fields from the treatment profile. Defaults that can be adjusted with extended setting

BWP_WARN (0.50) - If BWP is > BWP_WARN a warning alarm will be triggered.

BWP_URGENT (1.00) - If BWP is > BWP_URGENT an urgent alarm will be triggered.

BWP_SNOOZE_MINS (10) - minutes to snooze when there is enough IOB to cover a high BG.

BWP_SNOOZE - (0.10) If BG is higher then the target_high and BWP < BWP_SNOOZE alarms will be snoozed for BWP_SNOOZE_MINS.

cage (Cannula Age)

Calculates the number of hours since the last Site Change treatment that was recorded.

CAGE_ENABLE_ALERTS (false) - Set to true to enable notifications to remind you of upcoming cannula change.

CAGE_INFO (44) - If time since last Site Change matches CAGE_INFO, user will be warned of upcoming cannula change

CAGE_WARN (48) - If time since last Site Change matches CAGE_WARN, user will be alarmed to to change the cannula

CAGE_URGENT (72) - If time since last Site Change matches CAGE_URGENT, user will be issued a persistent warning of overdue change.

CAGE_DISPLAY (hours) - Possible values are 'hours' or 'days'. If 'days' is selected and age of canula is greater than 24h number is displayed in days and hours

sage (Sensor Age)

Calculates the number of days and hours since the last Sensor Start and Sensor Change treatment that was recorded.

SAGE_ENABLE_ALERTS (false) - Set to true to enable notifications to remind you of upcoming sensor change.

SAGE_INFO (144) - If time since last sensor event matches SAGE_INFO, user will be warned of upcoming sensor change

SAGE_WARN (164) - If time since last sensor event matches SAGE_WARN, user will be alarmed to to change/restart the sensor

SAGE_URGENT (166) - If time since last sensor event matches SAGE_URGENT, user will be issued a persistent warning of overdue change.

iage (Insulin Age)

Calculates the number of days and hours since the last Insulin Change treatment that was recorded.

IAGE_ENABLE_ALERTS (false) - Set to true to enable notifications to remind you of upcoming insulin reservoir change.

IAGE_INFO (44) - If time since last Insulin Change matches IAGE_INFO, user will be warned of upcoming insulin reservoir change

IAGE_WARN (48) - If time since last Insulin Change matches IAGE_WARN, user will be alarmed to to change the insulin reservoir

IAGE_URGENT (72) - If time since last Insulin Change matches IAGE_URGENT, user will be issued a persistent warning of overdue change.

treatmentnotify (Treatment Notifications)

Generates notifications when a treatment has been entered and snoozes alarms minutes after a treatment. Default snooze is 10 minutes, and can be set using the TREATMENTNOTIFY_SNOOZE_MINSextended setting.

basal (Basal Profile)

Adds the Basal pill visualization to display the basal rate for the current time. Also enables the bwp plugin to calculate correction temp basal suggestions. Uses the basal field from the treatment profile. Also uses the extended setting:

MMCONNECT_INTERVAL (600001 minute) - Number of milliseconds to wait between requests to the CareLink server.

MMCONNECT_MAX_RETRY_DURATION (32) - Maximum number of total seconds to spend retrying failed requests before giving up.

MMCONNECT_SGV_LIMIT (24) - Maximum number of recent sensor glucose values to send to Nightscout on each request.

MMCONNECT_VERBOSE - Set this to "true" to log CareLink request information to the console.

MMCONNECT_STORE_RAW_DATA - Set this to "true" to store raw data returned from CareLink as type: "carelink_raw" database entries (useful for development).

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

PUMP_ENABLE_ALERTS (false) - Set to true to enable notifications for Pump battery and reservoir.

PUMP_WARNONSUSPEND (false) - Set to true to get an alarm when the pump is suspended.

PUMP_FIELDS (reservoir battery) - The fields to display by default. Any of the following fields: reservoir, battery, clock, status, and device

PUMP_RETRO_FIELDS (reservoir battery clock) - The fields to display in retro mode. Any of the above fields.

PUMP_WARN_CLOCK (30) - The number of minutes ago that needs to be exceed before an alert is triggered.

PUMP_URGENT_CLOCK (60) - The number of minutes ago that needs to be exceed before an urgent alarm is triggered.

PUMP_WARN_RES (10) - The number of units remaining, a warning will be triggered when dropping below this threshold.

PUMP_URGENT_RES (5) - The number of units remaining, an urgent alarm will be triggered when dropping below this threshold.

PUMP_WARN_BATT_P (30) - The % of the pump battery remaining, a warning will be triggered when dropping below this threshold.

PUMP_URGENT_BATT_P (20) - The % of the pump battery remaining, an urgent alarm will be triggered when dropping below this threshold.

PUMP_WARN_BATT_V (1.35) - The voltage (if percent isn't available) of the pump battery, a warning will be triggered when dropping below this threshold.

PUMP_URGENT_BATT_V (1.30) - The voltage (if percent isn't available) of the pump battery, an urgent alarm will be triggered when dropping below this threshold.

openaps (OpenAPS)

Integrated OpenAPS loop monitoring, uses these extended settings:

Requires DEVICESTATUS_ADVANCED="true" to be set

OPENAPS_ENABLE_ALERTS (false) - Set to true to enable notifications when OpenAPS isn't looping. If OpenAPS is going to offline for a period of time, you can add an OpenAPS Offline event for the expected duration from Careportal to avoid getting alerts.

OPENAPS_WARN (30) - The number of minutes since the last loop that needs to be exceed before an alert is triggered

OPENAPS_URGENT (60) - The number of minutes since the last loop that needs to be exceed before an urgent alarm is triggered

OPENAPS_FIELDS (status-symbol status-label iob meal-assist rssi) - The fields to display by default. Any of the following fields: status-symbol, status-label, iob, meal-assist, freq, and rssi

OPENAPS_RETRO_FIELDS (status-symbol status-label iob meal-assist rssi) - The fields to display in retro mode. Any of the above fields.

alexa (Amazon Alexa)

cors (CORS)

Enabled CORS so other websites can make request to your Nightscout site, uses these extended settings:

CORS_ALLOW_ORIGIN (*) - The list of sites that are allow to make requests

Extended Settings

Some plugins support additional configuration using extra environment variables. These are prefixed with the name of the plugin and a _. For example setting MYPLUGIN_EXAMPLE_VALUE=1234 would make extendedSettings.exampleValue available to the MYPLUGIN plugin.

Plugins only have access to their own extended settings, all the extended settings of client plugins will be sent to the browser.

Pushover

In addition to the normal web based alarms, there is also support for Pushover based alarms and notifications.

To get started install the Pushover application on your iOS or Android device and create an account.

Using that account login to Pushover, in the top left you’ll see your User Key, you’ll need this plus an application API Token/Key to complete this setup.

You’ll need to Create a Pushover Application. You only need to set the Application name, you can ignore all the other settings, but setting an Icon is a nice touch. Maybe you'd like to use this one?

Pushover is configured using the following Environment Variables:

* `ENABLE` - `pushover` should be added to the list of plugin, for example: `ENABLE="pushover"`.
* `PUSHOVER_API_TOKEN` - Used to enable pushover notifications, this token is specific to the application you create from in [Pushover](https://pushover.net/), ***[additional pushover information](#pushover)*** below.
* `PUSHOVER_USER_KEY` - Your Pushover user key, can be found in the top left of the [Pushover](https://pushover.net/) site, this can also be a pushover delivery group key to send to a group rather than just a single user. This also supports a space delimited list of keys. To disable `INFO` level pushes set this to `off`.
* `PUSHOVER_ALARM_KEY` - An optional Pushover user/group key, will be used for system wide alarms (level > `WARN`). If not defined this will fallback to `PUSHOVER_USER_KEY`. A possible use for this is sending important messages and alarms to a CWD that you don't want to send all notification too. This also support a space delimited list of keys. To disable Alarm pushes set this to `off`.
* `PUSHOVER_ANNOUNCEMENT_KEY` - An optional Pushover user/group key, will be used for system wide user generated announcements. If not defined this will fallback to `PUSHOVER_USER_KEY` or `PUSHOVER_ALARM_KEY`. This also support a space delimited list of keys. To disable Announcement pushes set this to `off`.
* `BASE_URL` - Used for pushover callbacks, usually the URL of your Nightscout site, use https when possible.
* `API_SECRET` - Used for signing the pushover callback request for acknowledgments.
If you never want to get info level notifications (treatments) use `PUSHOVER_USER_KEY="off"`
If you never want to get an alarm via pushover use `PUSHOVER_ALARM_KEY="off"`
If you never want to get an announcement via pushover use `PUSHOVER_ANNOUNCEMENT_KEY="off"`
If only `PUSHOVER_USER_KEY` is set it will be used for all info notifications, alarms, and announcements
For testing/development try [localtunnel](http://localtunnel.me/).

IFTTT Maker

In addition to the normal web based alarms, and pushover, there is also integration for IFTTT Maker.

With Maker you are able to integrate with all the other IFTTT Channels. For example you can send a tweet when there is an alarm, change the color of hue light, send an email, send and sms, and so much more.

ENABLE - maker should be added to the list of plugin, for example: ENABLE="maker".

MAKER_KEY - Set this to your secret key that you located in step 2, for example: MAKER_KEY="abcMyExampleabc123defjt1DeNSiftttmak-XQb69p" This also support a space delimited list of keys.

MAKER_ANNOUNCEMENT_KEY - An optional Maker key, will be used for system wide user generated announcements. If not defined this will fallback to MAKER_KEY. A possible use for this is sending important messages and alarms to a CWD that you don't want to send all notification too. This also support a space delimited list of keys.

Plugins can create custom events, but all events sent to maker will be prefixed with ns-. The core events are:

ns-event - This event is sent to the maker service for all alarms and notifications. This is good catch all event for general logging.

ns-allclear - This event is sent to the maker service when an alarm has been ack'd or when the server starts up without triggering any alarms. For example, you could use this event to turn a light to green.

ns-info - Plugins that generate notifications at the info level will cause this event to also be triggered. It will be sent in addition to ns-event.

ns-warning - Alarms at the warning level with cause this event to also be triggered. It will be sent in addition to ns-event.

ns-urgent - Alarms at the urgent level with cause this event to also be triggered. It will be sent in addition to ns-event.

Your hosting provider probably has a way to set these through their GUI.

Vagrant install

Optionally, use Vagrant with the
included Vagrantfile and setup.sh to install OS and node packages to
a virtual machine.

host$ vagrant up
host$ vagrant ssh
vm$ setup.sh

The setup script will install OS packages then run npm install.

The Vagrant VM serves to your host machine only on 192.168.33.10, you can access
the web interface on http://192.168.33.10:1337

Installation on Windows

If you have access to local computing resources and want to maintain more control over your data, you can host Nightscout and its database outside of the cloud. Windows Server supports MongoDB, Node.js, and Nightscout installed on a single system. Although the instructions are intended for Windows Server the procedure is compatible with client versions of Windows such as Windows 7 and Windows 10.

More questions?

License

cgm-remote-monitor - web app to broadcast cgm readings
Copyright (C) 2017 Nightscout contributors. See the COPYRIGHT file
at the root directory of this distribution and at
https://github.com/nightscout/cgm-remote-monitor/blob/master/COPYRIGHT
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.