Author Topic: open-EE-workbench, a cross-compatible interface for equipment & testing  (Read 497 times)

RoGeorge, Obin and 16 Guests are viewing this topic.

Online ObinTopic starter

  • Regular Contributor
  • *
  • Posts: 52
  • Country: be
  • Hi
I've been building something that got a bit out of hand... as it goes  :) Its a VISA-based automation framework for lab instruments and wanted to share it with the community for some feedback/requests to improve it.

The problem: I have several desks with different brands of equipment. VISA/SCPI is supposed to be cross-compatible but in reality that's hardly the case aside from *IDN and the basics. On top of that, I teach a class and it's often a hassle to tell students "No you FIRST have to install NI-VISA BEFORE installing IOsuite!" So this is my attempt at a cross-compatible abstraction layer that allows you to control your equipment from the same place without making any adjustments. No bulky downloads, no bloatware, no bickering about licenses, ... just Python :). Also, it contains a set of pre-made tests you can run using any equipment you might have connected. Works from CLI for the basics, but the GUI is overall a nicer experience. (I kept the CLI because its fairly quick in spotting which devices are connected)

A short AI generated description:

  What it is

 open-EE-workbench is a free, open-source GUI and scripting framework for automating electronic test
  equipment — oscilloscopes, power supplies, AWGs, DMMs, SMUs, and electronic loads. It runs on Windows,
  Linux, and macOS. No vendor software required.

  It's built on PyVISA/PyVISA-py, so it works with USB, Ethernet, and serial instruments without needing
  proprietary drivers.

  What it can do

  The GUI has four main areas:

  - Workbench — live instrument control in one view. Connect your bench, and you get cards for each
  instrument with real-time controls and readback. Save/load/reset instrument state snapshots.
  - Automation — ready-made parametric tests: DC sweep (single, simultaneous, nested), PSU interrupt
  transient capture, AC frequency sweep (Bode magnitude), DMM logger, and waveform analysis.
  - Plot Specific — tests that produce standard datasheet-style curves directly: Static Characteristic (IV
  curves) and Transfer Characteristic for BJT/FET devices, with a live canvas during the sweep.
  - Sandbox — a no-code pipeline editor where you define sweep loops and actions (Set, Measure, Wait, Wait
  for State) across any combination of instruments. Build custom parametric tests without writing Python.

  There are also standalone CLI scripts for screenshots, sweeps, and waveform analysis that work without the
  GUI.

  Instrument coverage

  The SCPI command database (eewBackbone) currently covers 69 families across 15 vendors, including Keysight,
   Rigol, Rohde & Schwarz, Tektronix, Siglent, Agilent, GW Instek, Korad, BK Precision, AIM-TTI, Fluke,
  Hantek, OWON, and Keithley.

  Adding a new instrument is a single JSON entry — no code changes needed.

  Where to get it

  https://github.com/kerstensrobin/open-EE-workbench

  The wiki has setup instructions, parameter references, and screenshots:
  https://github.com/kerstensrobin/open-EE-workbench/wiki

  Why I'm posting

  Two reasons:

  1. If you try it and something doesn't work — wrong measurements, instrument not recognised, a command that
   fails — I'd like to hear about it. Right now it works fairly well across the devices I have access to, but it will be a community effort to make it REALLY compatible with many devices.
  2. If your instrument isn't in the database, feel free to open an issue or reply here with the make/model
  (and *IDN? response if you have it). Adding support is straightforward and I'm happy to do it. There is a dedicated button that opens a Github issue and fills in some stuff already.

  It's very much a work in progress, but it's been stable enough to use daily and I wanted to get it in front of people who might find it useful.

Devices I have already been able to confirm:
Rigol DS1054Z DHO804
Keysight DSOX1204, EDU36311A, EDU33212A, EDUX1052, EDU34450A
Agilent 33220A
Keithley 2231A
Korad KA3005P
Tektronix TBS1000C TDS2012B TDS2012C

And I've scraped many more programming manuals for commands, but experience taught me mileage may vary on the commands acquired by scraping.

Don't really know what to expect when other start using this. But I like it, so I thaught I'd share it and potentially help some others :)
« Last Edit: Yesterday at 08:06:42 am by Obin »
 
The following users thanked this post: RoGeorge

Offline Microcheap

  • Frequent Contributor
  • **
  • Posts: 286
  • Country: 00
Re: open-EE-workbench, a cross-compatible interface for your equipment
« Reply #1 on: June 16, 2026, 04:50:10 am »
Thanks for sharing, that looks promising.

Are you aware of TestConstroller? I think it tried to solve most of the same problems but yours open-EE-workbench seems to have a nicer interface and it has USB support.

