Welcome to insulaudit:decoding-carelink’s documentation!¶
Contents:
API¶
Stick¶
This manages communications with the usb stick itself. This is really the heart of the whole package.
Given a Link, with read/write methods, this module will allow using the usb stick as a radio to communicate with compatible medical devices.
stick
Module¶
-
exception
decocare.stick.
BadCRC
[source]¶ Bases:
decocare.errors.StickError
-
class
decocare.stick.
InterfaceStats
[source]¶ Bases:
decocare.stick.StickCommand
Abstract stats decoder.
-
INTERFACE_IDX
= 19¶
-
code
= [5]¶
-
classmethod
decode
(klass, data)[source]¶ Decode interface stats. The stick exposes 6 counters to monitor errors, crcs, naks, timeouts, rx, and tx packets. Very useful for debugging.
-
label
= 'usb.interfaceStats'¶
-
-
class
decocare.stick.
LinkStatus
[source]¶ Bases:
decocare.stick.StickCommand
Basic ACK type of command. Used to poll the modem’s radio buffer. When the radio buffer is full, we can download a packet from the buffer. Otherwise, we need to be mindful of the state the radio is in. This opcode tells you the current state of the radio/stick.
-
code
= [3]¶
-
reasons
= ['OK']¶
-
-
class
decocare.stick.
ProductInfo
[source]¶ Bases:
decocare.stick.StickCommand
Get product info from the usb device.
Useful for identifying what kind of usb stick you’ve got; there are a few different kinds. Eg, European vs US regulatory domains require different frequencies for compliance.
-
SW_VER
= 16¶
-
code
= [4]¶
-
iface_key
= {1: 'Paradigm RF', 3: 'USB'}¶
-
label
= 'usb.productInfo'¶
-
rf_table
= {0: '916.5Mhz', 1: '868.35Mhz', 255: '916.5Mhz'}¶
-
-
class
decocare.stick.
RadioStats
[source]¶ Bases:
decocare.stick.InterfaceStats
Count of packets and stats on the radio side of the stick.
-
code
= [5, 0]¶
-
-
class
decocare.stick.
ReadRadio
(size)[source]¶ Bases:
decocare.stick.StickCommand
Read buffer from the radio.
Downloads a packet from the radio buffer.
-
code
= [12, 0]¶
-
dl_size
= 0¶
-
size
= 64¶
-
-
class
decocare.stick.
SignalStrength
[source]¶ Bases:
decocare.stick.StickCommand
This seems to be required to initialize communications with the usb stick. Also, you should wait until a minimum threshold is reached.
-
code
= [6, 0]¶
-
-
class
decocare.stick.
Stick
(link)[source]¶ Bases:
object
The carelink usb stick acts like a buffer.
It has a variety of commands providing synchronous IO, eg, you may generally perform a read immediately after writing to it, and expect a response.
The commands operate on a local buffer used to facilitate exchanging messages over RF with the pump. RF communication with the pump happens asynchronously, requiring us to go through 3 separate phases for each message we’d like to exchange with the pumps: * transmit - send commmand * poll_size - loop * download - loop
Each command is usually only 3 bytes.
The protocol offers some facility for detecting and recovering from inconsistencies in the underlying transport of data, however, we are somwhat ignorant of them. The tricky bits are exactly how to recover from, eg CRC, errors that can occur. The “shape” and timing of these loops seem to mostly get the job done.
The Stick object provides a bunch of useful methods, that given a link, will represent the state of one active usb stick.
-
clear_buffer
()[source]¶ An alternative download solution. This can be helpful in scenarios where a prior run seems crashed your process, but the radio is still transmitting and receiving data. Running this method collects data from the radio until it’s done receiving, more or less, at which point you should be free to try again.
-
download
(size=None)[source]¶ Theory is to download anything and everything available off the radio buffer, and to wait if necessary.
-
download_packet
(size)[source]¶ This is the tricky bit, where we stroke the radio and hope it gives us a buffer full of data.
-
link
= None¶
-
poll_size
()[source]¶ query how many bytes are waiting in the radio buffer, ready to be downloaded
There seem to be a few sweet spots, where you want to download the data.
-
process
()[source]¶ Working with the usb stick typically follows a pretty routine process: 1. send our opcode, get a response 2. use some custom logic, per opcode to respond to the stick’s reponse 3. parse the response from that, return result
This has to be done for each opcode.
-
query
(Command)[source]¶ query - simplify the process of working with the stick, pass your command, get the result
-
-
class
decocare.stick.
StickCommand
[source]¶ Bases:
object
Basic stick command
Each command is used to talk to the usb stick. The usb stick interprets the opcode, and then performs the function associated with the opcode. Altogether, the suite of opcodes that the stick responds to allows you to debug and track all packets you are sending/receiving plus allows you to send recieve commands to the pump, by formatting your message into payloads with opcodes, and then letting the stick work on what you’ve given it. It’s kind of like a modem with this funky binary interface and 64 byte payloads.
-
code
= [0]¶
-
delay
= 0.001¶
-
label
= 'example stick command'¶
-
size
= 64¶
-
-
class
decocare.stick.
TransmitPacket
(command)[source]¶ Bases:
decocare.stick.StickCommand
Format a packet to send on the radio.
This commands formats a packet from usb, and shoves it into the radio buffer. The radio buffer is broadcast “over the air” so that any device sensitive to the packets you sent will respond accordingly (probably sending data back). For this reason, the serial number of the device you’d like to talk to is formatted into the packet.
-
code
= [1, 0, 167, 1]¶
-
head
= [1, 0, 167, 1]¶
-
-
exception
decocare.stick.
UnresponsiveError
[source]¶ Bases:
decocare.errors.StickError
-
class
decocare.stick.
UsbStats
[source]¶ Bases:
decocare.stick.InterfaceStats
Count of packets and stats on the usb side of the stick.
-
code
= [5, 1]¶
-
The carelink usb stick acts like a modem. It responds to modem commands, in order to exchange data with a remote end-point. In this case, our little carelink usb modem responds to a variety of binary commands, which you must use in a co-ordinated flow to exchange data with the remote equipment. Also, in our case, the only remote equipment the carelink usb stick is known to talk to are the Me**ronic Par**igm series pumps.
The purpose of this module is to encapsulate the low level operations needed to use the stick in any practical sense. It serves as a set of guides and tutorials which should help people trying to understand or their therapy better. This module seems mostly correct, but things start to fall apart when downloading lots of data. The protocol is either sensitive to some timing somewhere that I’m unaware of, or when CRC errors or other things happen, I simply do the wrong thing to recover.
Please ask Medtronic for more information on how to learn what your device is doing.
Session¶
session
Module¶
-
class
decocare.session.
Pump
(stick, serial='208850')[source]¶ Bases:
decocare.session.Session
Commands¶
Each kind of medical device responds to different commands, but some of them respond to a suite of overlapping commands. Here’s a discussion of some of the commands available.
(There are many more.)
commands
Module¶
-
class
decocare.commands.
BaseCommand
(code, descr, *args)[source]¶ Bases:
object
-
bytesPerRecord
= 0¶
-
code
= 0¶
-
descr
= '(error)'¶
-
effectTime
= 0¶
-
maxRecords
= 0¶
-
params
= []¶
-
responded
= False¶
-
retries
= 2¶
-
timeout
= 3¶
-
-
class
decocare.commands.
KeypadPush
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 91¶
-
descr
= 'Press buttons on the keypad'¶
-
maxRecords
= 0¶
-
params
= []¶
-
retries
= 1¶
-
-
class
decocare.commands.
PowerControl
(minutes=None, **kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> PowerControl(serial='665455').format() == PowerControl._test_ok True
-
code
= 93¶
-
descr
= 'RF Power On'¶
-
effectTime
= 12¶
-
maxRecords
= 0¶
-
params
= [1, 10]¶
-
retries
= 0¶
-
-
class
decocare.commands.
PowerControlOff
(minutes=None, **kwds)[source]¶ Bases:
decocare.commands.PowerControl
Here’s an example where arguments clearly modify behavior.
-
params
= [0, 0]¶
-
-
class
decocare.commands.
PumpCommand
(**kwds)[source]¶ Bases:
decocare.commands.BaseCommand
-
Validator
¶ alias of
FieldChecker
-
bytesPerRecord
= 64¶
-
data
= bytearray(b'')¶
-
effectTime
= 0.5¶
-
maxRecords
= 1¶
-
output_fields
= []¶
-
params
= []¶
-
retries
= 2¶
-
serial
= '208850'¶
-
-
class
decocare.commands.
PumpResume
(**kwds)[source]¶ Bases:
decocare.commands.SetSuspend
-
descr
= 'Resume pump (cancel suspend)'¶
-
params
= [0]¶
-
-
class
decocare.commands.
PumpSuspend
(**kwds)[source]¶ Bases:
decocare.commands.SetSuspend
-
descr
= 'Suspend pump'¶
-
params
= [1]¶
-
-
class
decocare.commands.
ReadBasalTemp
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
MM511 - 120 MM512 and up - opcode 152 # strokes per basalunit = 40 - mm12, 10 in mm11
-
code
= 152¶
-
descr
= 'Read Temp Basal'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadBatteryStatus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 114¶
-
descr
= 'Read Battery Status'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadContrast
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 195¶
-
descr
= 'Read Contrast'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadCurPageNumber
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 157¶
-
descr
= 'Read Cur Page Number'¶
-
maxRecords
= 1¶
-
pages
= 'unknown'¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadErrorStatus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> ReadErrorStatus(serial='665455').format() == ReadErrorStatus._test_ok True
-
code
= 117¶
-
descr
= 'Read Error Status any current alarms set?'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadFirmwareVersion
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 116¶
-
descr
= 'Read Firmware Version'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadGlucoseHistory
(page=None, **kwds)[source]¶ Bases:
decocare.commands.ReadSensorHistoryData
>>> ReadGlucoseHistory(page=1).params [0, 0, 0, 1] >>> list(ReadGlucoseHistory(page=1).format( )) [1, 0, 167, 1, 32, 136, 80, 128, 4, 0, 2, 2, 0, 154, 34, 0, 0, 0, 1, 155] >>> ReadGlucoseHistory(page=2).params [0, 0, 0, 2] >>> ReadGlucoseHistory(page=3) <ReadGlucoseHistory:size[1024]:[page][3]:data[0]:> >>> list(ReadGlucoseHistory(page=3).format( )) [1, 0, 167, 1, 32, 136, 80, 128, 4, 0, 2, 2, 0, 154, 34, 0, 0, 0, 3, 54] >>> ReadGlucoseHistory(page=3).params [0, 0, 0, 3] >>> ReadGlucoseHistory(params=[1]).params [1] >>> ReadGlucoseHistory(params=[2]).params [2] >>> ReadGlucoseHistory(params=[3]).params [3]
-
code
= 154¶
-
descr
= 'Read glucose history'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadHistoryData
(page=None, **kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> ReadHistoryData(serial='208850', params=[ 0x03 ]).format() == ReadHistoryData._test_ok True >>> ReadHistoryData(params=[ 0x01 ]).params [1] >>> ReadHistoryData(params=[ 0x02 ]).params [2] >>> ReadHistoryData(params=[ 0x03 ]).params [3] >>> ReadHistoryData(page=0x01).params [1] >>> ReadHistoryData(page=0x02).params [2] >>> ReadHistoryData(page=0x03).params [3]
-
code
= 128¶
-
data
= bytearray(b'')¶
-
descr
= 'Read History Data'¶
-
effectTime
= 0.1¶
-
maxRecords
= 16¶
-
page
= None¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadPumpID
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 113¶
-
descr
= 'Read Pump ID'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadPumpModel
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> ReadPumpModel(serial='665455').format() == ReadPumpModel._test_ok True
-
code
= 141¶
-
descr
= 'Read Pump Model Number'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadPumpState
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> ReadPumpState(serial='665455').format() == ReadPumpState._test_ok True
-
code
= 131¶
-
descr
= 'Read Pump State'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadPumpStatus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 206¶
-
descr
= 'Read Pump Status'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadRTC
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 112¶
-
descr
= 'Read RTC'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadRadioCtrlACL
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 118¶
-
descr
= 'Read Radio ACL'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadRemainingInsulin
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
basalStrokes
= 10.0¶
-
code
= 115¶
-
descr
= 'Read Remaining Insulin'¶
-
endByte
= 2¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
startByte
= 0¶
-
-
class
decocare.commands.
ReadRemainingInsulin523
(**kwds)[source]¶ Bases:
decocare.commands.ReadRemainingInsulin
-
basalStrokes
= 40.0¶
-
endByte
= 4¶
-
startByte
= 2¶
-
-
class
decocare.commands.
ReadSettings
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
XXX: changed in MM512 to 192
-
byte_map
= {}¶
-
code
= 192¶
-
descr
= 'Read Settings'¶
-
maxRecords
= 1¶
-
output_fields
= ['maxBolus', 'maxBasal', 'insulin_action_curve']¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadTotalsToday
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 121¶
-
descr
= 'Read Totals Today'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
SetSuspend
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 77¶
-
descr
= 'Set Pump Suspend/Resume status'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
TempBasal
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 76¶
-
descr
= 'Set temp basal'¶
-
params
= [0, 0, 0]¶
-
retries
= 0¶
-
-
class
decocare.commands.
ReadCurGlucosePageNumber
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 205¶
-
descr
= 'Read Cur Glucose Page Number'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
SetAutoOff
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 78¶
-
maxRecords
= 0¶
-
-
class
decocare.commands.
SetEnabledEasyBolus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 79¶
-
maxRecords
= 0¶
-
-
class
decocare.commands.
SetBasalType
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 104¶
-
-
class
decocare.commands.
TempBasalPercent
(**kwds)[source]¶ Bases:
decocare.commands.TempBasal
-
code
= 105¶
-
descr
= 'Set temp basal by percent'¶
-
params
= [0, 0]¶
-
retries
= 0¶
-
-
class
decocare.commands.
Bolus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
Bolus some insulin.
XXX: Be careful please. Best trying this not connected to the pump until you trust it.
-
code
= 66¶
-
descr
= 'Bolus'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadErrorStatus508
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 38¶
-
descr
= 'error status'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadBolusHistory
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 39¶
-
descr
= 'bolus history'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadDailyTotals
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 40¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadPrimeBoluses
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 41¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadAlarms
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 42¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadProfileSets
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 43¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadUserEvents
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 44¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadRemoteControlID
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 46¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
Read128KMem
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 55¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
Read256KMem
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 56¶
-
descr
= '...'¶
-
params
= []¶
-
-
class
decocare.commands.
ReadBasalTemp508
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 64¶
-
descr
= 'Read Temp Basal 508 (old)'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadTodayTotals508
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 65¶
-
descr
= 'Read Totals Today'¶
-
maxRecords
= 1¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadSensorSettings
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 153¶
-
descr
= 'Read sensor settings'¶
-
params
= []¶
-
retries
= 2¶
-
-
class
decocare.commands.
ReadISIGHistory
(page=None, **kwds)[source]¶ Bases:
decocare.commands.ReadSensorHistoryData
>>> ReadISIGHistory(page=0).params [0, 0, 0, 0]
>>> ReadISIGHistory(page=1).params [0, 0, 0, 1]
>>> ReadISIGHistory(page=2).params [0, 0, 0, 2]
-
code
= 155¶
-
descr
= 'Read ISIG history'¶
-
maxRecords
= 32¶
-
params
= []¶
-
-
class
decocare.commands.
FilterHistory
(begin=None, end=None, **kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
begin
= None¶
-
code
= None¶
-
end
= None¶
-
-
class
decocare.commands.
FilterGlucoseHistory
(begin=None, end=None, **kwds)[source]¶ Bases:
decocare.commands.FilterHistory
>>> FilterGlucoseHistory.ISO(begin='2014-04-13', end='2014-04-14').params [7, 222, 4, 13, 7, 222, 4, 14]
-
code
= 168¶
-
-
class
decocare.commands.
FilterISIGHistory
(begin=None, end=None, **kwds)[source]¶ Bases:
decocare.commands.FilterHistory
>>> FilterISIGHistory.ISO(begin='2014-04-13', end='2014-04-14').params [7, 222, 4, 13, 7, 222, 4, 14]
-
code
= 169¶
-
-
class
decocare.commands.
ReadProfiles511_STD
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 122¶
-
-
class
decocare.commands.
ReadProfiles511_A
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 123¶
-
-
class
decocare.commands.
ReadProfiles511_B
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 124¶
-
-
class
decocare.commands.
Model511_ExperimentOP125
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 125¶
-
-
class
decocare.commands.
Model511_ExperimentOP126
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 126¶
-
-
class
decocare.commands.
ReadSettings511
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 127¶
-
-
class
decocare.commands.
ReadPumpTrace
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 163¶
-
maxRecords
= 16¶
-
-
class
decocare.commands.
ReadDetailTrace
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 164¶
-
maxRecords
= 16¶
-
-
class
decocare.commands.
Model511_Experiment_OP165
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 165¶
-
-
class
decocare.commands.
ReadNewTraceAlarm
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 166¶
-
maxRecords
= 16¶
-
-
class
decocare.commands.
ReadOldTraceAlarm
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 167¶
-
maxRecords
= 16¶
-
-
class
decocare.commands.
WriteGlucoseHistoryTimestamp
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 40¶
-
-
class
decocare.commands.
ReadLanguage
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 134¶
-
-
class
decocare.commands.
ReadBolusWizardSetupStatus
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 135¶
-
-
class
decocare.commands.
ReadCarbUnits
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 136¶
-
-
class
decocare.commands.
ReadBGUnits
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 137¶
-
-
class
decocare.commands.
ReadCarbRatios
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 138¶
-
item_size
= 3¶
-
num_items
= 8¶
-
output_fields
= ['units', 'schedule']¶
-
-
class
decocare.commands.
ReadCarbRatios512
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 138¶
-
item_size
= 2¶
-
num_items
= 8¶
-
output_fields
= ['units', 'schedule']¶
-
-
class
decocare.commands.
ReadInsulinSensitivities
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
UNITS
= {1: 'mg/dL', 2: 'mmol/L'}¶
-
code
= 139¶
-
output_fields
= ['units', 'sensitivities']¶
-
resp_1
= bytearray(b'\x01\x00-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')¶
-
resp_uk_1
= bytearray(b'\x02\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')¶
-
-
class
decocare.commands.
ReadBGTargets
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 140¶
-
-
class
decocare.commands.
ReadBGTargets515
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 159¶
-
output_fields
= ['units', 'targets']¶
-
-
class
decocare.commands.
ReadBGAlarmCLocks
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 142¶
-
-
class
decocare.commands.
ReadReservoirWarning
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 143¶
-
-
class
decocare.commands.
ReadBGReminderEnable
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 144¶
-
-
class
decocare.commands.
ReadSettings512
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 145¶
-
-
class
decocare.commands.
ReadProfile_STD512
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
>>> import json >>> schedule = ReadProfile_STD512.decode(ReadProfile_STD512._test_result_1) >>> len(schedule) 4 >>> print json.dumps(schedule[0]) {"i": 0, "start": "00:00:00", "rate": 0.8, "minutes": 0} >>> print json.dumps(schedule[1]) {"i": 1, "start": "06:30:00", "rate": 0.9500000000000001, "minutes": 390} >>> print json.dumps(schedule[2]) {"i": 2, "start": "09:30:00", "rate": 1.1, "minutes": 570} >>> print json.dumps(schedule[3]) {"i": 3, "start": "14:00:00", "rate": 0.9500000000000001, "minutes": 840}
-
code
= 146¶
-
maxRecords
= 2¶
-
output_fields
= []¶
-
-
class
decocare.commands.
ReadProfile_A512
(**kwds)[source]¶ Bases:
decocare.commands.ReadProfile_STD512
-
code
= 147¶
-
-
class
decocare.commands.
ReadProfile_B512
(**kwds)[source]¶ Bases:
decocare.commands.ReadProfile_STD512
-
code
= 148¶
-
-
class
decocare.commands.
ReadLogicLinkIDS
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 149¶
-
-
class
decocare.commands.
Model512Experiment_OP150
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 150¶
-
-
class
decocare.commands.
ReadBGAlarmEnable
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 151¶
-
-
class
decocare.commands.
GuardianSensorSettings
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 209¶
-
-
class
decocare.commands.
GuardianSensorSettings
(**kwds)[source] Bases:
decocare.commands.PumpCommand
-
code
= 209
-
-
class
decocare.commands.
GuardianSensorDemoGraphTimeout
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 210¶
-
-
class
decocare.commands.
GuardianSensorAlarmSilence
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 211¶
-
-
class
decocare.commands.
GuardianSensorRateChangeAlerts
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 212¶
-
-
class
decocare.commands.
ReadSavedSettingsDate
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 193¶
-
-
class
decocare.commands.
ReadBolusReminderEnable
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 197¶
-
-
class
decocare.commands.
ReadBolusReminders
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 198¶
-
-
class
decocare.commands.
ReadFactoryParameters
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 199¶
-
-
class
decocare.commands.
ReadCalibrationFactor
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 156¶
-
-
class
decocare.commands.
ReadVCNTRHistory
(page=None, **kwds)[source]¶ Bases:
decocare.commands.ReadSensorHistoryData
-
code
= 213¶
-
-
class
decocare.commands.
ReadOtherDevicesIDS
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 240¶
-
-
class
decocare.commands.
PumpTraceSelect
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 160¶
-
-
class
decocare.commands.
PumpEnableDetailTrace
(**kwds)[source]¶ Bases:
decocare.commands.PumpTraceSelect
-
params
= [1]¶
-
-
class
decocare.commands.
PumpDisableDetailTrace
(**kwds)[source]¶ Bases:
decocare.commands.PumpTraceSelect
-
params
= [0]¶
-
-
class
decocare.commands.
Experiment_OP161
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 161¶
-
-
class
decocare.commands.
Experiment_OP162
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 162¶
-
-
class
decocare.commands.
Model511_Experiment_OP119
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 119¶
-
-
class
decocare.commands.
Model511_Experiment_OP120
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 120¶
-
-
class
decocare.commands.
Model511_Experiment_OP121
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 121¶
-
-
class
decocare.commands.
Model511_Experiment_OP122
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 122¶
-
-
class
decocare.commands.
Model511_Experiment_OP123
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 123¶
-
-
class
decocare.commands.
Model511_Experiment_OP124
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 124¶
-
-
class
decocare.commands.
Model511_Experiment_OP125
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 125¶
-
-
class
decocare.commands.
Model511_Experiment_OP126
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 126¶
-
-
class
decocare.commands.
Model511_Experiment_OP127
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 127¶
-
-
class
decocare.commands.
Model511_Experiment_OP128
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 128¶
-
-
class
decocare.commands.
Model511_Experiment_OP129
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 129¶
-
-
class
decocare.commands.
Model511_Experiment_OP130
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 130¶
-
-
class
decocare.commands.
SelectBasalProfile
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 74¶
-
-
class
decocare.commands.
SelectBasalProfileSTD
(**kwds)[source]¶ Bases:
decocare.commands.SelectBasalProfile
-
params
= [0]¶
-
-
class
decocare.commands.
SelectBasalProfileA
(**kwds)[source]¶ Bases:
decocare.commands.SelectBasalProfile
-
params
= [1]¶
-
-
class
decocare.commands.
SelectBasalProfileB
(**kwds)[source]¶ Bases:
decocare.commands.SelectBasalProfile
-
params
= [2]¶
-
-
class
decocare.commands.
PumpExperiment_OP69
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 69¶
-
-
class
decocare.commands.
PumpExperiment_OP70
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 70¶
-
-
class
decocare.commands.
PumpExperiment_OP71
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 71¶
-
-
class
decocare.commands.
PumpExperiment_OP72
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 72¶
-
-
class
decocare.commands.
PumpExperiment_OP73
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 73¶
-
-
class
decocare.commands.
PumpExperiment_OP75
(**kwds)[source]¶ Bases:
decocare.commands.PumpCommand
-
code
= 75¶
-
Download¶
History¶
history
Module¶
This module provides some basic helper/formatting utilities, specifically targeted at decoding ReadHistoryData data.
-
class
decocare.history.
AlarmPump
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
head_length
= 4¶
-
opcode
= 6¶
-
-
class
decocare.history.
AlarmSensor
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
Glucose sensor alarms. The second byte of the head represents the alarm type. The third byte contains an alarm-specific value.
For example, a “Low Glucose” alarm type is: [
0x0b, # 11: Opcode 0x66, # 102: Low glucose subtype 0x50 # 80: Glucose level (For a pump configured to mg/dL)]
-
alarm_types
= {112: 'Weak Signal', 113: 'Lost Sensor', 115: 'Low Glucose Predicted', 101: 'High Glucose', 102: 'Low Glucose', 104: 'Meter BG Now', 105: 'Cal Reminder', 106: 'Calibration Error', 107: 'Sensor End'}¶
-
head_length
= 3¶
-
opcode
= 11¶
-
-
class
decocare.history.
BGReceived
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 3¶
-
opcode
= 63¶
-
-
class
decocare.history.
BasalProfileStart
(head, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 3¶
-
opcode
= 123¶
-
-
class
decocare.history.
Battery
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 26¶
-
-
class
decocare.history.
BigBolusWizardChange
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 143¶
-
opcode
= 90¶
-
-
class
decocare.history.
BolusWizard512
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 12¶
-
opcode
= 47¶
-
-
class
decocare.history.
ChangeAlarmNotifyMode
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 0¶
-
opcode
= 99¶
-
-
class
decocare.history.
ChangeAudioBolus
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 95¶
-
-
class
decocare.history.
ChangeBGReminderEnable
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 96¶
-
-
class
decocare.history.
ChangeBasalProfile_new_profile
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 145¶
-
opcode
= 9¶
-
-
class
decocare.history.
ChangeBasalProfile_old_profile
(head, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 145¶
-
opcode
= 8¶
-
-
class
decocare.history.
ChangeBolusWizardSetup
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 40¶
-
opcode
= 79¶
-
-
class
decocare.history.
ChangeCaptureEventEnable
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 131¶
-
-
class
decocare.history.
ChangeMaxBasal
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 44¶
-
-
class
decocare.history.
ChangeMazaheri2e
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 100¶
-
opcode
= 46¶
-
-
class
decocare.history.
ChangeOtherDeviceID
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 30¶
-
opcode
= 125¶
-
-
class
decocare.history.
ChangeParadigmLinkID
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 14¶
-
opcode
= 60¶
-
-
class
decocare.history.
ChangeRemoteID
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 39¶
-
-
class
decocare.history.
ChangeTempBasalType
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 98¶
-
-
class
decocare.history.
ChangeTime
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 23¶
-
-
class
decocare.history.
ChangeTimeDisplay
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 100¶
-
-
class
decocare.history.
ChangeWatchdogMarriageProfile
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 5¶
-
opcode
= 129¶
-
-
class
decocare.history.
ClearAlarm
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 12¶
-
-
class
decocare.history.
ConnectDevicesOtherDevicesEnabled
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 124¶
-
-
class
decocare.history.
DeleteOtherDeviceID
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 5¶
-
opcode
= 130¶
-
-
class
decocare.history.
EnableDisableRemote
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 14¶
-
opcode
= 38¶
-
-
class
decocare.history.
HistoryPage
(raw, model)[source]¶ Bases:
decocare.history.PagedData
-
class
decocare.history.
Ian50
(head, model, **kwds)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 30¶
-
opcode
= 80¶
-
-
class
decocare.history.
Ian54
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 57¶
-
opcode
= 84¶
-
-
class
decocare.history.
Ian69
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 2¶
-
opcode
= 105¶
-
-
class
decocare.history.
IanA8
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
head_length
= 10¶
-
opcode
= 168¶
-
-
class
decocare.history.
JournalEntryExerciseMarker
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
Capture Event > Exercise marker
-
body_length
= 1¶
-
opcode
= 65¶
-
-
class
decocare.history.
JournalEntryMealMarker
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
Capture Event > Meal marker
-
body_length
= 2¶
-
opcode
= 64¶
-
-
class
decocare.history.
JournalEntryOtherMarker
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
Capture Event > Other
-
body_length
= 0¶
-
opcode
= 67¶
-
-
class
decocare.history.
LowBattery
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 25¶
-
-
class
decocare.history.
LowReservoir
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
>>> rec = LowReservoir( LowReservoir._test_1[:2] ) >>> decoded = rec.parse(LowReservoir._test_1) >>> print str(rec) LowReservoir 2012-12-07T11:02:43 head[2], body[0] op[0x34]
>>> print pformat(decoded) {'amount': 20.0}
-
opcode
= 52¶
-
-
class
decocare.history.
Model522ResultTotals
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 40¶
-
date_length
= 2¶
-
head_length
= 1¶
-
opcode
= 109¶
-
-
class
decocare.history.
NewTimeSet
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 24¶
-
-
class
decocare.history.
OldBolusWizardChange
(head, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 117¶
-
opcode
= 90¶
-
-
class
decocare.history.
PagedData
(raw, model)[source]¶ Bases:
object
PagedData - context for parsing a page of cgm data.
-
class
decocare.history.
PumpResume
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 31¶
-
-
class
decocare.history.
PumpSuspend
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 30¶
-
-
class
decocare.history.
ResultDailyTotal
(head, larger=False)[source]¶ Bases:
decocare.records.base.InvalidRecord
On 722 this seems like two records.
-
date_length
= 2¶
-
head_length
= 5¶
-
opcode
= 7¶
-
-
class
decocare.history.
Rewind
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 33¶
-
-
class
decocare.history.
Sara6E
(head, larger=False)[source]¶ Bases:
decocare.history.Model522ResultTotals
Seems specific to 722?
-
body_length
= 48¶
-
opcode
= 110¶
-
-
class
decocare.history.
SelectBasalProfile
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 20¶
-
-
class
decocare.history.
SetAutoOff
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 27¶
-
-
class
decocare.history.
SetBolusWizardEnabled
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 45¶
-
-
class
decocare.history.
SettingSomething57
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 87¶
-
-
class
decocare.history.
TempBasal
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 1¶
-
opcode
= 51¶
-
-
class
decocare.history.
TempBasalDuration
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 22¶
-
-
class
decocare.history.
UnabsorbedInsulin512
(head, model=None)[source]¶ Bases:
decocare.records.bolus.UnabsorbedInsulinBolus
-
opcode
= 48¶
-
-
decocare.history.
decode_remote_id
(msg)[source]¶ practice decoding some remote ids:
0x270x01 0xe2 0x400x03 0x42 0x2a0x28 0x0c 0x890x92 0x00 0x00 0x00>>> decode_remote_id(_remote_ids[0]) '123456'
>>> decode_remote_id(_remote_ids[1]) '213546'
>>> decode_remote_id(_remote_ids[2]) '821650'
-
class
decocare.history.
hack51
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 81¶
-
-
class
decocare.history.
hack52
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 82¶
-
-
class
decocare.history.
hack53
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 1¶
-
opcode
= 83¶
-
-
class
decocare.history.
hack55
(head, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 85¶
-
-
class
decocare.history.
hack56
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
body_length
= 5¶
-
opcode
= 86¶
-
-
class
decocare.history.
old6c
(head, model, **kwds)[source]¶ Bases:
decocare.history.Model522ResultTotals
-
opcode
= 108¶
-
-
decocare.history.
parse_record
(fd, head=bytearray(b''), larger=False, model=None)[source]¶ Given a file-like object, and the head of a record, parse the rest of the record. Look up the type of record, read in just enough data to parse it, return the result.
-
class
decocare.history.
questionable22
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 34¶
-
-
class
decocare.history.
questionable23
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 35¶
-
-
class
decocare.history.
questionable24
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 36¶
-
-
class
decocare.history.
questionable3b
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 59¶
-
-
class
decocare.history.
questionable5e
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 94¶
-
-
class
decocare.history.
questionable61
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 97¶
-
-
class
decocare.history.
questionable65
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 101¶
-
-
class
decocare.history.
questionable66
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 102¶
-
-
class
decocare.history.
questionable6f
(head=bytearray(b''), model=None, larger=False)[source]¶ Bases:
decocare.records.base.KnownRecord
-
opcode
= 111¶
-
lib¶
Sundry stuff to make working with data easier.
lib
Module¶
This module provides some basic helper/formatting utilities.
>>> hexdump( bytearray( [0x00] ) )
'0000 0x00 .'
>>> 0x00 == HighByte( 0x0F )
True
>>> 0x0F == LowByte( 0x0F )
True
>>> CRC16CCITT.compute( bytearray( [ 2, 6, 6, 3 ] ) )
16845
>>> CRC16CCITT.compute( bytearray( [ 0x02, 0x09, 0x00,
... 0x05, 0x0D, 0x02, 0x03 ] ) )
29146
>>> BangInt( bytearray( [ 0x71, 0xDA ] ) )
29146
>>> BangInt( bytearray( [ 0x62, 0xC2 ] ) ) == CRC16CCITT.compute( bytearray( [ 2, 0x06, 0x08, 3 ] ) )
True
>>> CRC8.compute( bytearray( [ 0x00, 0xFF, 0x00 ] ) )
177
>>> BangInt( bytearray( [ 0x02, 0X02 ] ) )
514
>>> BangLong( bytearray( [ 0x0, 0X0, 0x02, 0x02 ] ) )
514L
-
class
decocare.lib.
CRC16CCITT
[source]¶ -
-
lookup
= [0, 4129, 8258, 12387, 16516, 20645, 24774, 28903, 33032, 37161, 41290, 45419, 49548, 53677, 57806, 61935, 4657, 528, 12915, 8786, 21173, 17044, 29431, 25302, 37689, 33560, 45947, 41818, 54205, 50076, 62463, 58334, 9314, 13379, 1056, 5121, 25830, 29895, 17572, 21637, 42346, 46411, 34088, 38153, 58862, 62927, 50604, 54669, 13907, 9842, 5649, 1584, 30423, 26358, 22165, 18100, 46939, 42874, 38681, 34616, 63455, 59390, 55197, 51132, 18628, 22757, 26758, 30887, 2112, 6241, 10242, 14371, 51660, 55789, 59790, 63919, 35144, 39273, 43274, 47403, 23285, 19156, 31415, 27286, 6769, 2640, 14899, 10770, 56317, 52188, 64447, 60318, 39801, 35672, 47931, 43802, 27814, 31879, 19684, 23749, 11298, 15363, 3168, 7233, 60846, 64911, 52716, 56781, 44330, 48395, 36200, 40265, 32407, 28342, 24277, 20212, 15891, 11826, 7761, 3696, 65439, 61374, 57309, 53244, 48923, 44858, 40793, 36728, 37256, 33193, 45514, 41451, 53516, 49453, 61774, 57711, 4224, 161, 12482, 8419, 20484, 16421, 28742, 24679, 33721, 37784, 41979, 46042, 49981, 54044, 58239, 62302, 689, 4752, 8947, 13010, 16949, 21012, 25207, 29270, 46570, 42443, 38312, 34185, 62830, 58703, 54572, 50445, 13538, 9411, 5280, 1153, 29798, 25671, 21540, 17413, 42971, 47098, 34713, 38840, 59231, 63358, 50973, 55100, 9939, 14066, 1681, 5808, 26199, 30326, 17941, 22068, 55628, 51565, 63758, 59695, 39368, 35305, 47498, 43435, 22596, 18533, 30726, 26663, 6336, 2273, 14466, 10403, 52093, 56156, 60223, 64286, 35833, 39896, 43963, 48026, 19061, 23124, 27191, 31254, 2801, 6864, 10931, 14994, 64814, 60687, 56684, 52557, 48554, 44427, 40424, 36297, 31782, 27655, 23652, 19525, 15522, 11395, 7392, 3265, 61215, 65342, 53085, 57212, 44955, 49082, 36825, 40952, 28183, 32310, 20053, 24180, 11923, 16050, 3793, 7920]¶
-
-
class
decocare.lib.
CRC8
[source]¶ -
-
lookup
= [0, 155, 173, 54, 193, 90, 108, 247, 25, 130, 180, 47, 216, 67, 117, 238, 50, 169, 159, 4, 243, 104, 94, 197, 43, 176, 134, 29, 234, 113, 71, 220, 100, 255, 201, 82, 165, 62, 8, 147, 125, 230, 208, 75, 188, 39, 17, 138, 86, 205, 251, 96, 151, 12, 58, 161, 79, 212, 226, 121, 142, 21, 35, 184, 200, 83, 101, 254, 9, 146, 164, 63, 209, 74, 124, 231, 16, 139, 189, 38, 250, 97, 87, 204, 59, 160, 150, 13, 227, 120, 78, 213, 34, 185, 143, 20, 172, 55, 1, 154, 109, 246, 192, 91, 181, 46, 24, 131, 116, 239, 217, 66, 158, 5, 51, 168, 95, 196, 242, 105, 135, 28, 42, 177, 70, 221, 235, 112, 11, 144, 166, 61, 202, 81, 103, 252, 18, 137, 191, 36, 211, 72, 126, 229, 57, 162, 148, 15, 248, 99, 85, 206, 32, 187, 141, 22, 225, 122, 76, 215, 111, 244, 194, 89, 174, 53, 3, 152, 118, 237, 219, 64, 183, 44, 26, 129, 93, 198, 240, 107, 156, 7, 49, 170, 68, 223, 233, 114, 133, 30, 40, 179, 195, 88, 110, 245, 2, 153, 175, 52, 218, 65, 119, 236, 27, 128, 182, 45, 241, 106, 92, 199, 48, 171, 157, 6, 232, 115, 69, 222, 41, 178, 132, 31, 167, 60, 10, 145, 102, 253, 203, 80, 190, 37, 19, 136, 127, 228, 210, 73, 149, 14, 56, 163, 84, 207, 249, 98, 140, 23, 33, 186, 77, 214, 224, 123]¶
-
-
decocare.lib.
decodeDC
(msg)[source]¶ >>> decodeDC(_decode_test_1) == bytearray(_decode_result_1) True >>> decodeDC(_decode_test_2) == bytearray(_decode_result_2) True
-
decocare.lib.
encodeDC
(msg)[source]¶ >>> encodeDC(_enc_test_1) == bytearray(_enc_result_1) True >>> encodeDC(_enc_test_2) == bytearray(_enc_result_2) True
-
decocare.lib.
format_filter_date
(date)[source]¶ >>> format_filter_date(parse.date('2014-04-09')) [7, 222, 4, 9]
-
decocare.lib.
hexdump
(src, length=8, indent=0)[source]¶ Return a string representing the bytes in src, length bytes per line.
-
decocare.lib.
makeByte
(highNibble, lowNibble)[source]¶ 0 <= highNibble <= 15 0 <= lowNibble <= 15 0 <= result <= 255
-
class
decocare.lib.
parse
[source]¶ -
static
date
(data)[source]¶ >>> parse.date( '2010-11-10T01:46:00' ).isoformat( ) '2010-11-10T01:46:00'
>>> parse.date( '2010-11-10 01:46:00' ).isoformat( ) '2010-11-10T01:46:00'
>>> parse.date( '2010-11-10 01:46PM' ).isoformat( ) '2010-11-10T13:46:00'
>>> parse.date( '2010-11-10 13:46' ).isoformat( ) '2010-11-10T13:46:00'
>>> parse.date( '2010-11-10 1:46AM' ).isoformat( ) '2010-11-10T01:46:00'
-
static
decocare¶
decocare Package¶
decocare
Package¶
decocare - a pure python module for serial communication with insulin pumps.
This module implements the communication protocol necessary to audit or command MM insulin pumps. Tested with 515, and 522.
See:
errors
Module¶
-
exception
decocare.errors.
AckError
[source]¶ Bases:
decocare.errors.StickError
-
exception
decocare.errors.
BadDeviceCommError
[source]¶ Bases:
decocare.errors.AckError
tests
Module¶
-
class
decocare.records.tests.
BW722
(head, model=None)[source]¶ Bases:
decocare.records.bolus.BolusWizard
-
class
decocare.records.tests.
TestSaraBolus
[source]¶ -
bolus_1_ok
= {'bg': 103, 'bg_target_low': 100, 'sensitivity': 60, 'bg_target_high': 120, 'unabsorbed_insulin_total': 0.5, 'correction_estimate': 0, 'unabsorbed_insulin_count': 2, 'carb_ratio': 12, 'food_estimate': 1, 'carb_input': 13, 'bolus_estimate': 1}¶
-
bw_1_bytes
= bytearray(b'[g\xa1Q\x0e\x04\r\rP\x00x<d\x00\x00(\x00\x00\x14\x00(x')¶
-
bw_2_bytes
= bytearray(b'[\xfc\xb7T\x0f\x04\r\x00P\x00x<dX\x00\x00\x00\x00\x1c\x00<x')¶
-
cal_bg_bytes
= bytearray(b'\n\xfc\xb4T/\x04\r')¶
-
csv_breakdown
= '\n 9/4/13 14:17:33,,,,,,,Normal,1.0,1.0,,,,,,,,,,,,,,,,,,,,,BolusNormal\n "AMOUNT=1\n CONCENTRATION=null\n PROGRAMMED_AMOUNT=1\n ACTION_REQUESTOR=pump\n ENABLE=true\n IS_DUAL_COMPONENT=false\n UNABSORBED_INSULIN_TOTAL=0.5"\n 11345487207,52554138,86,Paradigm Revel - 723\n\n 9/4/13 14:17:33,,,,,,,,,,,,,,,1.0,120,100,12,60,13,103,0,1,0.5,,,,,,BolusWizardBolusEstimate,"BG_INPUT=103\n BG_UNITS=mg dl\n CARB_INPUT=13\n CARB_UNITS=grams\n CARB_RATIO=12\n INSULIN_SENSITIVITY=60\n BG_TARGET_LOW=100\n BG_TARGET_HIGH=120\n BOLUS_ESTIMATE=1\n CORRECTION_ESTIMATE=0\n FOOD_ESTIMATE=1\n UNABSORBED_INSULIN_TOTAL=0.5\n UNABSORBED_INSULIN_COUNT=2\n ACTION_REQUESTOR=pump"\n 11345487208,52554138,87,Paradigm Revel - 723\n\n 9/4/13 14:17:33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UnabsorbedInsulin,"BOLUS_ESTIMATE_DATUM=11345487208\n INDEX=0\n AMOUNT=1.7\n RECORD_AGE=121\n INSULIN_TYPE=null\n INSULIN_ACTION_CURVE=180"\n 11345487209,52554138,88,Paradigm Revel - 723\n\n 9/4/13 14:17:33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UnabsorbedInsulin,"BOLUS_ESTIMATE_DATUM=11345487208\n INDEX=1\n AMOUNT=1.5\n RECORD_AGE=331\n INSULIN_TYPE=null\n INSULIN_ACTION_CURVE=180"\n 11345487210,52554138,89,Paradigm Revel - 723\n\n 9/4/13 15:20:52,,,,,,,,,,,,,,,,,,,,,,,,,,252,,,,CalBGForPH,"AMOUNT=252, ACTION_REQUESTOR=pump"\n 11345487206,52554138,85,Paradigm Revel - 723\n\n 9/4/13 15:20:55,,,,,,,Normal,1.5,1.5,,,,,,,,,,,,,,,,,,,,,BolusNormal,"AMOUNT=1.5\n CONCENTRATION=null\n PROGRAMMED_AMOUNT=1.5\n ACTION_REQUESTOR=pump\n ENABLE=true\n IS_DUAL_COMPONENT=false\n UNABSORBED_INSULIN_TOTAL=0.7"\n 11345487201,52554138,80,Paradigm Revel - 723\n\n 9/4/13 15:20:55,,,,,,,,,,,,,,,1.5,120,100,12,60,0,252,2.2,0,0.7,,,,,,BolusWizardBolusEstimate,"BG_INPUT=252\n BG_UNITS=mg dl\n CARB_INPUT=0\n CARB_UNITS=grams\n CARB_RATIO=12\n INSULIN_SENSITIVITY=60\n BG_TARGET_LOW=100\n BG_TARGET_HIGH=120\n BOLUS_ESTIMATE=1.5\n CORRECTION_ESTIMATE=2.2\n FOOD_ESTIMATE=0\n UNABSORBED_INSULIN_TOTAL=0.7\n UNABSORBED_INSULIN_COUNT=3\n ACTION_REQUESTOR=pump"\n 11345487202,52554138,81,Paradigm Revel - 723\n\n 9/4/13 15:20:55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UnabsorbedInsulin,"BOLUS_ESTIMATE_DATUM=11345487202\n INDEX=0\n AMOUNT=1\n RECORD_AGE=64\n INSULIN_TYPE=null\n INSULIN_ACTION_CURVE=180"\n 11345487203,52554138,82,Paradigm Revel - 723\n\n 9/4/13 15:20:55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UnabsorbedInsulin,"BOLUS_ESTIMATE_DATUM=11345487202\n INDEX=1\n AMOUNT=1.7\n RECORD_AGE=184\n INSULIN_TYPE=null\n INSULIN_ACTION_CURVE=180"\n 11345487204,52554138,83,Paradigm Revel - 723\n\n 9/4/13 15:20:55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UnabsorbedInsulin,"BOLUS_ESTIMATE_DATUM=11345487202\n INDEX=2\n AMOUNT=1.5\n RECORD_AGE=394\n INSULIN_TYPE=null\n INSULIN_ACTION_CURVE=180"\n 11345487205,52554138,84,Paradigm Revel - 723\n 9/4/13 16:11:57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,CurrentSensorMissedDataTime,TIME=1800000,11345487185,52554138,64,Paradigm Revel - 723\n '¶
-
hexdump
= '\n 5b 67\n a1 51 0e 04 0d\n 0d 50 00 78\n 3c 64 00 00 28 00 00 14 00 28 78\n 5c 08 44 79 c0 3c 4b d0\n 01 00 28 00 28 00 14 00\n a1 51 4e 04 0d\n 0a fc\n b4 54 2f 04 0d\n 5b fc\n b7 54 0f 04 0d\n 00 50 00 78\n 3c 64 58 00 00 00 00 1c 00 3c 78\n 5c 0b 28 40 c0 44 b8 c0 3c 8a d0\n 01 00 3c 00 3c 00 1c 00\n b7 54 4f 04 0d\n '¶
-
-
decocare.records.tests.
big_days
(x=0)[source]¶ # page 17, RECORD 11 >>> parse_date( big_days(0) ).isoformat( ) ‘2012-11-20T21:53:41’
# page 17, ~ RECORD 12 >>> parse_date( big_days(1) ).isoformat( ) ‘2012-11-20T22:07:38’
>>> parse_date( big_days(2) ).isoformat( ) '2012-11-20T21:53:41'
>>> parse_date( big_days(3) ).isoformat( ) '2012-11-20T22:07:38'
# page 16, RECORD ~15 >>> parse_date( big_days(4) ).isoformat( ) ‘2012-11-25T16:41:34’
>>> parse_date( big_days(5) ).isoformat( ) '2012-11-25T13:54:32'
# page 15 >>> parse_date( big_days(6) ).isoformat( ) ‘2012-11-29T20:25:37’
# page 0 >>> parse_date( big_days(7) ).isoformat( ) ‘2012-12-20T14:59:02’
>>> parse_date( big_days(8) ).isoformat( ) '2012-12-20T15:28:25'
Modules¶
Each module can be run and tested indepdently. They will refuse to run if the tests do not pass.
Modules¶
The decocare Package package implements the Medtronic Carelink protocol, sometimes known as ComLink2. The implementation is built using python modules as building blocks, each module allowing us to prove some specific part of the protocol.
Decoding-carelink implements a python module named decocare. The python module allows learning more about how Medtronic Insulin pumps and related devices work.
Note
This information was gleaned through extensive testing and analysis of the behavior of actual devices, not from documentation. Please call and ask your vendor for the technical information needed to properly maintain these projects.