{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "305e206d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SEC-Node replied with legacy identify reply: SINE2020&ISSE,SECoP,V2019-08-20,v1.0 RC2\n",
      "dilsc ready\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "sys.path.append('/sf/cristallina/applications/frappy')\n",
    "from frappy.client import SecopClient\n",
    "from frappy.core import BUSY, IDLE, ERROR, Parameter, Command, Done\n",
    "\n",
    "# Connect to the dilsc\n",
    "dilsc = SecopClient('dilsc:5000')\n",
    "dilsc.connect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d108c981",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'modules': {'triton': {'accessibles': {'communicate': {'description': 'send a command and receive a reply\\n\\nusing end_of_line, encoding and self._lock\\nfor commands without reply, the command must be joined with a query command,\\nwait_before is respected for end_of_lines within a command.',\n",
       "     'datainfo': {'type': 'command',\n",
       "      'argument': {'type': 'string'},\n",
       "      'result': {'type': 'string'}}},\n",
       "    '_timeout': {'description': 'timeout',\n",
       "     'datainfo': {'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_wait_before': {'description': 'wait time before sending',\n",
       "     'datainfo': {'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_is_connected': {'description': 'connection state',\n",
       "     'datainfo': {'type': 'bool'},\n",
       "     'readonly': False},\n",
       "    'pollinterval': {'description': 'reconnect interval',\n",
       "     'datainfo': {'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_multicomm': {'description': 'communicate multiple request/replies in one row',\n",
       "     'datainfo': {'type': 'command',\n",
       "      'argument': {'type': 'array',\n",
       "       'minlen': 0,\n",
       "       'maxlen': 100,\n",
       "       'members': {'type': 'string'}},\n",
       "      'result': {'type': 'array',\n",
       "       'minlen': 0,\n",
       "       'maxlen': 100,\n",
       "       'members': {'type': 'string'}}}}},\n",
       "   'description': 'connection to triton software',\n",
       "   'implementation': 'secop_psi.mercury.IO',\n",
       "   'interface_classes': ['Module'],\n",
       "   'features': []},\n",
       "  'T_mix': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'mix. chamber temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_pt2head': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'PTR2 head temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_pt2plate': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'PTR2 plate temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_still': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'still temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'htr_still': {'accessibles': {'value': {'description': 'heater output',\n",
       "     'datainfo': {'unit': 'W', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'heater output',\n",
       "     'datainfo': {'unit': 'W', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_controlled_by': {'description': 'source of target value',\n",
       "     'datainfo': {'type': 'enum', 'members': {'self': 0}},\n",
       "     'readonly': True},\n",
       "    '_resistivity': {'description': 'heater resistivity',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True}},\n",
       "   'description': 'still heater',\n",
       "   'implementation': 'secop_psi.triton.HeaterOutput',\n",
       "   'interface_classes': ['Writable'],\n",
       "   'features': []},\n",
       "  'T_coldpl': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'cold plate temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_mixcx': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'mix. chamber cernox',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_pt1head': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'PTR1 head temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_pt1plate': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'PTR1 plate temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'T_pucksensor': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'status determined from convergence checks',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'target value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}},\n",
       "    '_tolerance': {'description': 'absolute tolerance',\n",
       "     'datainfo': {'unit': 'K', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_settling_time': {'description': 'settling time\\n\\ntotal amount of time the value has to be within tolerance before switching to idle.',\n",
       "     'datainfo': {'unit': 'sec', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_timeout': {'description': \"timeout\\n\\ntimeout = 0: disabled, else:\\nA timeout event happens, when the difference abs(<target> - <value>) drags behind\\nthe expected difference for longer than <timeout>. The expected difference is determined\\nby parameters 'workingramp' or 'ramp'. If ramp is not available, an exponential decay of\\nthe difference with <tolerance> as time constant is expected.\\nAs soon as the value is the first time within tolerance, the timeout criterium is changed:\\nthen the timeout event happens after this time + <settling_time> + <timeout>.\",\n",
       "     'datainfo': {'unit': 'sec', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_control_active': {'description': 'control mode',\n",
       "     'datainfo': {'type': 'bool'},\n",
       "     'readonly': True},\n",
       "    '_ctrlpars': {'description': 'pid (proportional band, integral time, differential time',\n",
       "     'datainfo': {'type': 'struct',\n",
       "      'members': {'p': {'unit': 'K', 'min': 0.0, 'type': 'double'},\n",
       "       'i': {'unit': 'min', 'min': 0.0, 'type': 'double'},\n",
       "       'd': {'unit': 'min', 'min': 0.0, 'type': 'double'}}},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'ramp': {'description': 'ramp rate',\n",
       "     'datainfo': {'unit': 'K/min', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_enable_ramp': {'description': 'enable ramp rate',\n",
       "     'datainfo': {'type': 'bool'},\n",
       "     'readonly': False},\n",
       "    'setpoint': {'description': 'working setpoint (differs from target when ramping)',\n",
       "     'datainfo': {'unit': 'K', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'puck sensor temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureLoop',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'htr_pucksensor': {'accessibles': {'value': {'description': 'heater output',\n",
       "     'datainfo': {'unit': 'W', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'heater output',\n",
       "     'datainfo': {'unit': 'W', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_controlled_by': {'description': 'source of target value',\n",
       "     'datainfo': {'type': 'enum', 'members': {'self': 0, 'T_pucksensor': 1}},\n",
       "     'readonly': True},\n",
       "    '_resistivity': {'description': 'heater resistivity',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_limit': {'description': 'max. heater power',\n",
       "     'datainfo': {'unit': 'W', 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'mix. chamber heater',\n",
       "   'implementation': 'secop_psi.triton.HeaterOutputWithRange',\n",
       "   'interface_classes': ['Writable'],\n",
       "   'features': []},\n",
       "  'T_magnet': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'K', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_raw': {'description': 'raw value',\n",
       "     'datainfo': {'unit': 'Ohm', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_filter_time': {'description': 'filter time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_dwell_time': {'description': 'dwell time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 1.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_pause_time': {'description': 'pause time',\n",
       "     'datainfo': {'unit': 'sec', 'min': 3.0, 'max': 200.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'magnet temperature',\n",
       "   'implementation': 'secop_psi.triton.TemperatureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'action': {'accessibles': {'value': {'description': 'running action',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'none': 0, 'condense': 1, 'circulate': 2, 'collect': 3}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'action to do',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'none': 0, 'condense': 1, 'collect': 3}},\n",
       "     'readonly': False}},\n",
       "   'description': 'higher level scripts',\n",
       "   'implementation': 'secop_psi.triton.Action',\n",
       "   'interface_classes': ['Writable'],\n",
       "   'features': []},\n",
       "  'p_dump': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'dump pressure',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'p_cond': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'condenser pressure',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'p_still': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'still pressure',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'p_fore': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'pressure on the pump side',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'p_back': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'pressure on the back side of the pump',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'p_ovc': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'unit': 'mbar', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False}},\n",
       "   'description': 'outer vacuum pressure',\n",
       "   'implementation': 'secop_psi.mercury.PressureSensor',\n",
       "   'interface_classes': ['Readable'],\n",
       "   'features': []},\n",
       "  'V1': {'accessibles': {'value': {'description': 'valve state',\n",
       "     'datainfo': {'type': 'enum', 'members': {'closed': 0, 'opened': 1}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'valve target',\n",
       "     'datainfo': {'type': 'enum', 'members': {'close': 0, 'open': 1}},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}}},\n",
       "   'description': 'valve V1',\n",
       "   'implementation': 'secop_psi.triton.Valve',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'V2': {'accessibles': {'value': {'description': 'valve state',\n",
       "     'datainfo': {'type': 'enum', 'members': {'closed': 0, 'opened': 1}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'valve target',\n",
       "     'datainfo': {'type': 'enum', 'members': {'close': 0, 'open': 1}},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}}},\n",
       "   'description': 'valve V2',\n",
       "   'implementation': 'secop_psi.triton.Valve',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'V4': {'accessibles': {'value': {'description': 'valve state',\n",
       "     'datainfo': {'type': 'enum', 'members': {'closed': 0, 'opened': 1}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'valve target',\n",
       "     'datainfo': {'type': 'enum', 'members': {'close': 0, 'open': 1}},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}}},\n",
       "   'description': 'valve V4',\n",
       "   'implementation': 'secop_psi.triton.Valve',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'V5': {'accessibles': {'value': {'description': 'valve state',\n",
       "     'datainfo': {'type': 'enum', 'members': {'closed': 0, 'opened': 1}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'valve target',\n",
       "     'datainfo': {'type': 'enum', 'members': {'close': 0, 'open': 1}},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}}},\n",
       "   'description': 'valve V5',\n",
       "   'implementation': 'secop_psi.triton.Valve',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'V9': {'accessibles': {'value': {'description': 'valve state',\n",
       "     'datainfo': {'type': 'enum', 'members': {'closed': 0, 'opened': 1}},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'valve target',\n",
       "     'datainfo': {'type': 'enum', 'members': {'close': 0, 'open': 1}},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}}},\n",
       "   'description': 'valve V9',\n",
       "   'implementation': 'secop_psi.triton.Valve',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'ips': {'accessibles': {'communicate': {'description': 'send a command and receive a reply\\n\\nusing end_of_line, encoding and self._lock\\nfor commands without reply, the command must be joined with a query command,\\nwait_before is respected for end_of_lines within a command.',\n",
       "     'datainfo': {'type': 'command',\n",
       "      'argument': {'type': 'string'},\n",
       "      'result': {'type': 'string'}}},\n",
       "    '_timeout': {'description': 'timeout',\n",
       "     'datainfo': {'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_wait_before': {'description': 'wait time before sending',\n",
       "     'datainfo': {'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_is_connected': {'description': 'connection state',\n",
       "     'datainfo': {'type': 'bool'},\n",
       "     'readonly': False},\n",
       "    'pollinterval': {'description': 'reconnect interval',\n",
       "     'datainfo': {'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_multicomm': {'description': 'communicate multiple request/replies in one row',\n",
       "     'datainfo': {'type': 'command',\n",
       "      'argument': {'type': 'array',\n",
       "       'minlen': 0,\n",
       "       'maxlen': 100,\n",
       "       'members': {'type': 'string'}},\n",
       "      'result': {'type': 'array',\n",
       "       'minlen': 0,\n",
       "       'maxlen': 100,\n",
       "       'members': {'type': 'string'}}}}},\n",
       "   'description': 'IPS for magnet',\n",
       "   'implementation': 'secop_psi.mercury.IO',\n",
       "   'interface_classes': ['Module'],\n",
       "   'features': []},\n",
       "  'mf': {'accessibles': {'value': {'description': 'current value of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'type': 'double'},\n",
       "       {'unit': 'T', 'type': 'double'},\n",
       "       {'unit': 'T', 'type': 'double'}]},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'PREPARED': 150,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'PREPARING': 340,\n",
       "         'RAMPING': 370,\n",
       "         'STABILIZING': 380,\n",
       "         'FINALIZING': 390,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'target value of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'min': -0.6, 'max': 0.6, 'type': 'double'},\n",
       "       {'unit': 'T', 'min': -0.6, 'max': 0.6, 'type': 'double'},\n",
       "       {'unit': 'T', 'min': -5.2, 'max': 5.2, 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}},\n",
       "    '_sphere_radius': {'description': 'max. sphere',\n",
       "     'datainfo': {'unit': 'T', 'min': 0.0, 'max': 0.7, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_cylinders': {'description': 'allowed cylinders (list of radius and height)',\n",
       "     'datainfo': {'type': 'array',\n",
       "      'minlen': 1,\n",
       "      'maxlen': 9,\n",
       "      'members': {'type': 'tuple',\n",
       "       'members': [{'unit': 'T', 'min': 0.0, 'max': 0.6, 'type': 'double'},\n",
       "        {'unit': 'T', 'min': 0.0, 'max': 5.2, 'type': 'double'}]}},\n",
       "     'readonly': True}},\n",
       "   'description': 'vector field',\n",
       "   'implementation': 'secop_psi.dilsc.VectorField',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': []},\n",
       "  'mfx': {'accessibles': {'value': {'description': 'magnetic field',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'target value of the module',\n",
       "     'datainfo': {'unit': 'T', 'min': -0.6, 'max': 0.6, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}},\n",
       "    '_limits': {'description': 'user limits',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'type': 'double'},\n",
       "       {'unit': 'T', 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    'ramp': {'description': 'ramp rate for field',\n",
       "     'datainfo': {'unit': 'T/min', 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_tolerance': {'description': 'tolerance',\n",
       "     'datainfo': {'unit': 'T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_trained': {'description': 'trained field (positive)',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'min': -99.0, 'max': 0.0, 'type': 'double'},\n",
       "       {'unit': 'T', 'min': 0.0, 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    '_wait_stable_field': {'description': 'wait time to ensure field is stable',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_action': {'description': 'action',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'hold': 0, 'run_to_set': 1, 'run_to_zero': 2, 'clamped': 3}},\n",
       "     'readonly': False},\n",
       "    'setpoint': {'description': 'field setpoint',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_voltage': {'description': 'leads voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_atob': {'description': 'field to amp',\n",
       "     'datainfo': {'unit': 'A/T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_working_ramp': {'description': 'effective ramp',\n",
       "     'datainfo': {'unit': 'T/min', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_I1': {'description': 'slave 1 current',\n",
       "     'datainfo': {'unit': 'A', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_V1': {'description': 'slave 1 voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_I2': {'description': 'slave 2 current',\n",
       "     'datainfo': {'unit': 'A', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_V2': {'description': 'slave 2 voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True}},\n",
       "   'description': 'magnetic field, x-axis',\n",
       "   'implementation': 'secop_psi.ips_mercury.SimpleField2',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': ['HasLimits'],\n",
       "   'abslimits': [-0.6, 0.6]},\n",
       "  'mfy': {'accessibles': {'value': {'description': 'magnetic field',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'target value of the module',\n",
       "     'datainfo': {'unit': 'T', 'min': -0.6, 'max': 0.6, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}},\n",
       "    '_limits': {'description': 'user limits',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'type': 'double'},\n",
       "       {'unit': 'T', 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    'ramp': {'description': 'ramp rate for field',\n",
       "     'datainfo': {'unit': 'T/min', 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_tolerance': {'description': 'tolerance',\n",
       "     'datainfo': {'unit': 'T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_trained': {'description': 'trained field (positive)',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'min': -99.0, 'max': 0.0, 'type': 'double'},\n",
       "       {'unit': 'T', 'min': 0.0, 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    '_wait_stable_field': {'description': 'wait time to ensure field is stable',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_action': {'description': 'action',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'hold': 0, 'run_to_set': 1, 'run_to_zero': 2, 'clamped': 3}},\n",
       "     'readonly': False},\n",
       "    'setpoint': {'description': 'field setpoint',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_voltage': {'description': 'leads voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_atob': {'description': 'field to amp',\n",
       "     'datainfo': {'unit': 'A/T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_working_ramp': {'description': 'effective ramp',\n",
       "     'datainfo': {'unit': 'T/min', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_I1': {'description': 'slave 1 current',\n",
       "     'datainfo': {'unit': 'A', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_V1': {'description': 'slave 1 voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_I2': {'description': 'slave 2 current',\n",
       "     'datainfo': {'unit': 'A', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_V2': {'description': 'slave 2 voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True}},\n",
       "   'description': 'magnetic field, y axis',\n",
       "   'implementation': 'secop_psi.ips_mercury.SimpleField2',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': ['HasLimits'],\n",
       "   'abslimits': [-0.6, 0.6]},\n",
       "  'mfz': {'accessibles': {'value': {'description': 'magnetic field',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    'status': {'description': 'current status of the module',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'type': 'enum',\n",
       "        'members': {'DISABLED': 0,\n",
       "         'IDLE': 100,\n",
       "         'PREPARED': 150,\n",
       "         'WARN': 200,\n",
       "         'UNSTABLE': 270,\n",
       "         'BUSY': 300,\n",
       "         'PREPARING': 340,\n",
       "         'RAMPING': 370,\n",
       "         'STABILIZING': 380,\n",
       "         'FINALIZING': 390,\n",
       "         'ERROR': 400,\n",
       "         'UNKNOWN': 401}},\n",
       "       {'type': 'string'}]},\n",
       "     'readonly': True},\n",
       "    'pollinterval': {'description': 'default poll interval',\n",
       "     'datainfo': {'min': 0.1, 'max': 120.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'target': {'description': 'target value of the module',\n",
       "     'datainfo': {'unit': 'T', 'min': -5.2, 'max': 5.2, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'stop': {'description': 'cease driving, go to IDLE state',\n",
       "     'datainfo': {'type': 'command'}},\n",
       "    '_limits': {'description': 'user limits',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'type': 'double'},\n",
       "       {'unit': 'T', 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    'ramp': {'description': 'ramp rate for field',\n",
       "     'datainfo': {'unit': 'T/min', 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_tolerance': {'description': 'tolerance',\n",
       "     'datainfo': {'unit': 'T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_trained': {'description': 'trained field (positive)',\n",
       "     'datainfo': {'type': 'tuple',\n",
       "      'members': [{'unit': 'T', 'min': -99.0, 'max': 0.0, 'type': 'double'},\n",
       "       {'unit': 'T', 'min': 0.0, 'type': 'double'}]},\n",
       "     'readonly': False},\n",
       "    '_wait_stable_field': {'description': 'wait time to ensure field is stable',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    'mode': {'description': 'persistent mode',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'DISABLED': 0, 'PERSISTENT': 30, 'DRIVEN': 50}},\n",
       "     'readonly': False},\n",
       "    '_switch_heater': {'description': 'switch heater',\n",
       "     'datainfo': {'type': 'enum', 'members': {'off': 0, 'on': 1}},\n",
       "     'readonly': False},\n",
       "    '_persistent_field': {'description': 'persistent field',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_current': {'description': 'leads current (in units of field)',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_wait_switch_on': {'description': 'wait time to ensure switch is on',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_wait_switch_off': {'description': 'wait time to ensure switch is off',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_wait_stable_leads': {'description': 'wait time to ensure current is stable',\n",
       "     'datainfo': {'unit': 's', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_persistent_limit': {'description': 'above this limit, lead currents are not driven to 0',\n",
       "     'datainfo': {'unit': 'T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': False},\n",
       "    '_action': {'description': 'action',\n",
       "     'datainfo': {'type': 'enum',\n",
       "      'members': {'hold': 0, 'run_to_set': 1, 'run_to_zero': 2, 'clamped': 3}},\n",
       "     'readonly': False},\n",
       "    'setpoint': {'description': 'field setpoint',\n",
       "     'datainfo': {'unit': 'T', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_voltage': {'description': 'leads voltage',\n",
       "     'datainfo': {'unit': 'V', 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_atob': {'description': 'field to amp',\n",
       "     'datainfo': {'unit': 'A/T', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_working_ramp': {'description': 'effective ramp',\n",
       "     'datainfo': {'unit': 'T/min', 'min': 0.0, 'type': 'double'},\n",
       "     'readonly': True},\n",
       "    '_forced_persistent_field': {'description': 'manual indication that persistent field is bad',\n",
       "     'datainfo': {'type': 'bool'},\n",
       "     'readonly': False}},\n",
       "   'description': 'magnetic field, z-axis',\n",
       "   'implementation': 'secop_psi.ips_mercury.Field0',\n",
       "   'interface_classes': ['Drivable'],\n",
       "   'features': ['HasLimits'],\n",
       "   'abslimits': [-5.2, 5.2]}},\n",
       " 'equipment_id': 'dilsc',\n",
       " 'firmware': 'FRAPPY - The Python Framework for SECoP',\n",
       " 'version': '2021.02',\n",
       " 'description': 'triton test'}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dilsc.descriptive_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "db15ead8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((<status.PREPARED (150)>, 'driven'), 1680192078.4629738, None)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dilsc.getParameter('mfz','status')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6102c9b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