I will give it a try. I have a bunch of devices from Hantek, Owon, Rigol, Micsig, Korad and others that I can test with it.
 

Offline JimKnopf

  • Frequent Contributor
  • **
  • Posts: 345
  • Country: 00
Re: open-EE-workbench, a cross-compatible interface for your equipment
« Reply #2 on: June 16, 2026, 07:04:19 am »
I also use TestController sometimes. For repairs, i had the need to display several Cameras and Instruments at the same time for documentation. Microscope and IR-Camera at the same time. Until last month, i used OBS Studio for that. But it was a bit tricky and not all devices can be connected in OBS Studio. I let Claude code an UI that fit all my needs. Now i have a Instrument Bar on top, Microscope view and i can add Scope , IR-Cam or DMM directly on screen.

To me, it seems that the need to use specific software has disappeared since Claude Code came along. The trick is to have an application written exactly the way you want it—without any compromises.

On my (Linux) PC i use this now for repairs
https://github.com/JimKnopfIoT/labcam-pc

and on my SailfishOS phone i use a simliar setup like this
https://github.com/JimKnopfIoT/labcam-phone
 

Online ObinTopic starter

  • Regular Contributor
  • *
  • Posts: 52
  • Country: be
  • Hi
Thanks for sharing, that looks promising.

Are you aware of TestConstroller? I think it tried to solve most of the same problems but yours open-EE-workbench seems to have a nicer interface and it has USB support.

I will give it a try. I have a bunch of devices from Hantek, Owon, Rigol, Micsig, Korad and others that I can test with it.

I've read about it yes, but I haven't personally used it. While I hope to have an equally long list of compatible devices some day, I think there is some difference to the tools. My idea behind open-eew is to make it a good companion for specific tests, hence the PSU interrupts, IV curvers, etc. I hope to expand this part in the future with more tests and some automated calculations. Which, in combination with the SCPI-dialect coverage, would be very interesting for characterization/validation people!

The brands you mentioned I have had not much personal access to, so be sure to let me know the bugs! :)


To me, it seems that the need to use specific software has disappeared since Claude Code came along. The trick is to have an application written exactly the way you want it—without any compromises.

Claude code helped out a lot with this, and I agree that it should be leveraged to just make hyper-personalized tools. By open-sourceing tools like the one I shared, I hope to really speed up the development of other people should they want to make something similar. Because how genius these coding agents might be, it takes a lot of back and forth to make tools like these :D
 

Online RoGeorge

  • Super Contributor
  • ***
  • Posts: 8211
  • Country: ro
Nice projects, thanks!  :-+

Gave it a try this morning on an Kubuntu 22.04 LTS, with three LXI instruments connected over LAN:
- oscilloscope Rigol DS1054Z
- generator Rigol DG4102
- power supply Rigol DP832

Followed the github instructions, it installed OK, nachoVisa sees and all my 3 instruments (each instrument was listed twice, once as TCPIP0::myInstrumentIP::inst0::INSTR, once as TCPIP::myInstrumentIP::INSTR), the open-eew GUI opened, got some open-eew launching errors, too.  ;D

- 1.  open-eew complains for not finding KWallet (which is indeed intentionally disabled on this PC) - why is Kwallet needed/used for in open-eew?

- 2.  [1019177:1019177:0619/075739.586913:ERROR:chrome_browser_cloud_management_controller.cc(163)] Cloud management controller initialization aborted as CBCM is not enabled. - same question, why is this needed (I don't use Chrome browser, and don't have it installed, AFAIK)

