Skippy SCPI Device Server: Failed Recipe for adding Fluke SuperDaq 1586A
I am trying to add a Temperature Scanner Fluke SuperDaq 1586A to the skippylib and skippy device server but ran into some error.
My device server is running on Nvidia Jetson Nano (Arm64)
Here is what I did:
1. Git clone Skippy from https://github.com/srgblnch/skippy
2. For testing , adding fluke1586a.py to skippylib/instructions/multimeter with this content:
3. Adding to skippylib/identify.py
raise EnvironmentError("Fluke %s model not supported" % (model))
4. Rebuild and install skippylib with: sudo python setup.py install
5. Test with a python console:
from skippylib import Skippy
skippyObj = Skippy(name='192.168.1.239', port=3490, nChannels=40, terminator = '\r\n')
DEBUG: State change from UNKNOWN to INIT
DEBUG: New status message: 'The device is in INIT state.\nInitializing…\n'
DEBUG: identified '192.168.1.239' as host name
DEBUG: building a communication to 192.168.1.239 by socket using port 3490
DEBUG: State change from INIT to OFF
DEBUG: New status message: 'The device is in OFF state.\n'
DEBUG: Standby() called from OFF
DEBUG: > BySocket._send(*args: ('*IDN?\n',))
DEBUG: < BySocket._send: None
DEBUG: > BySocket._recv()
DEBUG: In _recv() read complete 41 bytes
DEBUG: < BySocket._recv: FLUKE,1586A,37770022,1.04+1.02+20130618
INFO: In connect() instrument identification: 'FLUKE,1586A,37770022,1.04+1.02+20130618'
DEBUG: State change from OFF to STANDBY
DEBUG: New status message: 'The device is in STANDBY state.\n'
DEBUG: On() called from STANDBY
ERROR: 192.168.1.239 identification error: Fluke 1586a model not supported (*IDN?:'FLUKE,1586A,37770022,1.04+1.02+20130618')
DEBUG: State change from STANDBY to UNKNOWN
DEBUG: New status message: 'The device is in UNKNOWN state.\n'
DEBUG: New status message: "The device is in UNKNOWN state.\nidentification error: Fluke 1586a model not supported (*IDN?:'FLUKE,1586A,37770022,1.04+1.02+20130618')\n"
WARN: Failed to go to the On state
6. with Skippy Device Server i got an error:
('——-> Received a DevFailed exception:', DevFailed(args = (DevError(desc = "ValueError: invalid literal for int() with base 10: ''\n", origin = ' File "/usr/lib/python2.7/dist-packages/tango/device_class.py", line 568, in __DeviceClass__device_factory\n device = self._new_device(deviceImplClass, klass, dev_name)\n File "/usr/lib/python2.7/dist-packages/tango/device_class.py", line 547, in __DeviceClass__new_device\n return klass(dev_class, dev_name)\n File "/home/fisenstest/skippy/skippy/skippy.py", line 471, in __init__\n Skippy.init_device(self)\n File "/home/fisenstest/skippy/skippy/skippy.py", line 484, in init_device\n self.get_device_properties(self.get_device_class())\n File "/usr/lib/python2.7/dist-packages/tango/device_server.py", line 292, in __DeviceImpl__get_device_properties\n pu.get_device_properties(self, class_prop, self.device_property_list)\n File "/usr/lib/python2.7/dist-packages/tango/device_class.py", line 139, in get_device_properties\n values = self.stringArray2values(prop_value, data_type)\n File "/usr/lib/python2.7/dist-packages/tango/device_class.py", line 258, in stringArray2values\n return seqStr_2_obj(argin, argout_type)\n File "/usr/lib/python2.7/dist-packages/tango/utils.py", line 846, in seqStr_2_obj\n return _seqStr_2_obj_from_type(seq, tg_type)\n File "/usr/lib/python2.7/dist-packages/tango/utils.py", line 856, in _seqStr_2_obj_from_type\n return int(seq)\n', reason = 'PyDs_PythonError', severity = tango._tango.ErrSeverity.ERR),)))
For the model not supported error, it looks like you need to use the lower case model number:
The identifier string gets lowercased here:
For the device server error, it looks like there is a device property in your database with an empty line, so we get "\n" which cannot be converted to an integer. It would be useful if PyTango's error message include the name of the property causing the problem, but it seems to be missing. You'll have to look at each one. From https://github.com/srgblnch/skippy/blob/master/skippy/Skippy.xmi the properties Port, NumChannels and NumFunctions should obviously be numeric. And then the boolean ones like AutoOn, AutoStart, AutoStandby.
Disclaimer: I've never used Skippy, so I'm just guessing here!
Thanks for your prompt pointers.
I will look thru your suggestions to see if I can identify the problems.
I'm back to the office, sorry for not answering before.
For the commands you mention, I assume you are working with master. You get the point about how a new instrument can be included into the discovery by idn. In branch 1.6.0-devel you have two properties, one boolean 'AvoidIDN' and a string 'InstructionsFile' to say directly the instruction file to use.
Using master, anton says is correct: to avoid issues with instruments in the same family with different behaviors, it is case insensitive.
I'm unsure from the logs you placed, but had you in the method 'identidier()' in file 'skippylib/identify.py' added a line like:
In the 'file' dictionary variable. This allows the identifier object to call the newer method you mention.