- 3.  it seems to open Brave browser, because I get a "please update Brave" popup (which, again, is kept intentionally not updated (Brave is not the default browser, default is LibreWolf).  Also, it tries to open a "Greaselion.json" file from a .config directory for Brave, though I've checked and there is no Greaselion.json at home .config/BraveSoftware/Brave-Browser/blablabla...../1/

- 4.  in the Workbench tab of the GUI, no buttons seems to be working.  For example, if I set 5V and turn on CH1 of the power supply, the .OFF red button representing the channel output turns into a green .ON button, but the power supply doesn't seem to receive any command.  :-\

Same for the other 2 instruments, it looks like they don't receive any commands.  Any suggestions?

Code: [Select]
./open-eew                         
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5173
Press CTRL+C to quit
[app] opened in Chrome app-mode (pid 1019171)
[1019177:1019177:0619/075739.459398:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KWallet.isEnabled: object_path= /modules/kwalletd5: org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
[1019177:1019177:0619/075739.459724:ERROR:kwallet_dbus.cc(107)] Error contacting kwalletd5 (isEnabled)
[1019177:1019177:0619/075739.460891:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KLauncher.start_service_by_desktop_name: object_path= /KLauncher: org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.klauncher was not provided by any .service files
[1019177:1019177:0619/075739.460908:ERROR:kwallet_dbus.cc(79)] Error contacting klauncher to start kwalletd5
[1019177:1019177:0619/075739.582068:ERROR:object_proxy.cc(590)] Failed to call method: org.kde.KWallet.close: object_path= /modules/kwalletd5: org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
[1019177:1019177:0619/075739.582131:ERROR:kwallet_dbus.cc(459)] Error contacting kwalletd5 (close)
[1019177:1019177:0619/075739.586913:ERROR:chrome_browser_cloud_management_controller.cc(163)] Cloud management controller initialization aborted as CBCM is not enabled.
[1019177:1019218:0619/075740.564960:ERROR:dat_file_util.cc(52)] GetDATFileAsString: cannot read dat file ~/.config/BraveSoftware/Brave-Browser/afalakplffnnnlkncjhbmahjfjhmlkal/1.0.1435/1/Greaselion.json
[1019177:1019177:0619/075740.565116:ERROR:greaselion_download_service.cc(280)] Could not obtain Greaselion configuration
127.0.0.1 - - [19/Jun/2026 07:57:40] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /assets/nacho_white.svg HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /ui/socket.io.min.js HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/workbenches HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/workbench/autodetected_workbench_1 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/automation/tests HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:41] "GET /api/automation/tests HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:42] "GET /manifest.json HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 07:57:42] "GET /assets/favicon-32.png HTTP/1.1" 200 -
[1019177:1019276:0619/075743.275536:ERROR:dat_file_util.cc(52)] GetDATFileAsString: cannot read dat file ~/.config/BraveSoftware/Brave-Browser/blablalongblaremovedmanually...../1.0.1465/1/Greaselion.json
[1019177:1019177:0619/075743.306283:ERROR:greaselion_download_service.cc(280)] Could not obtain Greaselion configuration
127.0.0.1 - - [19/Jun/2026 08:37:48] "POST /api/scan HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "POST /api/scan/save HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbenches HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbench/autodetected_workbench_1 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:17] "GET /api/workbench/bench_20260619 HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:38:45] "GET /api/families HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:39:59] "POST /api/awg/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:23] "POST /api/awg/apply HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:43] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:45] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:46] "POST /api/scope/run HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:47] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:48] "POST /api/scope/single HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:49] "POST /api/scope/autoscale HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:40:50] "POST /api/scope/stop HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:13] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:15] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:15] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:16] "POST /api/psu/set HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:33] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:35] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:36] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:42] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:43] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:44] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:45] "POST /api/psu/output HTTP/1.1" 200 -
127.0.0.1 - - [19/Jun/2026 08:41:47] "POST /api/psu/output HTTP/1.1" 200 -
« Last Edit: Today at 05:57:29 am by RoGeorge »
 

Online RoGeorge

  • Super Contributor
  • ***
  • Posts: 8211
  • Country: ro
Doh, never mind, I didn't press "Connect"!  ;D

Now it works, though I get beeps from the power supply, and the DP832 LCD displays "Remote command is incorrect!".  Is there any place where I can see what SCPI commands are sent to the instruments?

Online ObinTopic starter

  • Regular Contributor
  • *
  • Posts: 52
  • Country: be
  • Hi
Doh, never mind, I didn't press "Connect"!  ;D

Now it works, though I get beeps from the power supply, and the DP832 LCD displays "Remote command is incorrect!".  Is there any place where I can see what SCPI commands are sent to the instruments?

Pressing connect is an important step :D
A lot of equipment has a beep function that needs to be turned of manually somewhere in settings. Currently there is no "behind the scenes" log, but now you mention it, this would be a good addition to help debugging. I will add it as a seperate tab.



- 1.  open-eew complains for not finding KWallet (which is indeed intentionally disabled on this PC) - why is Kwallet needed/used for in open-eew?

- 2.  [1019177:1019177:0619/075739.586913:ERROR:chrome_browser_cloud_management_controller.cc(163)] Cloud management controller initialization aborted as CBCM is not enabled. - same question, why is this needed (I don't use Chrome browser, and don't have it installed, AFAIK)

- 3.  it seems to open Brave browser, because I get a "please update Brave" popup (which, again, is kept intentionally not updated (Brave is not the default browser, default is LibreWolf).  Also, it tries to open a "Greaselion.json" file from a .config directory for Brave, though I've checked and there is no Greaselion.json at home .config/BraveSoftware/Brave-Browser/blablabla...../1/

Regarding chrome: The interface uses HTML for layout and formatting, chromium is used as a way to display the app.
The three messages all come from Brave being used as the app's native window — it's the first Chromium-family browser found on the system, and the app launches it in --app mode to get a frameless window. KWallet and the Cloud Management line are harmless Chromium startup noise (nothing to do with open-EE-workbench). Adding --password-store=basic (just pushed) will silence the KWallet warning. The Brave update popup is Brave's own UI and can't be suppressed by flags — you can ignore it, update Brave, or uninstall Brave and the app will fall back to LibreWolf/system browser automatically.

Thanks for testing!

 
The following users thanked this post: RoGeorge

Online ObinTopic starter

  • Regular Contributor
  • *
  • Posts: 52
  • Country: be
  • Hi
Doh, never mind, I didn't press "Connect"!  ;D

Now it works, though I get beeps from the power supply, and the DP832 LCD displays "Remote command is incorrect!".  Is there any place where I can see what SCPI commands are sent to the instruments?

Few updates:
- the TCP and TCP0 are actually the same adress. I removed the second mention to avoid confusion, it would not have caused issues because the commands are only sent to one, but still, I understand!
- Added an 'SCPI' button in the log that shows all communication between the tool and the equipment. Thanks @RoGeorge for the suggestion!
- Fixed a small issue where the scope-measurements set on the workbench tab would always first set up the measurement and then query the result, which on many devices would have the scope say something along the lines of "measurement already set up!". So now its a one time setup (as long as the number of measurements is smaller than the max number that fit on the screen), and then it queries at a fixed interval.
 

Online RoGeorge

  • Super Contributor
  • ***
  • Posts: 8211
  • Country: ro
Deleted the old install dir (I'm not prolific with git), and installed again.  I don't get the kwallet and the other errors any more, thank you!  :D

Will foul around with it, and post how it went.

Online RoGeorge

  • Super Contributor
  • ***
  • Posts: 8211
  • Country: ro
The power supply still receives something, it beeps and displays "Remote command is incorrect!" on its LCD, though I don't touch anything (and apparently there is nothing sent according to the GUI log panel).  Though, the PSU keeps receiving something it doesn't like.  It is once at each few seconds, and after about a minute the beeps and the err messages stops by themselves.

If I get time, I'll sniff later the LAN packets with wireshark, and let you know what I find.  The other instruments seem just fine, only the power supply reports incorrect remote commands.  :-//

Online ObinTopic starter

  • Regular Contributor
  • *
  • Posts: 52
  • Country: be
  • Hi
The power supply still receives something, it beeps and displays "Remote command is incorrect!" on its LCD, though I don't touch anything (and apparently there is nothing sent according to the GUI log panel).  Though, the PSU keeps receiving something it doesn't like.  It is once at each few seconds, and after about a minute the beeps and the err messages stops by themselves.

If I get time, I'll sniff later the LAN packets with wireshark, and let you know what I find.  The other instruments seem just fine, only the power supply reports incorrect remote commands.  :-//

I think I found the bug. The workbench view updates the voltages of the PSU's every few seconds, but it scanned for 4 channels by default. My guess is your Rigol did not like the polling of an not-existing channel.
They did not appear in the SCPI log because these additional commands might flood the log. But I added a 'incl. polling traffic' option to REALLY see everything that's going on :D

A fix is now on github (if that was the issue :)
 
The following users thanked this post: RoGeorge

Online RoGeorge

  • Super Contributor
  • ***
  • Posts: 8211
  • Country: ro
- is there a button to connect only a given instrument, not the whole workbench?  Asking because, if I restart the PSU (turn it on/off), then it will lose the connection and don't take any commands, while the workbench button says "Connected" (and greyed, does nothing if pressed).  Same if an instrument is turned on later.  How do I connect to the newly turned on intrument?

- the label ON/OFF on some buttons is confusing.  For example, if I press in the Workbench the button "Output: OFF" for the AWG channel 1, in practice it turns ON the AWG output (not OFF, as the button label says).  Then, the button label changes to "Output ON".  So now, pressing "Output: ON" button, will in fact turn OFF the output.

The normal expectation for a button label is to indicate what action that button will perform, not the current state of the instrument.  I would expect to see the current state either as a separate label, or maybe a toggle ON/OFF form, instead of a press button?

Same for the power supply.  I press a button that says "OFF", and in fact it turns that channel on.  That's confusing, particularly if the instrument is at a remote location and you can not see its physical front panel.

Even worst, If I have already ON only one or two (out of the 3 available) channels on the power supply, and want to emergency turn off all power (because some circuits may emit magic smoke  ;D), normally I will press "All ON/OFF" button from the physical panel of the PSU.  But on the GUI, if I emergency press the button that says "ALL OFF", in fact that will turn on all 3 channels instead of stopping everything.  :scared:


I understand the button label indicates the instrument status, and the color changes too, but I still found that very confusing.  Not sure what method would be better.  Maybe a separate label for status, or maybe a toggle button instead of a press button, I don't know.


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf